ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Velero 恢复故障排查:从 Restore 的 status 结构到源码级 Debugging 实践

Velero 恢复故障排查:从 Restore 的 status 结构到源码级 Debugging 实践 Velero 恢复故障排查从 Restore 的 status 结构到源码级 Debugging 实践【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/veleroVelero 完成一次 Restore 后即使过程中存在资源冲突或恢复失败Restore 对象的状态也可能显示为“完成”。本文以 Velero 官方文档《Debugging Restores》见 v0.5.0 文档 及其当前版本 main 文档为主体讲清如何从velero restore get的 WARNINGS/ERRORS 列、velero restore describe的分组输出入手定位恢复问题并结合当前仓库源码解释这些状态字段是如何产生与持久化的。读完本文你将掌握一套完整的 Restore 排障路径并理解status中 warnings/errors 计数与对象存储中明细日志之间的分工。一、为什么“Completed”不代表恢复成功Velero 的设计中Restore 结束后的状态并不直接反映过程中遇到的所有问题。原文档v0.5.0对这一点的表述是当 Velero 完成一次 Restore 时其状态会变为“Completed”无论过程中是否出现问题问题的严重程度通过restore get输出中的 WARNINGS 和 ERRORS 两列体现v0.5.0 时代对应命令为ark restore getNAME BACKUP STATUS WARNINGS ERRORS CREATED SELECTOR backup-test-20170726180512 backup-test Completed 155 76 2017-07-26 11:41:14 -0400 EDT none backup-test-20170726180513 backup-test Completed 121 14 2017-07-26 11:48:24 -0400 EDT none backup-test-2-20170726180514 backup-test-2 Completed 0 0 2017-07-26 13:31:21 -0400 EDT none backup-test-2-20170726180515 backup-test-2 Completed 0 1 2017-07-26 13:32:59 -0400 EDT none从源码结构看这种“列式摘要”直接来自 CRD 的 printcolumn 定义。restore_types.go 中的 kubebuilder 注释指定了velero restore get表格列与 JSONPath 的映射关系Status列读取.status.phaseWarnings列读取.status.warnings整数计数Errors列读取.status.errors整数计数Age列读取.metadata.creationTimestamp。这说明表格中的 WARNINGS/ERRORS 只是计数明细必须通过 describe 或 YAML 查看——这正是原文档 Example 一节的操作动机。二、查看告警与错误明细restore describe / -o yaml原文档给出的排查入口是查看完整 YAMLv0.5.0 时代的写法velero restore get backup-test-20170726180512 -o yaml当前仓库的 main 文档 推荐更直观的velero restore describe其输出按“Velero / Cluster / Namespaces”三级分组展示 warnings 与 errorsvelero restore describe backup-test-20170726180512输出示例摘自 main 文档Name: backup-test-20170726180512 Namespace: velero ... Phase: Completed Validation errors: none Warnings: Velero: none Cluster: none Namespaces: velero: serviceaccounts velero already exists serviceaccounts default already exists kube-system: serviceaccounts attachdetach-controller already exists serviceaccounts default already exists ... default: serviceaccounts default already exists Errors: Velero: none Cluster: none Namespaces: nonev0.5.0 文档给出的 YAML 片段则展示了早期status字段的原始形态status: errors: ark: null cluster: null namespaces: null phase: Completed validationErrors: null warnings: ark: null cluster: null namespaces: cm1: - secrets default-token-t0slk already exists两个版本的输出共同点在于三级结构系统级问题、集群级问题、按命名空间分组的问题。差异在于明细的存放位置——下文源码部分会解释这一演进。三、status 结构解析errors 与 warnings 的语义与分组原文档 Structure 一节是全文核心定义了 Restore 状态中两组字段各自的含义语义区分errors出现在不完整或部分失败incomplete or partial restores的恢复中warnings出现在非阻塞性问题中例如恢复整体“正常”、备份引用的资源在集群中都以某种形式存在但其中一部分是预先已存在的资源如示例中的serviceaccounts default already exists。分组结构errors 与 warnings 采用相同结构分组含义Velero早期版本写作arkVelero server 自身遇到的系统相关问题例如无法读取对象存储目录Cluster与集群作用域cluster-scoped资源恢复相关的问题Namespaces从命名空间到该命名空间下资源恢复问题列表的映射map排障时的判读顺序可以是先看Errors是否为空——非空说明有资源真正恢复失败再看Warnings——其中大量already exists类告警通常意味着目标集群并非空环境同名资源已存在Velero 跳过了重复创建一般无需处理最后看Velero分组——一旦出现系统级条目应优先排查对象存储连通性与备份文件完整性因为这会影响本次恢复的可信度。四、源码印证status 字段是如何产生与存储的4.1 当前 API 定义计数在 CR 里明细在对象存储里v0.5 时代 warnings/errors 的完整明细直接嵌在 CR 的status中见上文 YAML 片段。而当前仓库的 restore_types.go 中RestoreStatus的定义已演进为// Warnings is a count of all warning messages that were generated during // execution of the restore. The actual warnings are stored in object storage. // optional Warnings int json:warnings,omitempty // Errors is a count of all error messages that were generated during // execution of the restore. The actual errors are stored in object storage. // optional Errors int json:errors,omitempty // FailureReason is an error that caused the entire restore to fail. // optional FailureReason string json:failureReason,omitempty可以推断这一演进是为了避免大型集群的恢复把成千上万条明细塞进 CR status 触发 API 存储限制CR 内只保留计数、失败原因与进度逐条明细交由对象存储承载velero restore describe在展示时再从存储中读取拼装。同文件中还定义了RestoreProgresstotalItems/itemsRestored以及异步 RestoreItemAction 的restoreItemOperationsAttempted/Completed/Failed三个计数为排查插件操作提供了更细的观测点。4.2 阶段phase全集比“Completed”更多的信息restore_types.go 中RestorePhase的 kubebuilder 枚举注释列出了全部可能阶段New已创建但尚未被控制器处理FailedValidation未通过控制器校验不会执行InProgress正在执行WaitingForPluginOperations/WaitingForPluginOperationsPartiallyFailedK8s 资源恢复结束但异步插件操作仍在进行Finalizing/FinalizingPartiallyFailed主体恢复与插件操作已完成收尾任务finalizer尚未结束Completed无错误地完成PartiallyFailed跑完了但有 1 个以上条目恢复出错Failed恢复根本无法执行失败原因记录在status.failureReason。排障时phase 与 errors 计数需要联合判读Completed且Errors0才算干净恢复PartiallyFailed必须逐条查看 Errors 明细Failed则直接看failureReason如备份不存在、备份存储位置不可用等前置问题长期停留在New/InProgress应转向检查 Velero server Pod 日志与控制器工作队列。4.3 明细的落盘链路RestoreItemOperations 上传对象存储从源码结构看恢复过程中每项资源的处理结果由 restore_operation_map.go 中的RestoreItemOperationsMap统一维护每个 restore 对应一份OperationsForRestore内含Operations列表、ChangesSinceUpdate脏标记与ErrsSinceUpdate当存在未上传的变更时uploadProgress将操作列表 JSON-Gzip 编码后经backupStore.PutRestoreItemOperations(restoreName, ...)上传到备份所在的对象存储。恢复控制器restore_controller.go 中的restoreReconciler在调和时读取并推进这些状态最终汇总为 status 中的计数。这条链路解释了为什么恢复明细是“存储在对象存储”的——它天然跟随备份归档describe输出即为对该存储的读取视图。五、一条可操作的排障清单结合原文档语义定义与上述源码事实建议按以下顺序排查一次有问题的 Restorevelero restore get确认STATUS、WARNINGS、ERRORS三列。ERRORS 为 0 且 phase 为Completed时基本可放行。velero restore describe name按 Velero / Cluster / Namespaces 三级定位问题归属。Velero 分组非空 → 查 server 侧对象存储可读性、Pod 日志Cluster 分组非空 → 查 cluster-scoped 资源RBAC、StorageClass 等的冲突或权限Namespaces 分组非空 → 按命名空间逐条核对already exists、denied等具体信息。需要原始结构时改用velero restore get name -o yaml对照 restore_types.go 中RestoreStatus各字段phase、validationErrors、failureReason、progress、restoreItemOperations*计数、hookStatus。若 phase 为FailedValidationvalidationErrors会直接给出原因如备份名不存在、备份未完成若为Failed看failureReason。插件类问题异步 RestoreItemAction 超时、部分失败对照restoreItemOperationsAttempted/Completed/Failed三个计数与spec.itemOperationTimeout默认 4 小时见 restore_types.go 注释判断是否需要调大超时或检查插件实现。六、小结《Debugging Restores》给出的核心方法论并未随版本改变Restore 的 phase 只表达“流程是否走完”真正的问题信息分散在 WARNINGS/ERRORS 计数与按 Velero/Cluster/Namespaces 分组的明细中。与 v0.5.0 文档相比当前实现把明细从 CR status 迁移到了对象存储RestoreStatus中仅保留计数与failureReason逐条记录通过 RestoreItemOperations 上传至备份归档但restore describe的三级分组输出形态得以保留。掌握“先列后 describe、先 phase 后明细、先 Velero 分组后业务分组”的排查顺序再结合 restore_types.go 与 restore_controller.go 的源码结构即可对任何一次 Velero 恢复做出准确诊断。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进