Velero 恢复结果调试完全指南读懂 Restore 的 Warnings 与 Errors【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero导读在 Velero其前身 Heptio Ark中Restore 的 Phase 变为 Completed 并不代表恢复过程零问题——大量非致命异常会被记录为 Warnings真正导致资源缺失的问题则记为 Errors两者都会反映在velero restore get的计数列中。本文以官方文档 debugging-restores 为主体结合当前仓库源码系统讲解如何通过velero restore get与velero restore describe定位恢复过程中的异常并深入剖析 Warnings/Errors 的分层结构Velero / Cluster / Namespaces及其底层实现机制。读完本文你将能够快速从海量恢复日志中定位根因区分可忽略的既有资源冲突与必须处理的恢复失败。一、先看结论Completed 不等于一切正常按照 debugging-restores 文档的描述该文档面向 Heptio Ark 0.6 时代对应现在的 Velero只要 Restore 流程执行完成其状态就会变为Completed无论过程中是否出现 Warnings 或 Errors。真正的异常数量体现在ark restore get现在为velero restore get输出中的WARNINGS与ERRORS两列NAME 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从上表可以看到四种典型情形Warnings 155 / Errors 76恢复完成但伴随大量异常说明备份中的大量资源与目标集群既有状态冲突或存在缺失Warnings 121 / Errors 14同样问题重重但程度略轻Warnings 0 / Errors 0干净利落的恢复两个文件都属于backup-test-2其中一个零问题、一个存在 1 个 ErrorWarnings 0 / Errors 1有且仅有 1 个错误——这种孤立错误往往是排查的关键突破口。这些计数列并非 CLI 凭空生成而是直接来自 Restore 对象的 status 字段。在 pkg/apis/velero/v1/restore_types.go 中RestoreStatus明确定义了Warnings与Errors两个整型计数其注释特别强调真正的警告/错误明细并不存放在 K8s 对象中而是存储在对象存储object storage里。CLI 列表时展示的只是计数明细需要额外的下载操作——这正是下一节describe命令的价值所在。二、深入细节restore describe是排查主战场计数只能告诉你有多少问题无法告诉你是什么问题。文档给出的方法是使用 describe 子命令查看单个 Restore 的完整画像ark restore describe backup-test-20170726180512在当前 Velero 中对应命令为velero restore describe restore-name输出结构如下来自文档原始示例Name: backup-test-20170726180512 Namespace: heptio-ark Labels: none Annotations: none Backup: backup-test Namespaces: Included: * Excluded: none Resources: Included: serviceaccounts Excluded: nodes Cluster-scoped: auto Namespace mappings: none Label selector: none Restore PVs: auto Phase: Completed Validation errors: none Warnings: Ark: none Cluster: none Namespaces: heptio-ark: serviceaccounts ark already exists serviceaccounts default already exists kube-public: serviceaccounts default already exists kube-system: serviceaccounts attachdetach-controller already exists serviceaccounts certificate-controller already exists serviceaccounts cronjob-controller already exists serviceaccounts daemon-set-controller already exists serviceaccounts default already exists serviceaccounts deployment-controller already exists serviceaccounts disruption-controller already exists serviceaccounts endpoint-controller already exists serviceaccounts generic-garbage-collector already exists serviceaccounts horizontal-pod-autoscaler already exists serviceaccounts job-controller already exists serviceaccounts kube-dns already exists serviceaccounts namespace-controller already exists serviceaccounts node-controller already exists serviceaccounts persistent-volume-binder already exists serviceaccounts pod-garbage-collector already exists serviceaccounts replicaset-controller already exists serviceaccounts replication-controller already exists serviceaccounts resourcequota-controller already exists serviceaccounts service-account-controller already exists serviceaccounts service-controller already exists serviceaccounts statefulset-controller already exists serviceaccounts ttl-controller already exists default: serviceaccounts default already exists Errors: Ark: none Cluster: none Namespaces: none对这份输出需要关注几个要点Phase: Completed阶段正常流程完整执行Validation errors: noneRestore 请求本身通过了校验如 Backup 名称存在、资源过滤器合法等说明问题发生在执行阶段而非请求校验阶段Warnings 里Ark与Cluster均为noneVelero 服务器自身没有系统级问题集群级资源如 CRD、Namespace 本身也没有异常Warnings 集中在Namespaces下几乎全部是serviceaccounts xxx already exists——这些是 Kubernetes 集群的默认/系统 ServiceAccountdefault、kube-dns、各 controller 的 SA 等它们在任何标准集群中都必然存在。备份中包含它们、恢复时又试图创建于是产生了已存在的警告。值得注意的是现代版本中describe输出里对应文档中Ark:一节已改名为Velero:见下文结构一节且顶层字段还包括Restore PVs、Namespace mappings、Label selector等 restore 规格信息用于帮助你确认本次恢复的作用范围。三、Warnings 与 Errors 的语义区别文档对二者的定义非常精炼值得逐字理解Errors错误出现在不完整或部分完成的恢复中。存在 Errors 意味着某些资源确实没有被正确恢复——这是需要优先处理的问题Warnings警告出现在非阻塞性问题中。典型场景是恢复看起来正常且备份中引用的所有资源都以某种形式存在但其中部分资源在目标集群中已预先存在。简言之Errors 表示有东西没恢复成功Warnings 表示恢复了但不是从零新建。二者都可能是灾难性的也可能都无关紧要——例如上面示例中的serviceaccounts default already exists警告通常可以安全忽略因为恢复的目标本来就是复用集群既有 ServiceAccount但如果备份中某个应用自定义的 ServiceAccount 也报 already exists你就需要确认它是不是碰巧同名但内容不同。从源码看这一语义也体现在恢复流程的设计中pkg/restore/restore.go中恢复主流程execute()见 pkg/restore/restore.go同时维护warnings与errs两个results.Result对象恢复单个条目时由restoreItempkg/restore/restore.go根据资源创建/更新/冲突等不同分支把问题分别归入警告集合或错误集合。四、结果结构Velero / Cluster / Namespaces 三层体系文档明确指出Errors 和 Warnings 采用相同的结构组织包含三个部分Ark当前版本中为VeleroArk/Velero 服务器自身遇到的系统相关问题列表例如无法读取某个目录、连接对象存储失败、无法解析备份文件等Cluster与集群作用域cluster-scoped资源恢复相关的问题列表Namespaces一个命名空间名 → 该命名空间下资源恢复问题列表的映射即按命名空间归类各命名空间作用域资源的问题。这一结构在源码中有最直接的印证。结果的数据模型定义在 pkg/util/results/result.gotype Result struct { // Velero is a slice of messages related to the operation of Velero // itself (for example, messages related to connecting to the // cloud, reading a backup file, etc.) Velero []string json:velero,omitempty // Cluster is a slice of messages related to backup or restore of // cluster-scoped resources. Cluster []string json:cluster,omitempty // Namespaces is a map of namespace name to slice of messages // related to backup or restore namespace-scoped resources. Namespaces map[string][]string json:namespaces,omitempty }该结构体同时提供了一系列工具方法pkg/util/results/result.go帮助你理解消息的归类和合并逻辑Add(ns string, e error)按命名空间归类问题——命名空间为空字符串时归入Cluster列表否则归入对应命名空间的列表AddVeleroError(err error)把系统级错误追加到Velero列表Merge(other *Result)将两个结果合并备份阶段收集的结果与恢复阶段收集的结果可以累积IsEmpty()判断是否完全没有问题三个列表均为空。其中Add方法的空命名空间 → Cluster映射逻辑正好解释了为什么集群作用域资源的问题会出现在Cluster一节、而命名空间作用域资源的问题按命名空间展开在Namespaces一节。五、源码级原理计数如何变成明细这里有一个值得深入理解的机制——describe 命令如何拿到文档示例中那一长串明细执行阶段恢复过程中restoreContext不断向warnings/errs两个results.Result追加消息最终与恢复结果一并序列化并写入对象存储这正是RestoreStatus注释中actual warnings/errors are stored in object storage所指计数阶段恢复结束时将warnings.IsEmpty()/errs.IsEmpty()取反得到计数写入RestoreStatus.Warnings与RestoreStatus.Errors。所以velero restore get只需读 K8s 对象即可展示列明细阶段velero restore describe在读取 Restore 对象后发现Status.Warnings 0或Status.Errors 0便通过下载请求DownloadRequest以DownloadTargetKindRestoreResults为目标见 pkg/apis/velero/v1/download_request_types.go从对象存储拉取恢复结果文件再按map[string]results.Result即{warnings: {...}, errors: {...}}解码最终打印。这一逻辑在 pkg/cmd/util/output/restore_describer.go 中完整实现若结果文件不存在或解码失败输出Warnings: error getting warnings...之类的占位信息而不是崩溃只有计数大于 0 时才打印对应章节零问题的 Restore 直接跳过打印时复用describeResultpkg/cmd/util/output/restore_describer.go其输出格式正是文档示例中的Velero:/Cluster:/Namespaces:三段式。表格列定义velero restore get的Errors、Warnings列在 pkg/cmd/util/output/restore_printer.go 中定义数据源是restore.Status.Errors与restore.Status.Warnings而 Restore CRD 的Errors/Warnings打印列printcolumn定义在 pkg/apis/velero/v1/restore_types.go意味着即使只用kubectl get restores也能看到这两列。从上述调用链可以推断只要对象存储可达describe 就能还原完整的恢复诊断报告反之如果结果文件丢失例如备份存储位置被清理则只能看到计数而无法看到明细。六、结合 Restore 阶段判断严重性排查时不要孤立地看 Warnings/Errors 计数还应结合 Restore 的阶段Phase综合判断。RestoreStatus.Phase的取值定义在 pkg/apis/velero/v1/restore_types.go文档时代的 Heptio Ark 仅有 New/InProgress/Completed 等少量阶段当前 Velero 已演进出更细的阶段Completed恢复流程完整执行完毕但这不代表零问题——可能有大量 Warnings/Errors如文档示例所示PartiallyFailed恢复完成但在恢复单个条目时遇到了 1 个以上错误即 Errors 计数大于 0——这是Completed 高 Errors的另一面Failed整个恢复无法执行根因记录在Status.FailureReason中此时重点看的是失败原因而非逐条明细。因此标准的排查路径是先看velero restore get的 STATUS、WARNINGS、ERRORS 三列 → 若计数非零用velero restore describe name获取明细 → 按Velero → Cluster → Namespaces顺序自上而下排查 → 最后用velero restore logs name查看完整日志中的堆栈与上下文。create.go中恢复提交成功后的提示也印证了这一工作流——它会直接建议用户使用velero restore describe name和velero restore logs name获取更多信息见 pkg/cmd/cli/restore/create.go。七、常见 Warnings 场景与处理建议结合文档示例与 Kubernetes 集群的普遍行为最常见的恢复 Warnings 是目标集群中资源已存在典型包括系统级 ServiceAccountdefault、kube-dns、attachdetach-controller等各控制器 SA任何正常集群都有恢复时必然冲突——通常可安全忽略已部署应用的资源如果目标集群已经运行着与备份同名的应用其 Deployment、Service、ConfigMap 等都会产生 already exists 警告。此时需要结合ExistingResourcePolicy等策略当前版本velero restore create支持--existing-resource-policy参数可取值none或update见 pkg/cmd/cli/restore/create.go决定是跳过还是更新覆盖命名空间本身备份包含 Namespace 资源、而目标集群中该命名空间已存在时也会告警。处理原则逐个判断警告来源。若告警资源在目标集群中本来就该存在系统组件、同名应用可忽略若是备份想建、集群已有但内容不确定的冲突资源则需对比备份内容与集群现状必要时调整 restore 的资源过滤器如--include-resources/--exclude-resources、--namespace-mappings等后再恢复。结语回到 debugging-restores 的核心结论Completed 状态只是流程终点的信号Warnings 与 Errors 才是恢复质量的标尺。通过velero restore get捕获计数、velero restore describe展开明细再结合Velero / Cluster / Namespaces三段式结构与源码中results.Result数据模型的对应关系你就能在恢复完成后快速回答三个问题哪里有问题、问题属于什么层级、哪些可以忽略哪些必须处理。这套方法从 Heptio Ark 时代延续至今依然是 Velero 运维者最核心的排障技能。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考