这类问题我又碰上了一次。K8s 1.24 三节点集群用 velero 1.9 备一个带 PVC 的 namespace,velero backup get 一直显示 PartiallyFailed,describe 的 details 里写着 volume snapshot location not found。

这类报错背后常见的原因有几处,逐个排除就行。只配了 backupStorageLocation,没配 volumeSnapshotLocation,PVC 数据根本没进对象存储;集群里没装 CSI snapshotter 和 VolumeSnapshotClass,快照请求全部失败;Pod 挂的是 hostPath,restic 无法备份这种卷。

先看失败到底出在哪一步

velero backup describe app-backup --details

接着改走 restic 文件级备份

velero backup create app-1 --include-namespace=app --default-volumes-to-restic

再往下确认卷类型

kubectl get pv -o custom-columns=NAME:.spec.nfs,PATH:.spec.hostPath.path,SC:.spec.storageClassName

剩下的就是看备份日志里剩下的错误

velero backup logs app-1 | grep -i error

中途换过一次思路,把范围缩到最小的那一层,反而快了。

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

怎么算真的好了,看的是同一批现象。velero backup describe 的 Phase 变成 Completed,Restic Backups 列表里的 Pod 数与实际挂载 PVC 的 Pod 数一致,恢复演练能起同名 PVC。

PartiallyFailed 最坑,元数据成功了业务以为备份可用;恢复演练要做在真正的空 namespace 上,否则测不出卷数据缺没缺。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189