Velero 文件系统备份实战:一条命令带出 PV 数据,Persistent Volume 备份恢复完全指南
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
本文围绕 Velero 的文件系统备份能力,讲清它如何在 Kubernetes 集群里对 PV(Persistent Volume)做备份与恢复:从环境准备、Velero PV 备份命令,到数据校验、单文件找回与跨集群迁移,并附上常见故障排查与性能调优要点。
一、痛点:磁盘一换,数据就没了
做过 Kubernetes 运维的人大概率遇到过这种局面:应用迁移、节点替换、存储故障,任何一样发生时,PV 上的数据都可能跟着消失。而恢复手段往往被绑在"底层存储支持快照"这个前提上——存储厂商不支持 CSI 快照,或者目标集群用的是另一家存储,备份方案就直接失效。Velero 的文件系统备份走的是另一条路:不依赖存储层能力,直接把卷里的文件内容搬走、存进对象存储。
二、Velero 文件系统备份是什么:和 CSI 快照的两条路
两条路线的本质差异在于数据从哪来:
- CSI 快照由存储系统生成,速度快、开销低,但前提是你的存储驱动支持快照,且数据"圈"在原来的存储系统里。
- 文件系统备份由 Velero 的节点代理(node-agent)直接读取卷挂载目录下的文件,打包上传到备份存储位置(BSL),再经统一数据路径(VGDP)进入备份仓库。数据以文件形式落在 S3 兼容对象存储里,天然和具体存储厂商解耦。
由此带来的适用场景也不同:存储不支持快照或跨存储/跨云迁移时,文件系统备份几乎是唯一可靠选项;同时它还能通过 Pod 上的volumeSnapshotAware/卷策略对指定卷做精细控制,甚至支持块卷之外的普通文件系统卷。底层实现分布在 pkg/datapath/(数据路径调度)、pkg/podvolume/(卷备份执行)与 pkg/uploader/(数据上传)几个模块里,想深入源码可以从这几处入手。
三、最小可用环境:一次 Velero 安装 + 一个对象存储
前提条件很朴素:
- Kubernetes 集群 v1.24+
- 一个 S3 兼容存储(MinIO、各家云 OSS 均可),仓库里 examples/minio/ 就有一份可直接部署的 MinIO 清单
- 一个待保护的工作负载,例如 examples/nginx-app/ 里的示例应用
关键配置只有两处。第一处是安装 Velero 时开启文件系统备份特性并启用 node-agent:
velero install \ --features=EnableFileSystemBackup \ --use-node-agent第二处是准备好备份存储位置(BSL),指定 provider 与 S3 对象存储的桶、密钥即可,仓库的 examples/ 目录提供了配套示例。特性开关的完整列表可在 pkg/features/ 查看,EnableFileSystemBackup就是其中控制文件系统备份能力的那一个。
四、一次完整的 Velero PV 备份恢复之旅
Velero PV 备份命令
备份本身就是一条 CLI 命令。--default-volumes-to-fs-backup让集群内所有 Pod 卷默认走文件系统备份,也可以用--include-resources、--include-namespaces精确圈定范围:
velero backup create nginx-fs \ --include-namespaces nginx-example \ --default-volumes-to-fs-backup \ --wait执行后,每个承载目标卷的节点上,node-agent 会拉起临时备份 Pod,把卷挂载点下的文件读出来、压缩、上传到 BSL。整个过程是异步的,可以反复用下面两条命令盯着状态和日志:
velero backup describe nginx-fs --details velero backup logs nginx-fs校验备份完整性
备份进入Completed只是开始。靠谱的校验习惯是看日志里有没有 Error 级别的文件操作记录,再核对备份产物大小与卷内数据量是否量级吻合(文件系统备份通常比原始卷小,因为空文件、稀疏块都会被跳过)。若备份里有部分卷走的是快照、部分走的是文件系统,velero backup describe的 details 会按卷列出各自的数据路径,可以逐个确认。
Velero 文件系统恢复步骤
恢复时,--restore-pod-volume-data是关键开关——它告诉 Velero 不仅要恢复 PV/PVC 这些元数据对象,还要把文件系统数据真正写回卷:
velero restore create nginx-fs-r \ --from-backup nginx-fs \ --restore-pod-volume-data \ --namespace-mappings nginx-example:nginx-recovery数据回填由 Velero 创建恢复 Pod 完成:它把 BSL 里的文件逐层还原到目标挂载点,同时恢复文件属主、权限、时间戳等属性(这一步必须以 root 运行,这也是恢复 Pod 的默认行为)。完成后新命名空间里的 StatefulSet 重新拉起,卷上就是备份时刻的内容。
五、两个真实场景:单文件找回与跨集群迁移
只救一个文件,不必恢复整个应用。目标文件所在的 PV 损坏了,但你还想保留当前运行中的应用。做法是开一个隔离命名空间做恢复,只恢复该 PVC 及其数据,然后起一个带hostPath或空command的一次性 Pod 挂上恢复后的卷,把需要的文件kubectl cp出来,事毕删掉这个临时恢复。整个过程不触碰生产工作负载,风险面很小。
跨集群、跨存储迁移。文件系统备份把数据放进了对象存储,而对象存储是集群之外的,这给了迁移天然的跳板:
- 在源集群跑一次完整备份(含
--default-volumes-to-fs-backup)。 - 把 BSL 里的备份归档(tar 文件)连同 BSL 配置搬到目标集群可达的存储上——小备份直接下载再上传,大备份可以让两个集群共享同一个桶。
- 在目标集群
velero backup add导入,然后执行上文的恢复命令。
由于卷数据本身就是文件形式,目标集群哪怕换了存储厂商、换了 StorageClass,只要容量和访问模式兼容就能挂上,这正是快照式备份做不到的地方。
六、踩坑清单:Velero 文件系统备份常见故障与自救
| 现象 | 多半的原因 | 自救动作 |
|---|---|---|
| 备份卡住,卷一直等待 | 承载 Pod 已删除,卷没有活动挂载点可读 | 文件系统备份要求卷处于挂载状态,确认对应 Pod 在跑;必要时先拉起应用再备份 |
| node-agent 没起来或备份 Pod 创建失败 | 安装时漏了--use-node-agent,或节点权限不足 | 检查安装参数与 node-agent DaemonSet 状态;备份/恢复 Pod 需要 privileged + root,确认节点策略放行 |
| 恢复后文件属主/权限不对 | 以非 root 身份执行了数据回填 | 确保恢复 Pod 的 SecurityContext 继承自 node-agent(root),SELinux 环境注意 label 上下文 |
| 上传慢、备份窗口超期 | 节点带宽不足或并发被打满 | 见下一节的并发与压缩手段;大文件卷考虑错峰备份 |
| 想排除卷里的大目录(日志、临时文件) | 默认整卷上传 | 在备份策略/Pod 卷配置中指定排除路径,避免无效数据进仓库 |
排查入口有两个:velero backup logs看控制器视角,kubectl logs看对应 node-agent 与临时备份 Pod 的视角,两边日志对着看基本能定位到具体卷卡在哪一环。
七、更快、更省:性能与成本
点到为止的几条:
- 并发:节点级并发由 node-agent 的并发配置控制,调高可以缩短多卷备份窗口,但别超过节点磁盘与带宽的承载力。
- 压缩与增量:数据最终进入 Kopia 管理的备份仓库,重复文件会被去重,多次备份的增量开销远低于全量,这是文件系统备份在成本上的一大优势。
- TTL 与生命周期:用
--ttl给备份设过期时间,再配合对象存储桶的生命周期规则,让过期归档自动清理。 - 排除无用数据:日志、缓存类目录不进仓库,是最直接省空间的方式。
八、下一步
- 想精确控制哪些卷走文件系统备份、哪些走快照,看卷策略设计:design/global-backup-volume-policies.md
- 想理解备份数据从节点到仓库的完整流转,读统一数据路径的实现说明:design/Implemented/unified-repo-and-kopia-integration/unified-repo-and-kopia-integration.md
- 用定时备份替代手工触发,让文件系统备份变成无人值守的日常:
velero schedule create支持相同的备份参数,再配合 examples/nginx-app/ 这类示例应用做演练。
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考