
Velero 文件系统备份踩坑全记录首次备份 3 种 PV 恢复情况 1 套排查链【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero上周生产一个 Nginx 的 PV 被误格式化底层存储的快照接口不支持这个卷类型最后靠 Velero 文件系统备份 20 分钟把数据拉了回来。这篇复盘写给第一次做 PV 数据保护、集群里跑着 StatefulSet 的同学全程不碰云厂商快照。它到底在备份什么原理与两种方案的对比文件系统备份做的事其实很直白Velero 在每个节点上跑一个 node-agent备份时它找到 PV 在宿主机上的真实挂载路径把目录里的文件读出来交给 Kopia 做块级去重和加密再传进对象存储恢复时反向走一遍把数据写回新卷。你可以把它理解成把整个挂载目录 rsync 到 S3只不过 rsync 换成了带增量能力的 Kopia第二次备份只传变化过的块。实现代码在 datapath 模块。和存储快照放一起看差别更清楚你关心的点文件系统备份存储快照CSI Snapshot依赖什么对象存储 节点上的 node-agent云厂商或存储设备的快照 API换集群、换云备份就是对象存储里的一堆文件直接复用快照一般锁死在同一个云账号和区域里面是什么卷上真实的数据文件按文件粒度读块级镜像恢复时要重建整块卷⚡ 从零跑通Velero 文件系统备份配置与首次备份整条链路就两步装组件、建备份没有隐藏的第三步。先装 Velero。这条命令把 server 和 node-agent 一起装进集群--enable-node-agent千万别省——没有它节点上没人去读卷数据后面永远备不上这是我踩的第一个坑--featuresEnableFileSystemBackup负责打开文件系统备份开关。对象存储凭据要提前放一个 Secret 里比如 minio-credsvelero install \ --bucket velero-bucket \ --provider minio \ --backup-location-credentials secret-nameminio-creds \ --enable-node-agent \ --featuresEnableFileSystemBackup跑通之后建第一次备份。这条命令备份 nginx-example 命名空间关键是最后的--include-volumes不加它Velero 只存资源清单卷上数据一个字都不会动这也是第二高频的坑。velero backup create nginx-backup \ --include-namespaces nginx-example \ --include-resourcespods,persistentvolumeclaims,statefulsets \ --include-volumes然后盯着 describe 看。这条命令只 grep 出两行关键状态备份完成时 PVC 那行会变成 completed不用翻整页输出velero backup describe nginx-backup --details | grep -E Status|Persistent Volume成功标志是Status: Completed且 PVC 行显示1 completed。看到这两个值说明卷数据确实进了对象存储不是只备了 metadata。遇到不同情况怎么办PV 数据恢复的 3 种做法如果只想救回单个文件比如 html 目录下一个页面被误删没必要恢复整个卷。先建一个恢复到新命名空间的 restore这条命令里的--namespace-mappings保证不碰线上命名空间velero restore create nginx-file-restore \ --from-backup nginx-backup \ --namespace-mappings nginx-example:nginx-recovery等velero restore describe nginx-file-restore显示Status: Completed直接 exec 进恢复出来的 Pod 把文件带出来kubectl exec -n nginx-recovery nginx-0 -- cat /usr/share/nginx/html/index.html index.html。成功标志本地文件 size 和原文件一致diff 无输出。如果要把数据挪到另一个命名空间同一个命令换个 mapping 就行机制完全相同restore 出来的 PVC 会挂在新命名空间的新 Pod 上卷内容一个字节不少。成功标志是Status: Completed再用kubectl get pvc -n 新命名空间确认卷已 Bound。 如果要跨集群迁移 PV 数据文件系统备份的产物只是对象存储里的文件这是跨集群迁移的基础。先用velero backup download nginx-backup --output-dir ./export把 tarball 拉下来做离线留档目标集群装好 Velero 后让它的备份存储位置指向同一个对象存储前缀凭据保持一致即可然后再跑一次上面那条 restore create。成功标志velero get backups里能看到这条备份且 restore 最终到 Completed。 排查思路比问题清单有用常见故障的推理链排障时先想数据链路断在哪一段host path → node-agent → Kopia → 对象存储四个环节各有一类典型问题现象第一反应真正原因修复动作备份一直 InProgress没有报错怀疑 BSL 权限PV 还没 Bound或 Pod 被驱逐后卷已 umountnode-agent 找不到 host path等 PVC 变 Bound、Pod 重新调度后再触发备份恢复后文件能打开属主不对怀疑镜像没打对备份按 UID 存属主新集群用户 UID 对不上Pod 加 fsGroup或在应用里 chown 对齐备份体积远小于 PV 标称容量以为丢了数据Kopia 块级去重相同块只上传一次稀疏卷更明显不是问题用 describe 看 totalBytes 确认node-agent 日志刷 hostpath 错误怀疑节点磁盘坏该卷路径在节点上不可读通常是挂载点被回收恢复或重调度对应 Pod或换节点后重试文件系统备份不是比快照更快的方案它是快照用不了时的兜底把这条数据链路和两种恢复路径分清PV 数据保护就有底了。想继续看什么VGDP 文件系统备份设计文档、Pod 卷备份实现源码。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考