Velero 不是 etcd 快照的替代品,也不能凭空恢复没有被备份的数据。恢复动作不是事务:Pod、Service、PVC 可能部分创建成功、部分失败。因此先恢复到一个新命名空间或新集群,验证通过后再切换,是默认做法;直接在原命名空间覆盖只应在有当前状态备份和明确回滚方案时进行。
kubectl config current-context
kubectl get nodes
velero backup-location get
Available 只说明 Velero 能访问对象存储,不代表备份内容完整:kubectl -n velero describe backupstoragelocation <bsl-name>
velero backup get
velero backup describe <backup-name> --details
velero backup logs <backup-name> | tail -100
重点看备份阶段、错误数、包含的命名空间、资源数量、卷备份或 CSI 快照数量。Completed 也可能没有包含卷数据,必须看 --details 和日志。PartiallyFailed 的备份不是完全不可用,但要先判断缺的是关键资源还是可重建资源。
确认备份没有过期或被清理。检查对象存储的 TTL、生命周期规则、对象锁和凭据有效期。备份文件被生命周期规则删除、但 Velero 里还保留记录时,恢复会在读取阶段失败。
检查恢复组件。确认 Velero 服务端、CLI 和插件相互兼容,Velero 命名空间中的 Pod 正常;如果用文件系统备份,node-agent DaemonSet 必须在目标节点运行:
kubectl -n velero get pods
kubectl -n velero get ds node-agent
kubectl -n velero get backuprepositories.velero.io
kubectl get sc
kubectl get volumesnapshotclass
kubectl get crd | wc -l
kubectl get resourcequota,limitrange -A
如果目标集群没有源集群同名的 StorageClass,PVC 会一直 Pending;没有对应镜像时 Pod 会 ImagePullBackOff。不要等恢复开始后才发现这些依赖。
update,先创建当前状态备份:velero backup create pre-restore-app-$(date +%Y%m%d%H%M) \
--include-namespaces app \
--default-volumes-to-fs-backup --wait
kubectl -n app get deploy,sts,svc,cm,secret,pvc -o yaml > app-before.yaml
不要一上来覆盖生产。使用命名空间映射恢复到临时命名空间,验证资源和数据:
velero restore create app-restore-$(date +%Y%m%d%H%M) \
--from-backup app-20261018 \
--include-namespaces app \
--namespace-mappings app:app-restore \
--existing-resource-policy=none \
--wait
命名空间映射会改变资源的命名空间归属,但 ConfigMap、Secret 和启动参数中硬编码的旧命名空间、数据库地址、外部域名不会自动修改,验证时要逐项检查。
整集群恢复应针对新建的目标集群或经过验证的空环境,并使用明确的排除项:
velero restore create cluster-restore-$(date +%Y%m%d%H%M) \
--from-backup full-cluster-20261018 \
--include-cluster-resources=true \
--exclude-resources nodes,events,events.events.k8s.io \
--exclude-namespaces kube-system,kube-public,kube-node-lease,velero \
--existing-resource-policy=none \
--wait
nodes、events、租约和系统命名空间带有源集群的节点名、IP 和运行时状态,恢复到目标集群通常只会污染状态。目标集群的 CNI、CSI、DNS、Ingress Controller 和监控代理应先由集群自身安装好,再恢复业务资源。若备份包含 CRD 和 Webhook,确认目标集群版本与 schema 兼容;failurePolicy: Fail 的 Webhook 后端未就绪时,可能拦截后续资源创建。
velero restore get
velero restore describe <restore-name> --details
velero restore logs <restore-name> > restore.log
kubectl -n app-restore get pods,pvc,svc
kubectl -n app-restore get events --sort-by=.lastTimestamp
--wait 返回不代表每个资源都成功,仍要看 Phase、错误和警告。恢复出的资源可能先于 CRD 或控制器恢复,导致工作负载无法创建其依赖对象;遇到 no matches for kind 要先补齐 CRD。
Velero 恢复资源清单不等于恢复卷内容。先确认备份的卷模式:
node-agent 把数据写回新建的 PVC。查看 kubectl -n velero get podvolumerestores 和恢复详情中的卷恢复状态。恢复通常创建新的 PVC/PV 绑定,而不是把数据挂回原来的卷。确认 StorageClass 能动态供应,或提前创建好静态 PV;数据量大时,卷恢复可能远晚于 Pod 启动,业务验证要等卷恢复完成后再做。
默认 --existing-resource-policy=none 会跳过已存在的对象。只有在当前状态已备份、资源差异已确认、回滚路径明确时,才使用 update:
velero restore create app-inplace-$(date +%Y%m%d%H%M) \
--from-backup app-20261018 \
--include-namespaces app \
--existing-resource-policy=update \
--wait
覆盖式恢复仍可能保留目标端新增的对象,不会把命名空间变成备份时的精确副本。数据库、PVC、Service 和外部资源要单独核对,不能把“恢复命令成功”当成“业务状态一致”。
Phase 为 Completed;若为 PartiallyFailed,逐条查看错误,不要忽略警告。Bound,Pod 为 Running/Ready,卷恢复任务完成;对数据库或文件数据做行数、校验和或抽样读取。恢复状态为 PartiallyFailed。 先查看 velero restore describe --details 和日志中的具体资源,按类型处理:
already exists:默认被跳过。确认目标对象是否要保留;要覆盖时先备份,再用受控的 update 或只对失败资源重试。no matches for kind:目标集群缺少 CRD 或 API 版本不一致。先恢复 CRD 或安装对应控制器,再重试 CR。只重试失败资源,不要在没有备份的情况下重新执行整份 update 恢复:
velero restore create retry-app-$(date +%Y%m%d%H%M) \
--from-backup app-20261018 \
--include-namespaces app \
--include-resources deployments,services,configmaps \
--existing-resource-policy=update \
--wait
隔离命名空间恢复失败。 保留日志和恢复出的 PVC,删除临时命名空间前先确认没有需要保留的数据。删除测试命名空间是低风险回滚;不要顺手删除源备份或共享快照。
原命名空间覆盖恢复失败。 Velero 没有“撤销恢复”命令。优先从刚才创建的 pre-restore 备份恢复,或用 GitOps 的上一个提交重新同步;不要手工删除不确定归属的对象。若恢复出的 PV 已写入脏数据,先停应用、隔离存储,再从更早的快照恢复。
误删了生产数据。 立即停止所有写入方,保留现场,确认最近一次可用备份和 RPO。不要用 --existing-resource-policy=update 反复覆盖同一批资源;每次重试都要记录时间、命令和影响范围。
需要回切。 先把恢复端缩容或断流,再切回原集群,确保不会出现双写。若原集群在故障后已继续接收写入,回切前要核对数据差异,不能只改 DNS 或 Service 指向。
合上页面,先回答,再展开对照。
Completed,为什么还不能直接断定 PV 数据可以恢复?PartiallyFailed 时,第一步应该做什么,什么时候才重试?Completed 只表示备份流程完成,卷数据可能没有包含;必须看 backup describe --details 中的卷备份或快照数量,以及日志和 PVC 恢复结果。restore describe --details 和日志定位具体失败资源,再按 already exists、CRD 缺失、PVC、node-agent、Webhook 等原因修复;只在目标状态已备份并验证后,才对失败资源做受控重试。
小程序版
微信扫码,随时查命令