想象你住在一栋现代化公寓里,物业公司叫"Kubernetes"。它能帮你统一管理所有住户、公共水电和电梯运行。可是,如果有一天大楼失火、硬盘报废,或者政府要求整栋楼搬到另一个城市,你该怎么办?传统小区只要把保险箱里的文件复印一份就行;云原生小区的问题是——住户数量多、房间变化快、数据分散在各种存储卷里,靠手工复制根本来不及。 于是,小区物业引进了一家专业的“应急搬迁公司”,名字叫 Velero。它不关心你家有几口人,只关心:你的家当有哪些、需要搬到哪、如何在搬迁后立即恢复生活。它负责三件大事:定期盘点并备份所有房间资源、遇到灾难时快速恢复、需要跨城市迁移时整体搬走。它把备份文件放进一个叫“对象存储”的大型档案库,就像搬迁公司把家具存进郊外的仓库。 对 AI 从业者而言,数据是模型的血液,集群是算力的心脏;掌握 Velero,意味着你拥有了让整个云原生系统“起死回生”的关键能力。本文就用“一家应急搬迁公司”的视角,拆解 Velero 的备份与快照原理。
掌握云原生备份与快照(Velero),是 AI/云原生工程师保障数据安全、实现灾备与集群迁移的核心技能,也是生产环境高可用体系的最后一道保险。
可视化演示
动态展示Velero备份执行流程、Cron定时调度、恢复拓扑排序与跨集群迁移机制。
本节配有交互动效(进入视口后自动加载,约 3KB)。
现代架构演进
从前有一个大家庭,几代人挤在同一个祖宅里。家里的家具、族谱、粮食都放在一起,逢年过节只要请人把整个祖宅的东西装箱搬运一次,就算完成了“备份”。这正是传统单体架构的写照:一个应用包含所有功能,部署在一台服务器上,备份方式简单直接——整机复制即可。
如今,这个大家庭拆散了,各家各户搬进了一栋由 Kubernetes 物业公司管理的高层公寓。每户人家住在一个“容器”里,物业负责调度电梯、分配房间、处理住户流动。这带来一个麻烦:公寓社区里随时有住户搬进搬出,某个服务副本可能从 3 个缩到 1 个,存储卷可能被重新挂载。若还采用整屋复制的老办法,要么搬来一堆已无人居住的空房间,要么漏掉刚入住的新租户。备份的“完整性”因此成了第一要务——如同搬家前必须清点所有住户名单,而不是凭感觉塞几箱东西。
备份完整性的计算逻辑,本质上就是“实际搬走的家当”与“应该搬走的家当”之比:
回看公寓社区的比喻:一个负责任的搬迁公司必须拿着物业的住户总名单逐户核对,每搬走一家就在名单上打一个勾。打完勾后看一眼名单,那些没被勾掉的住户就是备份的缺口。
- 累计成功项把备份成功的每一项资源各计一次,得到分子。
- 统计总项分母记录集群中所有应当备份的资源总数。
- 求百分比两者相除后乘以 100%,得到完整性指标。
Velero 核心功能
应急搬迁公司正式入驻社区后,门口挂着一块招牌,写着三项主营业务:“备份、恢复、迁移”。这三项服务构成了 Velero 的核心功能:集群备份,把整个 K8s 集群的资源对象与数据卷打包归档;集群恢复,在集群损坏或误操作后把归档内容还原成可运行状态;集群迁移,把业务从一个集群原样搬到另一个集群,比如从自建机房搬到云上。
对用户来说,这家公司最诱人的地方是“免费开源”。它由云原生社区维护,依托 Kubernetes 原生的 API 机制工作,因此不需要在应用里嵌入任何代理代码。就像搬家公司不会要求每家每户改造房屋结构,只需要物业提供一份住户清单,就能完成所有搬运工作。
衡量这家公司服务好坏的关键指标,是“断电后多久能重新亮灯”,也就是恢复时间目标:
把应急搬迁公司想象成救火队:从火警响起到扑灭大火、住户重新入住,这段时间越短,社区损失越小。Velero 的价值,就是通过标准化的恢复流程把这段“救火时间”压缩到可控范围。
- 记录故障时刻灾难发生时开始计时,对应公式中的被减数。
- 记录恢复时刻业务重新可用时停止计时,对应公式中的减数。
- 求时间差两者相减便得到停机的总时长。
核心架构组件
如果我们要给应急搬迁公司画一张组织架构图,会看到四个关键角色。Velero Server 是总调度中心,运行在集群内,负责接收用户命令、编排备份与恢复任务;Node Agent(旧称 Velero Node Agent)是各楼栋的专属管家,它以 DaemonSet 方式驻留在每个节点上,随时准备配合执行数据备份;Restic 是搬家公司的那支“车队”,负责把存储卷里的文件逐一打包上传;对象存储则是城郊的大型仓库,用来长期存放所有备份包。
这四个角色各司其职:用户通过命令行告诉 Velero Server“今天要备份哪个命名空间”,Server 查询 Kubernetes API 获得资源清单,接着调度 Node Agent 启动 Restic 进程,Restic 把数据压缩加密后传送到对象存储桶。整个过程就像搬家公司在物业中心领到任务单,派遣楼栋管家和货车队协同作业。
备份过程会产生大量清单文件和日志文件,这些文件同样占用仓库空间,其整体大小可以估算为:
组织架构图里的每一份职责,最终都服务于一个简单目标:让“家当”安全抵达仓库。调度中心下发指令、楼栋管家确认现场、车队负责运输、仓库负责保管——缺少任何一个角色,备份链条就会断裂。
- 累加清单大小每个备份资源都会生成一个清单文件,逐个累加。
- 累加日志大小备份执行过程中的日志也逐一计入。
- 两部分求和清单总量与日志总量相加即是备份总体积。
工作流程机制
一次标准的搬家流程是什么样的?首先,搬迁公司从物业处拿到住户总名单,逐一确认哪些房间需要搬、哪些可以跳过,这就是备份流程中的“资源发现”环节。接着,工人把每户的家具分别装箱,贴上标签打成 tar 包,对应 Velero 把每个命名空间的资源对象序列化归档。最后,车队将包裹运往郊区仓库,同时在仓库登记一份“货物清单”,方便日后查找。
为了让备份不会因遗忘而中断,Velero 提供了调度计划(Schedule)。用户只需说一句“每天晚上 2 点执行一次备份”,Velero 就会像闹钟一样准时启动任务,无需人工干预。仓库管理员还会关心包裹的存放期限,这就是 TTL(Time To Live):备份包在对象存储里只保留指定天数,到期后自动清理,避免仓库被陈年旧货堆满。
一块备份包裹的“保质期”计算方式十分直观:
仓库的“保鲜期”机制保证了备份体系长期健康运转。没有 TTL 的备份仓库,就像从不清理杂物的地下室,总有一天会塞满无用的旧家具,真正需要空间存放新备份时反而无从下手。
- 记录创建时间备份任务完成时,系统记录当前时间戳。
- 累加保留时长在创建时间上加上配置的 TTL 值。
- 触发清理当前时间超出过期时间后,垃圾回收机制删除备份。
快照与钩子
搬迁公司最怕什么?最怕住户的冰箱里还冻着海鲜,而搬家工人却要把冰箱拔掉电源。如果直接搬运,数据可能损坏。此时,专业的搬家公司会使用两种精细化手段:卷快照和钩子。
卷快照(Volume Snapshot) 相当于给冰箱拍一张“瞬时状态的 3D 照片”——不需要关机断电,就能在极短时间内记录磁盘的完整数据状态。Velero 可以通过云厂商的存储快照接口或 CSI 快照驱动完成这一操作,速度快、对业务影响小。备份钩子(Hooks)则像是搬家前的“电话确认”:Pre 钩子在备份前执行,告诉应用“请暂停写入,把内存数据刷到磁盘”;Post 钩子在备份完成后通知应用“可以继续正常工作了”,从而保证备份数据的一致性。
卷快照的耗时直接影响备份窗口,其计算公式为:
钩子和快照的组合,就像给冰箱搬家时既拍了保鲜照片,又提前打电话确认冰箱断电时间——每一个细节都是为了确保数据在“搬运中途”不丢失、不损坏。这也是 Velero 备份区别于简单文件拷贝的关键所在。
- 记录触发时刻Velero 发起快照请求时打上时间戳。
- 记录完成时刻存储系统返回快照就绪信号时打上时间戳。
- 求差值两者相减即为本次快照的耗时。
环境依赖配置
任何搬迁公司开张前,都需要先办齐“营业执照”。Velero 的第一张执照,是云厂商凭证——访问对象存储桶和创建卷快照所需的密钥。第二张执照是 Velero 安装,通常一条 velero install 命令即可完成,命令中需要指定 --provider(云厂商)、--bucket(存储桶名称)和 --secret-file(凭证文件路径)。第三张执照是备份存储桶,它是所有备份文件的最终归宿。第四张执照是 node-agent,它以 DaemonSet 形式在每个节点上运行,为 Restic 提供数据搬运能力。
配置齐备之后,一套可用的备份体系才算真正上线。如果缺少云厂商凭证,Velero 连仓库大门都进不去;如果没有指定存储桶,备份包无处安放;如果没有 node-agent,卷数据无法被读取上传。这就像搬家公司既没有货车,也没有仓库钥匙,自然寸步难行。
在实际的迁移工程中,我们常以“迁移完成率”来检查配置与执行是否到位:
“办执照”环节看似繁琐,却是整个备份体系的地基。很多新手在生产环境遇到的备份失败,最终排查下来都是凭证过期、存储桶权限不足或 node-agent 未启动——地基不稳,再豪华的搬家车队也无济于事。
- 统计迁移成功量数出已成功迁移并验证可用的资源。
- 统计资源总量清点源集群需要迁移的全部资源。
- 求比例两者相除后乘 100%,获得完成率。
异构云迁移
当公司决定从 A 城市搬到 B 城市,即从 AWS 迁到 GCP,或从自建机房迁到云上时,应急搬迁公司遇到了新挑战。跨云迁移时,最常见的坑是跨云快照不可用:AWS 的 EBS 快照无法在 GCP 上直接挂载,就像美国标准的电器插头插不进欧洲的插座。此时,卷快照方案普遍失效,必须退回到文件级备份——用 Restic 把文件逐个打包,再在目标集群重新组装成数据卷。这个过程更通用,但耗时更长。
Velero 的迁移流程通常是这样的:先在源集群执行一次完整备份(包含资源对象与卷数据),然后在目标集群执行 velero restore,把备份包中的内容还原出来。还原时还可以借助命名空间映射功能,把源集群的 ns-a 映射为 ns-b,避免命名冲突。最后一步是必不可少的备份验证:像搬完家后逐屋检查水电一样,工程师需要在目标集群上验证业务 Pod 能正常启动、数据库能正常读写。
跨云迁移最核心的指标是“最多会丢多少数据”,即恢复点目标:
搬家完成后,最重要的不是“东西都到了”,而是“每个东西都能正常使用”。跨云迁移的成功标准,从来不是备份文件复制完毕,而是业务在新城市继续运转如常。RPO 这个指标时刻提醒我们:备份越频繁,丢失的数据窗口越窄,迁移的保险系数越高。
- 记录最近备份时间读取时间戳,找到最后一次成功备份的时刻。
- 记录故障时间标记灾难或误操作发生的时刻。
- 求时间差两者相减即得到数据丢失窗口的宽度。
AI 应用场景
数据库版本升级前的全量备份演练
阶段:数据迁移与备份调度
解决的问题:传统做法是人工冷备份,需要停服数小时;如果升级失败,回滚时数据可能已不一致。Velero 在升级前自动完成一次全量备份,升级失败后可在数分钟内恢复到备份点,避免人工操作遗漏。
具体案例:某金融公司计划将生产集群中的 PostgreSQL 数据库从 12 升级到 15。团队在升级窗口前 1 小时创建 Velero 备份计划,包含数据库命名空间及 PVC 数据卷;升级过程中出现兼容性问题后,SRE 执行 velero restore 将数据库整体还原到升级前状态,全程业务中断仅 8 分钟。
多集群容灾与故障注入演练
阶段:故障恢复自动化
解决的问题:单一集群发生地域故障时,业务将全面瘫痪。利用 Velero 的周期性调度备份,可将备份实时同步到异地对象存储;再配合混沌工程工具定期注入故障,验证恢复流程的时效性。
具体案例:某电商平台在主集群之外维护一个灾备集群,每天凌晨通过 Velero Schedule 备份订单数据库 PVC;每个季度执行一次“断网演练”——模拟主集群不可用,运维团队依据演练手册从对象存储恢复数据到灾备集群,并用脚本校验订单表行数与最新订单时间戳,确保 RPO 达标。
Python 演示
class BackupAuditor: """借助 Velero 备份清单统计信息,计算备份完整性指标。""" def __init__(self): self.policy_list = [] # 应备份的资源清单 self.done_list = [] # 实际备份成功的资源 def load_expected(self, items): self.policy_list = list(items) def load_backup(self, items): self.done_list = list(items) def complete_rate(self): missing_map = {} need_map = {} names = set(list(self.policy_list) + list(self.done_list)) for k in names: need_map[k] = self.policy_list.count(k) missing_map[k] = max(0, need_map[k] - self.done_list.count(k)) total = sum(need_map.values()) miss = sum(missing_map.values()) return 100.0 * (total - miss) / total if total else 0.0 if __name__ == '__main__': auditor = BackupAuditor() auditor.load_expected(['deploy-api', 'svc-api', 'pvc-data', 'cm-config']) auditor.load_backup(['deploy-api', 'pvc-data']) print('备份完成率: %.1f%%' % auditor.complete_rate())
self.policy_list = []存储应备份资源的清单,相当于 Velero 查询 API 得到的资源总名单。self.done_list = []记录实际备份成功的资源,对应 Velero 备份日志中的成功项。load_expected` / `load_backup加载预期清单与真实备份结果,类似velero backup describe的输入数据。need_map[k] = self.policy_list.count(k)统计每个资源在应备份清单中出现的次数,允许同名资源多副本存在。missing_map[k] = max(0, need_map[k] - self.done_list.count(k))计算每个资源的缺失数量,防止同名资源被重复计数后出现负数。100.0 * (total - miss) / total if total else 0.0计算备份完整性百分比,如果清单为空则返回 0,避免除零错误。
常见误区
误区我安装了 Velero 之后,它应该只会把 Deployment、Service、ConfigMap 这些“配置”备份下来,PVC 里的数据还得自己另外想办法。
正解Velero 不仅能备份 Kubernetes 资源对象,也支持备份持久卷数据。它通过卷快照(云厂商快照或 CSI 快照)和 Restic 文件级备份两条路径,将 PVC 数据一并纳入备份体系。只用默认命令而不开启卷快照或 Restic,才会出现“只被了配置、丢了数据”的尴尬局面。
为何常见:很多教程演示 Velero 时只展示 velero backup create 命令,没有深入讲解卷快照与 Restic 的配置步骤,初学者误以为资源备份已覆盖全部数据。
误区只要 `velero backup create` 显示 Completed,我就放心了;备份文件在对象存储里躺着,永远不会出问题。
正解备份成功只代表“文件已生成”,不代表“文件能恢复”。存储桶权限变更、备份包损坏、Kubernetes 版本差异都可能导致恢复失败。正确做法是定期执行恢复演练,在临时集群中用备份文件还原一套业务环境并做数据校验,确保备份真正可用。
为何常见:恢复演练需要额外的时间和资源,而备份成功是立刻可见的结果,人们往往倾向于相信“看得见的成功”而忽视“看不见的风险”。
误区既然 AWS 的 EBS 快照不能在 GCP 上挂载,那么跨云迁移就只能放弃数据卷,只迁移 Deployment 等资源。
正解快照确实有厂商锁定问题,但 Velero 提供了 Restic 文件级备份作为通用方案:把卷内文件解包上传,再在目标集群重建数据卷。虽然速度慢一些,但数据完整性和可用性都有保障。部分 CSI 驱动也支持跨云复制快照,可结合具体情况选择。
为何常见:人们习惯用自己最熟悉的方式解决问题,当“快照迁移”这条路走不通时,容易直接放弃整条迁移路径,而忽略文件级备份这个备选方案。
误区Restic 要在每个节点上读取卷里的所有文件,肯定会产生大量 IO 和网络开销,把线上业务拖垮。
正解Restic 的 IO 开销可以精细控制。Velero 支持在备份计划中配置资源配额、限速参数,并可以安排在业务低峰期执行。实际生产实践中,只要合理设置 --resource-limits 和调度时间,Restic 对业务的影响完全可控,而它换来的是跨云迁移所需的通用数据备份能力。
为何常见:人们把“读取大量文件”直接等同于“性能灾难”,忽略了限速、错峰、资源配额等工程手段的调节作用。
面试题
Q1. Velero 的核心备份对象是什么?
- A.磁盘上的 Restic 仓库
- B.Kubernetes 资源及卷数据← 正确答案
- C.云平台上的虚拟机镜像
- D.容器镜像仓库里的镜像
答案:B。Velero 备份的是 Kubernetes 资源对象(Deployment、Service 等)以及持久卷数据(通过快照或 Restic 实现)。它不备份宿主机镜像仓库,也不负责容器镜像本身,那属于镜像仓库系统的工作。
Q2. 备份文件最终存放的“郊区大仓库”是?
- A.Kubernetes 的 etcd
- B.对象存储服务桶← 正确答案
- C.本地磁盘缓存
- D.运维人员的电脑
答案:B。Velero 的备份包默认上传到对象存储桶,如 AWS S3、阿里云 OSS 等。etcd 是集群状态数据库,不是备份仓库;本地缓存只是临时中转,不是最终归宿。
Q3. Schedule 中 TTL 参数的直接作用是什么?
- A.提升备份执行速度
- B.决定备份文件保留时间← 正确答案
- C.压缩备份数据体积
- D.限制备份网络带宽
答案:B。TTL(Time To Live)表示备份文件在对象存储中的保留时长,到期后自动清理。它不控制备份速度、压缩率或带宽,只负责“仓库货架上的包裹放多久”。
Q4. 下列哪些内容属于 Velero 的备份对象?
- A.节点的操作系统内核
- B.PVC 上的业务数据← 正确答案
- C.Kubernetes 资源对象← 正确答案
- D.集群外数据库记录
答案:BC。Velero 备份范围为集群内的资源对象与持久卷数据。节点操作系统属于基础设施,不归 Velero 管理;集群外数据库记录需要额外工具或链路接入,不在默认备份范围内。
Q5. Pre 备份钩子最适合在何时执行?
- A.数据卷快照完成之后
- B.应用容器暂停写入之前← 正确答案
- C.对象存储清理之后
- D.恢复到新集群之时
答案:B。Pre 钩子在备份开始前执行,目的是让应用完成内存数据落盘、暂停写入等操作,从而保证备份数据的一致性。在快照完成之后执行就失去了意义。
Q6. 关于 Velero 备份与恢复钩子,正确的说法有哪些?
- A.Pre 备份钩子用于备份前的业务处理← 正确答案
- B.Post 备份钩子用于快照完成后的处理← 正确答案
- C.恢复钩子用于新集群数据校验← 正确答案
- D.钩子只能在本地集群使用
答案:ABC。Pre/Post 备份钩子分别服务于备份前后,恢复钩子则可在 Pod 恢复后执行自定义命令,例如校验数据库可读性。钩子同样适用于跨集群恢复场景,因此 D 错误。
Q7. 跨云迁移时快照方案普遍不可用的主要原因是?
- A.快照文件体积过大
- B.云厂商存储格式不兼容← 正确答案
- C.快照上传速度过慢
- D.快照没有加密保护
答案:B。云厂商的卷快照与底层存储强绑定,例如 EBS 快照无法在 GCP 直接挂载,格式不兼容导致跨云无法直接使用。体积、速度、加密都不是跨云迁移的根本障碍。
Q8. 恢复时命名空间冲突的推荐解法是?
- A.删除目标集群的全部资源
- B.使用命名空间映射功能← 正确答案
- C.恢复前重启 kubelet
- D.修改 PV 的存储类
答案:B。Velero 支持在 restore 时通过命名空间映射,将源集群命名空间映射为目标集群的另一个命名空间,从而避免资源抢占。删除全部资源过于粗暴,重启 kubelet 与存储类修改均不能解决命名冲突。
Q9. 关于 Velero 备份生命周期,正确的说法包括哪些?
- A.TTL 到期自动清理存储桶对象← 正确答案
- B.备份成功后可以手动删除← 正确答案
- C.恢复演练不影响原备份← 正确答案
- D.备份文件只能保留一份
答案:ABC。Velero 依据 TTL 自动清理过期备份,也允许用户手动删除指定备份;恢复操作只是读取备份文件生成新资源,不会破坏原备份。备份仓库可以同时保留多份历史备份,因此 D 错误。
Q10. 应备份资源共 20 项,实际成功 18 项,备份完整性是多少?
- A.90%← 正确答案
- B.85%
- C.95%
- D.80%
答案:A。备份完整性等于成功备份数除以应备份总数,即 18 ÷ 20 = 90%。这个指标提醒我们:只要有两个资源被遗漏,灾难恢复时就有 10% 的业务数据面临永久丢失风险。