备份这件事,平时没人惦记,出事的时候所有人都在盯着你。Velero 作为 Kubernetes 生态里最常用的备份与迁移工具,日常跑得好好的,一旦备份失败、恢复卡住、快照对不上,排查起来往往比搭一套新集群还费劲。我处理过不少 Velero 相关的故障,发现大多数人的问题不在于不会用,而在于出问题之后不知道该看哪里——日志翻半天,事件刷一屏,最后还是在猜。这篇内容就是围绕 Velero 故障排查这条线展开的,从velero debug调试包怎么读、凭证配置为什么总是踩坑、指标暴露了哪些隐藏信号,到几个反复出现的已知问题从源码层面怎么理解,我都会按实际排查顺序讲清楚。适合已经在用 Velero 做备份恢复、但遇到报错时缺乏系统排查思路的运维和平台同学,也适合刚接手备份体系、想提前把坑摸一遍的人。读完你至少能做到:拿到一个 Velero 故障,知道第一步该收集什么、第二步该验证什么、第三步该往哪个方向深挖。
1. 先搞清楚 Velero 的故障面到底铺在哪几层
排查 Velero 之前,脑子里得先有一张分层图,否则你会在错误的地方浪费时间。Velero 不是一个单体进程,它由几个协作组件构成,故障可能出现在任意一层,而每一层的表现和排查入口都不一样。我习惯把它拆成五层来看:客户端层(CLI 与调试包)、控制面层(velero Deployment 与控制器逻辑)、插件层(对象存储与卷快照插件)、凭证与权限层(Secret、IAM、RBAC)、以及被备份对象层(Kubernetes 资源本身的状态)。这个分层不是为了好看,而是决定了你拿到一个报错时,第一反应应该去哪个方向找证据。
1.1 五层故障面的划分与各自的典型症状
客户端层的问题最容易被误判成服务端问题。比如velero backup create命令返回错误,很多人第一反应是集群里 Velero 挂了,实际上可能只是本地 kubeconfig 指向了错误的 context,或者 CLI 版本和服务端版本差了好几个小版本导致 API 不兼容。这一层的典型症状是:命令直接报参数错误、连接错误、版本不匹配,但集群里的 Velero Pod 日志干干净净。
控制面层是 Velero 的核心,veleroDeployment 里的控制器负责调度备份、恢复、定时任务、垃圾回收等所有协调逻辑。这一层出问题的典型症状是备份一直卡在InProgress、定时备份不触发、恢复任务排队不动。排查入口是控制器日志和 Backup/Restore 自定义资源的状态字段。
插件层负责真正把数据写到对象存储、调用云厂商接口做卷快照。这一层的问题最隐蔽,因为控制器日志里往往只显示"插件返回错误",具体原因藏在插件自己的日志或者云服务端的响应里。典型症状是备份部分完成(PartiallyFailed)、快照创建超时、对象存储上传中断。
凭证与权限层是踩坑重灾区。Secret 里的密钥过期、IAM 角色权限不足、RBAC 少了某个 verb,都会导致备份在某个环节静默失败或者报 403。这一层的麻烦在于,错误信息经常被包装得很模糊,比如只告诉你"access denied",不告诉你是哪个资源、哪个操作被拒。
被备份对象层指的是你要备份的那些 Kubernetes 资源本身。有些资源天生就难备份,比如带 finalizer 的资源、大规模 CRD、状态频繁变化的资源。这一层的问题表现为备份内容缺失、恢复后资源状态不对。
1.2 为什么分层比直接翻日志更高效
我见过太多人一上来就kubectl logs -f盯着控制器日志刷,刷了半小时没头绪。原因很简单:控制器日志是全局的,它同时记录着备份、恢复、GC、定时任务的所有动作,信息密度低,噪音大。分层之后,你可以先根据症状把范围缩小到某一两层,再针对性地去看那一层的专属证据。比如备份卡在 InProgress,你先看 Backup 资源的 status 里 phase 和 progress 字段,如果 progress 显示已经采集完资源但卡在上传,那基本可以锁定插件层或凭证层,控制器日志只需要看上传阶段那几行就够了。
分层还有一个好处是帮你判断"这个问题是不是我能修的"。客户端层和凭证层的问题通常改配置就能解决;控制面层的问题可能需要重启或升级;插件层的问题可能要联系云厂商或者改插件参数;被备份对象层的问题往往需要调整备份策略甚至改应用本身。判断清楚归属,才能决定是当场修还是绕过去。
1.3 一张对照表把症状映射到排查入口
下面这张表是我自己排查时常用的速查对照,症状在左,优先排查层和入口在右。实际用的时候不用严格按顺序,但至少能让你少走弯路。
| 典型症状 | 优先怀疑层 | 第一排查入口 |
|---|---|---|
| 命令直接报错、连不上 | 客户端层 | kubeconfig context、CLI 与服务端版本 |
| 备份长期 InProgress | 控制面层/插件层 | Backup status 的 progress 字段、控制器日志 |
| 备份 PartiallyFailed | 插件层/凭证层 | 插件日志、云服务端响应、Secret 有效期 |
| 恢复卡住或资源缺失 | 控制面层/被备份对象层 | Restore status、资源 finalizer、CRD 规模 |
| 定时备份不触发 | 控制面层 | Schedule 资源状态、控制器日志中的调度记录 |
| 报 403/access denied | 凭证与权限层 | Secret 内容、IAM 策略、RBAC 绑定 |
| 快照创建超时 | 插件层 | 云厂商 API 限流、快照插件配置 |
这张表不是万能钥匙,但它能帮你在一分钟内把排查方向定下来,而不是盲目翻日志。接下来几节我会按这个分层,把每一层最值得深挖的排查手段讲透。
2. velero debug 调试包:别只生成不读,里面全是线索
velero debug是 Velero 官方提供的诊断信息收集命令,它会打包控制器日志、CRD 状态、Pod 描述、事件等一大堆信息到一个压缩包里。很多人知道这个命令,但生成完压缩包就放在那儿了,或者解压之后不知道从哪看起。实际上这个调试包是排查 Velero 故障性价比最高的入口,因为它把分散在各处的证据一次性收齐了,你不需要一条条命令去捞。
2.1 调试包里到底装了什么,按什么顺序读
解压velero debug生成的包之后,目录结构大致包含这几类内容:logs/下是控制器和相关 Pod 的日志,resources/下是 Backup、Restore、Schedule、BackupStorageLocation、VolumeSnapshotLocation 等自定义资源的 YAML 导出,describe/下是 Pod 和节点的 describe 输出,还有 events 和版本信息。读的顺序我建议是:先看resources/里的资源状态,再看logs/里的控制器日志,最后看describe/和 events 补充上下文。
为什么先看资源状态?因为资源状态是"结果",日志是"过程"。你先知道哪个 Backup 失败了、失败在哪个 phase、status 里有没有 message,再去日志里搜对应的备份名字,就能精准定位到那一段过程,而不是从头翻到尾。比如你看到某个 Backup 的 status.phase 是 PartiallyFailed,status 里可能还带着 errors 计数,这时候你带着这个备份的名字去日志里 grep,几秒钟就能找到报错行。
describe/目录的价值在于补充 Pod 层面的信息。如果控制器 Pod 本身有重启、OOMKilled、调度失败,资源状态和日志里未必体现得清楚,但 describe 输出里一目了然。events 则能帮你看到集群层面发生了什么,比如节点压力驱逐、存储卷挂载失败,这些都可能间接导致 Velero 工作异常。
2.2 用资源状态字段快速定位失败阶段
Velero 的 Backup 资源 status 里有几个字段特别值得盯:phase、progress、errors、warnings、validationErrors。phase告诉你整体状态(New、InProgress、Completed、PartiallyFailed、Failed 等),progress告诉你采集了多少资源、还剩多少,errors和warnings是计数,validationErrors则是备份开始前的校验失败原因。
我排查时有个习惯:先看validationErrors。如果这个字段非空,说明备份根本没真正开始,问题出在参数或前置条件上,比如 BackupStorageLocation 不可用、卷快照位置配置错误。这种情况下去翻控制器日志里备份执行阶段的记录是白费功夫,因为压根没执行到那一步。progress字段则能帮你判断卡点:如果 itemsBackedUp 一直不涨,说明采集阶段就卡住了;如果采集完了但 phase 还是 InProgress,说明卡在上传或快照阶段。
Restore 资源的 status 类似,重点看phase、errors、warnings,以及restoreResults里记录的冲突和跳过项。恢复场景里经常出现资源已存在导致的冲突,这些会记在 warnings 里,不一定是致命错误,但需要你判断是否符合预期。
2.3 日志里的关键行怎么 grep 才不遗漏
调试包里的控制器日志通常很长,直接看会淹没在信息里。我的做法是分三轮 grep。第一轮按资源名字搜,把和当前故障对象相关的所有行捞出来;第二轮按错误关键词搜,比如error、failed、timeout、denied、not found;第三轮按插件名字搜,因为插件层的错误往往带着插件标识。
# 第一轮:按备份名字定位 grep -i "backup-name-here" velero-controller.log # 第二轮:按错误关键词扫 grep -iE "error|failed|timeout|denied|forbidden" velero-controller.log # 第三轮:按插件标识定位 grep -iE "object-store|volume-snapshot|plugin" velero-controller.log三轮下来,基本能把一次故障的完整链路拼出来。要注意的是,日志里的错误有时候是"果"不是"因",比如你看到大量上传超时,真正的原因可能是凭证过期导致每次请求都被拒后重试到超时。所以看到错误行之后,要往前翻几行看上下文,确认这个错误是首次出现还是重试产生的。
提示:
velero debug默认收集的日志有时间窗口限制,如果故障发生得比较早,记得用--log-since参数把窗口拉长,否则关键日志可能已经被轮转掉了。
2.4 调试包的隐私与体积问题,生成前要想清楚
调试包里包含资源 YAML 和日志,里面可能有 Secret 的引用、存储桶名字、内部地址等信息。在把调试包发给外部或者上传到工单系统之前,务必先自己过一遍,把敏感字段脱敏。这不是小题大做,我见过有人直接把调试包甩到公开渠道求助,结果暴露了内部存储配置。
体积方面,大规模集群的调试包可能很大,因为资源 YAML 和日志量都不小。如果只是排查单个备份问题,可以用--item之类的参数缩小收集范围(具体参数随版本略有差异,以你所用版本的帮助输出为准),避免生成一个几百兆的包还得慢慢传。生成之前先velero debug --help看一眼当前版本支持哪些过滤参数,这个习惯能省不少事。
3. 凭证与权限:Velero 故障里最高频的隐形杀手
如果说 Velero 故障里有哪一类最让人抓狂,凭证与权限问题绝对排第一。原因是它的错误表现往往很模糊,日志里可能只有一句 access denied,既不告诉你是哪个资源,也不告诉你是读还是写被拒。更麻烦的是,这类问题经常是"昨天还好好的,今天突然不行了",让人误以为是 Velero 本身出了 bug。
3.1 凭证过期的几种典型表现与验证方法
凭证过期最常见的表现是备份突然开始 PartiallyFailed,而且失败集中在需要访问对象存储或快照服务的环节。控制器日志里会出现认证失败、签名不匹配、token 过期之类的错误。这时候不要急着怀疑 Velero 版本或者插件 bug,先去验证凭证本身还有没有效。
验证方法取决于你用的是什么凭证形式。如果是静态密钥,最直接的办法是用同样的密钥手动调一次对象存储的 API 或者用云厂商 CLI 做一次列举操作,看是否被拒。如果是基于角色的临时凭证,要检查角色信任关系和有效期。我一般会在集群里起一个临时 Pod,挂上同样的 Secret,跑一条最简单的列举命令,这样能排除掉"Velero 代码路径特殊"的干扰,直接验证凭证本身。
这里有个容易忽略的点:凭证可能不是"完全失效",而是"部分失效"。比如读权限还在但写权限没了,或者对某个特定前缀的权限被收窄了。这种半失效状态在日志里表现得更隐蔽,因为列举操作成功会让你误以为凭证没问题,直到上传阶段才报错。所以验证的时候要覆盖 Velero 实际用到的所有操作:列举、读取、写入、删除。
3.2 IAM 策略与 RBAC 的最小权限陷阱
最小权限原则是对的,但落地的时候经常把权限收得太紧,导致 Velero 某个不常用的操作被拒。对象存储这边,Velero 需要的不只是上传和下载,还包括列举桶内容、读取对象元数据、有时还需要删除旧备份做垃圾回收。快照这边,创建、删除、描述快照以及查询快照状态都是必需的。如果策略里漏了其中某一项,平时可能不报错,一到特定场景(比如 GC 触发、或者恢复时需要读快照元数据)就失败。
RBAC 这边同理。Velero 的服务账号需要对它管理的那些资源类型有相应权限,包括自定义资源本身、Pod、PVC、PV、各类工作负载资源,以及 events 的读写。有些团队为了安全把 RBAC 收得很窄,结果 Velero 在备份某些资源时静默跳过,日志里只有 warning 没有 error,很容易被忽略。
排查这类问题的办法是对照官方文档里的权限清单,逐项核对你实际授予的策略。更实用的办法是看日志里被拒的具体操作和资源,反推缺了哪条权限。云厂商的审计日志在这里特别有用,它能告诉你哪个 API 调用被拒、用的什么身份、请求的什么资源,比 Velero 自己的日志精确得多。
3.3 多命名空间与多集群场景下的凭证隔离
当 Velero 需要跨多个命名空间甚至多个集群工作时,凭证管理会变得复杂。单集群多命名空间场景下,如果 Velero 用的是集群级服务账号,通常不会有隔离问题;但如果用了命名空间级的配置,就要注意每个命名空间下的 Secret 是否都正确。我遇到过一种情况:主命名空间的凭证更新了,但某个业务命名空间下还留着一份旧的 Secret 副本,导致那个命名空间的备份一直失败,而其他命名空间正常,排查时很容易被"大部分正常"的表象误导。
多集群场景下,每个集群的 Velero 实例通常有自己独立的凭证和存储位置配置。这里的关键是确认每个集群的 BackupStorageLocation 指向正确、凭证对应正确。跨集群恢复时,目标集群的 Velero 需要能读到源集群写入的备份数据,这要求两边的存储配置兼容。如果源集群用的是某个前缀,目标集群配置的前缀不一致,就会出现"备份明明存在但恢复时找不到"的怪现象。
注意:更新凭证之后,记得重启 Velero 控制器 Pod,或者至少确认它重新加载了 Secret。有些部署方式下 Secret 是以环境变量注入的,不重启不会生效,这个细节坑过不少人。
3.4 凭证轮换期间如何避免备份中断
凭证轮换是安全合规的常规操作,但轮换时机选不好会直接打断正在进行的备份。稳妥的做法是:先确认当前没有正在运行的备份或恢复任务,再更新凭证,然后立刻做一次小规模的手动备份验证,确认新凭证可用之后再恢复定时任务。如果业务不允许备份中断,可以考虑双凭证过渡——先让新凭证生效但保留旧凭证一段时间,确认新凭证工作正常后再撤销旧的。
轮换之后一定要验证,不能只看 Secret 更新成功就完事。验证要覆盖读和写两个方向:读方向做一次备份列表查询,写方向做一次小规模备份并确认对象真的写到了存储里。只验证一个方向是不够的,我见过只验证了读、结果写权限没配好,下一次定时备份直接失败的案例。
4. 指标与监控:把"事后排查"变成"事前发现"
Velero 暴露的指标是很多人忽略的一块。大家习惯出了问题去看日志,但日志是事后证据,指标能帮你在问题恶化之前就发现苗头。Velero 的指标通过控制器运行时的指标端点暴露,默认在控制器的 metrics 端口上,内容涵盖备份成功率、备份时长、资源数量、队列状态等。
4.1 Velero 暴露了哪些值得盯的指标
值得重点关注的指标大致分几类。第一类是备份和恢复的结果类指标,记录成功、失败、部分失败的数量,这类指标能直接反映健康度。第二类是时长类指标,记录备份和恢复耗时,耗时突然拉长往往意味着存储变慢或者数据量激增。第三类是队列和并发类指标,反映控制器处理任务的排队情况,队列持续积压说明处理能力跟不上或者有任务卡住。第四类是资源数量类指标,记录每次备份采集的资源数,数量骤降可能意味着权限问题导致部分资源被跳过。
这些指标单独看意义不大,要结合历史趋势看。比如备份耗时从十分钟涨到一小时,单看一次可能只是数据变多了,但如果是持续上涨,就要怀疑存储性能退化或者网络问题。再比如备份资源数突然从几千掉到几百,那基本可以确定有资源被跳过了,得去查权限或者资源过滤配置。
4.2 用 Prometheus 规则把异常提前暴露出来
光有指标不够,得有告警规则把异常翻译成可行动的信号。我一般会配几条基础规则:备份连续失败超过阈值告警、备份时长超过历史均值一定倍数告警、备份资源数为零告警、控制器队列积压超过阈值告警。这些规则不需要很复杂,关键是覆盖住"备份体系整体失效"和"备份质量下降"两类场景。
配置规则的时候要注意避免误报。比如备份时长告警,如果业务本身有周期性的大备份,用固定阈值就会误报,这时候用相对历史均值的倍数更稳。再比如资源数为零告警,要排除掉那些本来就只备份少量资源的场景,否则天天响。规则调优是个持续过程,先粗后细,跑一段时间再根据实际告警质量调整。
4.3 指标和日志的联动排查思路
指标负责"发现异常",日志负责"解释异常",两者联动才能高效定位。举个实际场景:告警提示某次备份耗时异常拉长,你去看指标发现是上传阶段耗时占比最大,这时候再去日志里搜这次备份的上传相关记录,就能快速定位到是存储端限流还是网络抖动。如果只看日志,你可能要翻很久才能意识到问题集中在上传阶段;如果只看指标,你知道有问题但不知道具体原因。
我习惯在排查时同时开着指标面板和日志检索,指标指方向,日志给细节。对于反复出现的问题,还可以把指标异常和日志里的特定错误模式关联起来,形成经验映射,下次看到同类指标异常就能直接跳到对应的日志关键词。
5. 几个反复出现的已知问题,从源码逻辑理解它为什么发生
Velero 有一些问题是社区里反复被提到的,表面看是 bug,深究下去往往是设计取舍或者边界条件没处理好。理解这些问题的源码逻辑,能帮你在遇到时快速判断是绕过还是等待修复,也能帮你在设计备份策略时提前规避。
5.1 备份卡在 InProgress 不动的常见根因
备份卡在 InProgress 是最常见的求助场景之一。从控制器逻辑看,备份流程大致是:校验前置条件、发现要备份的资源、逐个采集资源、上传数据、创建快照、更新状态。卡住的位置不同,根因也不同。如果卡在采集阶段,常见原因是某个资源的 list 或 get 操作被阻塞,比如 API Server 压力大、某个 CRD 的转换 webhook 无响应。如果卡在上传阶段,常见原因是对象存储端限流、网络不通、凭证失效导致重试耗尽。
从源码角度理解,控制器的备份流程是有超时和重试机制的,但某些环节的超时设置比较宽松,导致表面上"卡住"实际上是在慢慢重试。遇到这种情况,先看 Backup status 的 progress 字段判断卡在哪个阶段,再结合控制器日志里的重试记录确认。如果是重试导致的慢,通常等下去会出结果(成功或最终失败);如果是真的死锁或阻塞,那就需要重启控制器或者排查上游依赖。
5.2 恢复时资源冲突与 finalizer 导致的卡死
恢复场景里,资源已存在导致的冲突很常见。Velero 默认的策略是遇到已存在的资源就跳过并记 warning,但如果资源带有 finalizer,情况会复杂一些。带 finalizer 的资源在删除时会卡住,恢复过程中如果涉及删除重建,就可能因为 finalizer 一直不释放而卡死。这类问题的表现是 Restore 一直 InProgress,日志里能看到某个资源在等待删除完成。
理解这个问题的关键在于分清"恢复"和"删除重建"的区别。Velero 恢复时不一定删除已有资源,具体行为取决于恢复策略和资源是否存在。如果确实需要删除重建,而资源又有 finalizer 且对应的控制器不工作,就会卡住。排查时要找到卡住的具体资源,看它的 finalizer 是什么、对应的控制器是否正常运行。解决办法通常是手动处理 finalizer 或者调整恢复策略。
5.3 大规模资源备份时的性能瓶颈与规避
资源规模上去之后,Velero 的性能瓶颈会显现。从源码逻辑看,备份过程中控制器需要逐个处理资源,虽然有一定并发,但并发度受限于配置和 API Server 的承受能力。大规模 CRD、海量小对象、频繁变化的资源都会拖慢备份。表现是备份耗时随资源数增长非线性上升,甚至出现超时。
规避思路有几个方向:一是用资源过滤减少不必要的备份范围,比如排除掉那些可以重建的、或者由其他机制保障的资源;二是调整控制器的并发相关配置,在 API Server 能承受的前提下提高处理速度;三是把大备份拆成多个小备份,按命名空间或资源类型分开跑,降低单次备份的压力。这些调整都要结合实际集群规模来,没有放之四海皆准的参数。
5.4 版本升级后行为变化的兼容性坑
Velero 跨版本升级时,行为变化导致的兼容性问题不少见。比如某个版本调整了默认的备份行为、改了 CRD 的字段、或者对插件接口做了不兼容变更。升级之后如果没仔细看变更说明,很容易出现"升级前好好的,升级后备份失败"的情况。
我的建议是升级前先读目标版本的变更记录,重点关注 CRD 变更、默认行为变更、插件接口变更这三类。升级时先在非生产环境验证一轮完整备份恢复流程,确认没问题再上生产。升级后如果出问题,第一反应是对照变更记录找可疑点,而不是盲目回滚——有时候只是某个配置项需要跟着调整,回滚反而会引入新问题。
6. 把排查流程固化成可复用的检查清单
排查能力再强,每次从头来也累。我习惯把反复用到的排查步骤固化成清单,遇到故障按清单走一遍,既不容易遗漏,也能在团队里传递。下面这份清单是我自己用的版本,你可以根据实际环境增删。
6.1 故障发生后的前十分钟该做什么
前十分钟的目标是"定性",不是"定位"。第一步,确认故障范围:是单个备份失败还是所有备份都失败,是备份问题还是恢复问题,是新出现还是反复出现。第二步,看资源状态:Backup 或 Restore 的 phase、progress、errors、validationErrors。第三步,生成调试包并做第一轮 grep。这三步做完,基本能判断问题属于哪一层,接下来才是深挖。
这个阶段最忌讳的是直接动手改配置。我见过有人一看到备份失败就去改凭证、改参数,结果把原本能复现的问题改得面目全非,反而增加了排查难度。先收集证据,再动手,这个顺序不能乱。
6.2 按层排查的检查项清单
下面这份清单按前面讲的五层组织,每层列出最值得检查的项。实际排查时不需要全查,根据定性结果挑相关的层查即可。
| 层级 | 检查项 | 判断标准 |
|---|---|---|
| 客户端层 | kubeconfig context、CLI 版本、服务端版本 | context 指向正确集群,版本差异在兼容范围内 |
| 控制面层 | 控制器 Pod 状态、重启次数、资源状态字段 | Pod Running 无频繁重启,status 字段无异常 |
| 插件层 | 插件日志、云服务端响应、限流情况 | 无持续报错,无限流触发 |
| 凭证权限层 | Secret 有效期、IAM 策略、RBAC 绑定 | 凭证有效,权限覆盖读写删全操作 |
| 被备份对象层 | 资源 finalizer、CRD 规模、资源变化频率 | 无卡死 finalizer,规模在可控范围 |
清单的价值在于标准化,让不同的人排查同一个问题能得到相近的结论。团队里如果有多人负责备份,统一清单能减少沟通成本。
6.3 排查记录怎么写才有复用价值
排查完一个问题,记录方式决定了它以后还有没有用。我写排查记录的习惯是:现象、证据、根因、修复、验证五段式。现象写清楚什么时间什么对象出了什么错;证据写清楚看了哪些日志、哪些指标、哪些资源状态;根因写清楚最终定位到的原因;修复写清楚改了什么;验证写清楚怎么确认修好了。
这样的记录积累多了,就形成团队自己的知识库。下次遇到类似现象,先搜记录,往往能直接找到方向,省去大量重复劳动。记录里尤其要写清楚"当时排除了哪些可能",因为排除过程往往比结论更有复用价值。
7. 一些踩过之后才明白的经验
排查 Velero 故障这件事,工具和流程是一方面,经验是另一方面。有些东西文档里不会写,只有实际踩过才知道。我挑几个印象深的说说。
第一个经验是关于"看起来正常"的陷阱。Velero 的很多故障不是非黑即白的,备份显示 Completed 不代表备份真的可用。我遇到过备份状态正常但恢复时发现关键资源缺失的情况,原因是备份时某些资源被静默跳过,日志里只有 warning。所以定期做恢复演练比盯着备份状态更重要,备份的价值只有在恢复成功那一刻才被验证。
第二个经验是关于日志时间戳的坑。Velero 控制器日志的时间戳和集群事件的时间戳可能有时差,排查跨组件问题时如果对不上时间,很容易把因果关系搞反。我的做法是统一用 UTC 时间对照,并且在记录里明确标注时区。
第三个经验是关于"改配置前先备份配置"。Velero 本身的配置、CRD、相关的 Secret 和 RBAC,在动手调整之前先导出一份。我见过调整参数之后把 Velero 搞挂、又忘了原来配置是什么的情况,恢复起来很麻烦。导出配置这个动作花不了几分钟,但关键时刻能救命。
第四个经验是关于社区信息的甄别。Velero 的已知问题在社区里通常有讨论,但信息质量参差不齐。看的时候要注意区分"和我版本一致的问题"和"旧版本已修复的问题",也要注意区分"官方确认的 bug"和"个人配置错误导致的误报"。最可靠的做法是对照自己版本的源码和变更记录,而不是直接照搬别人的解决方案。
最后一个经验是关于心态。备份系统的故障往往带着紧迫感,因为大家担心数据安全。但越急越要按流程来,先定性再定位,先收集再动手。慌乱中改配置、重启服务,经常把小问题搞成大问题。把排查流程固化成清单,就是为了在压力下也能保持条理。