集群整个挂了。etcd 快照是有的,一周七份,一份没丢。运维照着文档把控制面拉回来,Deployment、Service、ConfigMap 全都回来了,kubectl get all -A 看着很正常。然后 Pod 起不来——MySQL 报数据目录损坏,MinIO 报 bucket 是空的,Prometheus 的 TSDB 目录只剩一个空壳。
那一刻现场才反应过来:持久卷里的数据,从来就不在 etcd 里。etcd 存的是"哪个 Pod 挂了个叫 data 的卷、这个卷对应哪块云盘"这类元数据,卷里的字节一字节都没进去。"我们每天备份 etcd"这句话,覆盖率只有一半。
复盘下来,问题出在一个所有人默认成立的假设上:把"集群的状态"等同于"集群里的数据"。控制面确实完整恢复了,资源清单一个不差,可应用一启动就去读空目录。因为 etcd 里那条 PVC 记录指向的云盘,要么是随集群一起被删掉了,要么是新集群里根本没有对应的卷。
更麻烦的是恢复粒度。etcd 快照的恢复动作是"把整个集群回滚到某一时刻",你没法只挑一个命名空间出来。也就是说,如果只是为了找回某个人误删的一个 ConfigMap,用 etcd 快照回滚意味着整个集群所有业务的写入都要一起倒退——这个代价绝大多数团队付不起,最后只能手工重建,备份形同虚设。
把三类东西分开看,是做 K8s 备份的第一步:控制面对象(存在 etcd 里)、持久卷数据(存在块存储或文件系统里)、业务语义数据(数据库里的一行、一个对象存储里的一个文件)。这三样东西的恢复粒度、恢复代价、存放要求全都不一样,任何单一工具都覆盖不全。Velero 的定位是第二类和第一类的组合——它能按命名空间收集资源清单,又能把 PV 目录做文件级备份,但它是 etcd 快照的补充,不是替代。判断备份有没有效,唯一标准是恢复演练结果,不是备份任务日志里那一行 Completed。
etcd 是 K8s 的唯一真相源,所有 API 对象的当前状态都以键值对形式存在其中。做一次 etcd 快照,拿到的就是这一刻全部对象的序列化结果。它的优点是干净、一致、与底层存储无关——不管你的卷是云盘、NFS 还是本地目录,etcd 快照都只管对象。
它的边界同样清晰。第一,恢复粒度是整个集群。快照恢复的标准流程是停掉控制面、把数据目录换成快照内容、重启,集群里所有对象回到快照时刻。这中间没有"筛选"这一步。第二,它不含持久卷里的数据。etcd 里只有 PV/PVC 的绑定关系描述,卷的实际内容由 CSI 驱动或存储后端管理。第三,它对"部分误删"这种高频事故几乎没有用——为了一个 ConfigMap 回滚整个集群,风险远大于收益。
etcd 快照真正的主场是控制面整体损毁:三节点 etcd 集群多数派挂了且数据目录损坏、升级过程中把 etcd 写坏了、或者有人执行了范围过大的删除操作导致整个集群不可用。这类场景下你要的就是"整机回到某时刻",etcd 快照恰好匹配。除此之外,日常的数据找回应该交给卷快照、文件级备份和应用逻辑备份。
两者是并存关系,不是二选一。etcd 快照负责"控制面能不能重建",Velero 负责"某个命名空间能不能单独回来、卷里的数据能不能跟着回来、这套东西能不能搬到另一个集群"。很多团队的最终形态是:etcd 定时快照作为兜底,Velero 做日常可粒度化恢复,数据库另外跑自己的逻辑备份。
把备份拆成三条路径之后,最容易犯的错误是"选一条做扎实就够了"。实际上这三条路径的恢复粒度差着好几个数量级,代价也完全不同。下面这张表按"覆盖什么、能恢复到多细、要放在哪"三个维度做对照,配置方案基本可以从表里倒推出来。
| 备份路径 | 覆盖的内容 | 恢复粒度 | 恢复耗时量级 | 存放位置要求 | 适合解决什么问题 |
|---|---|---|---|---|---|
| etcd 快照 | 存在 etcd 中的全部集群对象元数据:Deployment、Service、ConfigMap、Secret、CRD 与自定义资源等,不含持久卷内的实际数据 | 整个集群一次性回滚到某一时刻,无法只恢复单个命名空间或单个对象 | 取决于数据规模与集群对象总量,需实测确认 | 控制面节点可访问的存储,建议与集群分机房保存,避免整机故障连带失效 | 控制面整体损毁、大批对象被误删、集群升级失败后的整机回滚 |
| CSI 卷快照 | 块存储层面的卷快照,包含卷内全部数据,能力取决于 CSI 驱动是否实现快照接口 | 单个 PVC 或单个卷,可配合对象清单做命名空间级恢复 | 取决于数据规模与存储后端能力,需实测确认 | 通常只能落在同一存储系统或同一区域,跨区域、跨介质能力由驱动决定 | 大卷快速回滚、要求分钟级恢复点、同一存储系统内的容灾与克隆 |
| Velero 文件级备份 | 集群对象清单加 PV 目录的文件级副本,与底层存储解耦,可跨异构存储搬运 | 命名空间、标签或单个资源级别,支持筛选恢复与跨集群恢复 | 取决于数据规模、节点 IO 与出口带宽,需实测确认 | 任意 S3 兼容对象存储,可与源集群跨机房、跨城市隔离存放 | 按命名空间精确恢复、跨集群迁移、异构存储之间的数据搬运 |
| 应用逻辑备份 | 数据库 dump、消息队列导出、业务系统自带的导出接口,带业务语义 | 单库、单表甚至单条记录,可按业务对象精确找回 | 取决于数据规模与导入方式,需实测确认 | 应用所在机器之外另存一份,最好跨机房保存,并定期校验可导入性 | 误删单表、逻辑数据损坏、需要按业务对象精确定位找回 |
Velero 由两部分组成,很多人只装了前者就去验收,结果踩到"清单恢复了但数据盘是空的"。理解这两个组件各干什么,是排错的第一刀。
Velero server 是一个跑在集群里的 Deployment。备份时它通过 Kubernetes API 把指定范围内的资源对象序列化成 JSON 清单,打包写进对象存储里的备份目录。它不碰节点文件系统,也不读卷内容。如果只装 server,恢复后你会得到完整的 Deployment、Service、PVC 定义——以及一堆空目录。
node-agent 是 DaemonSet,旧版本叫 restic,新版本改了名字但职责没变:它在每个节点上起一个 Pod,把该节点上挂载的 PV 目录读出来,做去重、分块、加密后上传。没有 node-agent,PV 备份这一段就完全不会发生。安装时要确认 DaemonSet 在每个有状态工作负载的节点上都调度成功,节点有污点的话需要额外配 toleration。
判断两个组件是否都到位,方法很直接:kubectl get deploy -n velero 和 kubectl get ds -n velero 都要看,ds 的期望实例数要等于目标节点数;然后做一次带 PV 的备份,用 velero backup describe <名> --details 看是否列出了卷备份条目。只有清单没有卷条目,就是 node-agent 那一侧没生效。
文件级备份不是自动对所有卷生效的,需要在 Pod 上加注解声明哪些卷要备份。漏打注解是"备份显示成功、恢复发现没数据"的另一个高频原因。实践中建议给 StatefulSet 模板统一加注解,并在 CI 或准入控制里做检查,避免新增有状态服务时漏掉。
文件级备份会把数据写进对象存储里一个叫备份仓库(BackupRepository)的结构。它不是一堆平铺的文件,而是带索引和去重块的仓库格式。这里有个很容易被忽略的机制:删除过期备份只是在清单里打了个删除标记,仓库里的数据块还在。真正释放空间要靠仓库维护,也就是 prune(清理未引用数据块)和 gc(回收仓库空间)。
Velero 会在备份任务里自动触发维护,但触发条件和维护频率是有限的。如果你的备份删除很频繁,或者备份任务被限速拖得很长,维护就可能跟不上,对象存储的用量图会呈现"只涨不跌"的走势。这时需要显式执行仓库维护命令,把空间真正收回来。
维护本身是有代价的:它要遍历仓库索引、重写元数据,对 CPU 和内存的要求往往高于普通备份任务。所以仓库维护需要两件事——一是给 node-agent 或维护用的 Pod 设明确的资源限制,避免它把业务节点资源吃干;二是给它一个执行窗口,避开业务高峰。把维护任务和资源限制一起写进部署清单,比事后手工补救省事得多。
这两条路都能保住卷里的数据,但机制完全不同,选择依据不是"哪个更先进",而是"恢复点目标能不能接受"。
CSI 卷快照走的是存储后端的能力。它调用 CSI 驱动的快照接口,在块存储层面打一个时间点快照。速度快,通常秒级到分钟级完成;恢复时直接基于快照创建新卷,数据一致性由存储系统保证。代价是它依赖驱动实现——你的存储必须支持快照,而且快照一般只能在同一存储系统、同一区域内使用,跨存储、跨云、跨地域基本指望不上。
文件级备份与底层存储完全解耦。node-agent 把文件读出来存进对象存储,恢复时再写回任意一种 PVC。它可以跨集群、跨云、跨存储介质,甚至可以恢复到不同 StorageClass 的卷上。代价是慢,且占用节点的 CPU、内存、磁盘 IO 和出口带宽。大卷的首次备份尤其耗时,之后虽然有去重增量,但为了找出变更,仍然需要遍历文件树做比对。
判断口径可以这样定:如果恢复点目标以分钟计,且备份和源在同一存储系统内,优先 CSI 快照;如果要求跨集群迁移、异构存储,或者同一份备份要能恢复到多个不同环境,用文件级备份。多数生产集群是两者都配——日常快速回滚走快照,异地副本和迁移走文件级备份。
这是最容易被跳过的一环。备份动作的起点是"开始读文件",但数据库此时可能还有大量数据在页缓存或内存里没落盘,也可能正在写一个跨多文件的事务。这种状态下拷出来的副本叫"崩一致"——它等价于机器突然断电后的磁盘状态。恢复后数据库会跑崩溃恢复流程,运气好能自愈,运气不好就是表损坏。
解决方式是在备份前把应用刷盘或冻结。Velero 通过 Pod 注解配置备份钩子,pre hook 在备份该卷之前执行,post hook 在备份完成后执行。对 MySQL 可以执行 FLUSH TABLES WITH READ LOCK 之类的刷盘操作;对支持冻结的文件系统可以用 fsfreeze;对有导出能力的服务,更稳的做法是 pre hook 里直接导出一份逻辑备份到卷上,让 Velero 去备份这个导出文件。
钩子写完之后必须验证一次:故意在恢复后的环境里启动数据库,看它是否需要跑崩溃恢复、慢查询日志有没有异常、抽样几条记录做校验。只验证"文件都在"是不够的,要验证"数据库能起来且数据对得上"。
用 Velero 做集群迁移是它最实用的场景之一,但迁移失败基本都卡在同一批地方,而不是 Velero 本身。
第一类是 StorageClass 名称不一致。源集群用 fast-ssd,目标集群叫 ssd-standard,PVC 里的 storageClassName 直接带到新集群就会因为找不到类而一直 Pending。Velero 支持在恢复时做 StorageClass 映射,通过配置把源名称改写成目标名称。迁移前先把两边的 StorageClass 清单列出来做一次对照,是成本最低的前置检查。
第二类是镜像与拉取凭据。目标集群可能访问不到源集群的镜像仓库,或者仓库地址变了、凭据不同。表现是 Pod 起不来,报 ImagePullBackOff。迁移前要确认目标集群能拉到全部镜像,必要时先把镜像同步到目标集群可达的仓库,并把对应的 imagePullSecrets 一并迁移过去。
第三类是网络入口的重新规划。Service 的 cluster IP 段在新集群大概率不一样,NodePort 端口可能冲突,Ingress 域名指向的还是老集群的负载均衡地址。这些不属于 Velero 的恢复范围,需要单独规划:LoadBalancer 类型的 Service 在新集群会重新分配地址,Ingress 的域名解析要切换,依赖固定 IP 的外部系统要同步更新白名单。
这一点不搞清楚,演练时会得出完全错误的结论。Velero 在恢复时,遇到目标集群已经存在的同名资源,默认行为是跳过,不报错、不覆盖、也不提示。任务最终状态依然是 Completed,但你要恢复的 ConfigMap 其实是老的那一版。
要让它真正更新已有资源,需要显式指定覆盖策略,把已有资源策略设为更新。这个开关应该按场景决定:恢复到干净集群时用默认值没问题;做"回滚某个配置"这种操作时必须显式指定更新,否则等于什么都没做。
演练时的正确做法是二选一:要么始终恢复到一个干净的命名空间或独立的演练集群,让"没有同名资源"成为前提;要么明确指定覆盖策略,并在恢复后用 diff 校验关键对象确实变了。两者的共同点是——都不能只看任务状态,必须核对对象内容。
恢复演练不是"跑一遍 restore 命令",它有固定的验证动作。一份能过关的演练至少包含四项:清单对象数核对(恢复出来的对象数量与备份时记录的数量一致,差异要能解释)、PV 挂载成功(PVC 处于 Bound,Pod 能挂上卷)、应用能启动( readiness 探针通过,不是 CrashLoopBackOff)、抽样数据校验(随机抽几条业务记录,与源端比对内容)。四项全过才算这次备份有效。
演练节奏上,建议至少每季度做一次完整恢复演练,每次大版本升级或存储更换后追加一次。演练环境用独立的集群或独立命名空间,不要在生产上直接验证——恢复不是幂等的,在生产上跑可能把现有资源搞乱。
备份放在哪,决定了它能覆盖哪一类风险,这一档分三档看。同机房只覆盖单机故障和误操作,机房级断电、存储整列损坏时备份跟着一起没。同城不同机房能覆盖机房级故障,但城市级事件和同一套存储系统故障仍可能连带。异地才覆盖城市级故障,代价是恢复时跨地域拉取数据,耗时明显更长。
一条必须写进方案的铁律:备份仓库与目标集群必须在故障域上隔离。如果备份桶和源集群用的是同一套存储、同一个账号、同一个机房,那么一次误删权限、一次存储故障、一次账号泄露,就会把源数据和备份一起带走。备份存在的意义就是"源没了它还在",放在同一个故障域里等于没有备份。
落到服务器与机房选择上,备份目标机和异地副本放在不同节点是最朴素也最有效的做法。像一万网络这类提供多地机房可选的服务商,可以把备份节点和业务节点分开摆:业务在华南,备份目标机放华东或华北,再往中国香港节点放一份异地副本,形成不同故障域的层次。自建备份机看重硬盘容量时,裸金属机型比较合适,例如 E5-2620 32G/1T ¥999 起、E5-2698v4×2 32G/1T ¥3999 起这类大硬盘配置;轻量的一万云 ¥25 起可以拿来跑备份校验、恢复演练这类临时任务。以上价格均为官网明示起步价,实际以官网实时价为准。
备份仓库这一层的安全性经常被低估。Velero 访问对象存储依赖一组凭据(通常是 AK/SK 形式的 Secret),这组凭据应该按最小权限原则发放:只给这一个桶的读写权限,不给列举全部桶、删除桶、修改桶策略的权限。理由很直接——备份任务本身不需要那些权限,多给的每一分权限,都是勒索软件或误操作可以利用的空间。
仓库本身还有一层独立的加密口令,它用来加密分块数据。这层口令和对象存储凭据必须分开保管,因为两者放在一起意味着"拿到一份就同时拿到了钥匙和仓库"。口令丢失的后果是全部历史备份不可恢复,所以它至少要有一份离线副本,并且在人员变动时有移交流程。仓库口令一旦建立不要随意更换,更换会导致旧备份无法解密。
对象存储侧的防误删要做三件事:开启版本控制,让被覆盖或删除的对象保留历史版本;配置对象锁或合规保留策略,在保留期内禁止删除和覆盖;对删除操作要求多因素认证。这三件事是防勒索的最后一道防线——攻击者即便拿到了写权限,也删不掉保留期内的备份数据。
node-agent 在节点上读 PV 目录,读的是业务正在用的同一块盘。不限速的话,大卷备份期间业务延迟会明显上升,这是文件级备份绕不开的物理成本。
控制手段有三个层面。资源限制上,给 node-agent 的 Pod 设明确的 CPU 和内存 limit,避免它把节点资源吃满触发驱逐。并发上,Velero 侧有控制并发文件下载、并发上传的参数,可以按节点规模下调。时间上,把备份任务排到业务低峰,并给备份任务设超时,避免它拖到早高峰还没跑完。
观察指标要在第一次全量备份时就建立基线:节点的磁盘读 IOPS 与读带宽、节点出口带宽占用、对象存储的请求量与限流错误。特别注意的是,增量备份不等于 IO 减半——为了找出哪些文件变了,node-agent 仍要遍历整棵文件树做比对,只是上传量减少了。真正吃资源的是仓库维护,它的 CPU 和内存开销通常高于普通备份,更要放进低峰窗口。
保留策略(TTL)不应该拍脑袋定。它的下限由合规要求决定:等保、行业监管、审计要求里通常会明确日志和业务数据的留存周期,备份的保留期至少要覆盖这个周期。上限由存储成本决定。两者之间的区间才是可以自由设计的部分。
常用的是分层的保留结构:日备保留较短周期、周备保留中期、月备或季度备保留满足合规的最长周期。分层的好处是既能快速回到最近几天,又不会让每天的备份把存储撑爆。设置 TTL 时要记住,过期只是标记删除,必须配合仓库维护才会真正释放空间。
还有一项容易被忽略:备份元数据本身的可移植性。备份的索引信息一部分在对象存储里,一部分作为集群对象存在源集群的 etcd 中。源集群整体损毁时,光有对象存储里的仓库还不够,需要在新集群上重新同步仓库才能识别历史备份。所以异地容灾方案里必须包含"仓库本身的异地复制",通常用对象存储的跨区域复制能力实现,并且要定期在异地验证一次能否列出并恢复历史备份。
Velero 跨大版本升级时,仓库格式可能变化。升级前要确认新版本能否读取旧仓库,做法是在测试环境用新版本挂载一份旧仓库做恢复验证。不能读的话,升级窗口内要保留旧版本可回滚的能力,或者先把关键数据导出成独立副本。
恢复不是把所有对象一股脑塞回去就行,资源之间有依赖顺序。Velero 内部有默认的资源优先级排序,但遇到自定义资源和 Operator 时,需要人工确认顺序是否合理。
最典型的依赖是卷:必须先把 PV/PVC 恢复出来并完成卷数据写入,Pod 启动时才挂得上。文件级备份的卷数据恢复是异步进行的,Pod 可能在数据还没写完时就已经被调度起来,这时需要靠初始化容器或恢复钩子把启动时机推迟到数据就绪之后。
第二类是 CRD 与 CR 的依赖。如果目标集群还没装对应的 CRD,自定义资源恢复时会被直接跳过,日志里可能只是一行警告。Operator 管理的服务尤其要注意:正确顺序是先安装 Operator 和 CRD,再恢复 CR,让 Operator 去 reconcile。反过来的话,CR 恢复失败且不会自动重试。
第三类是准入控制带来的二次变更。目标集群上的 mutating webhook 可能在恢复过程中改写对象内容,导致恢复出来的资源和备份时不一致。恢复完成后要抽查几个关键对象,确认没有被意外改写。有状态服务的 Pod 序号与卷绑定关系也要核对,StatefulSet 的序号错位会导致数据挂错卷。
为什么坑:etcd 只存对象元数据,卷内容由存储后端管理,两者的数据路径完全独立。团队把"备份了 etcd"理解成"备份了集群",是因为平时看到集群状态都是从 API 读的,误以为那些状态就是全部。
怎么判断:检查备份方案里有没有针对 PV 的动作。如果备份产物只有一个 etcd 快照文件,或者 Velero 备份描述里没有任何卷条目,就说明数据面是裸奔的。更直接的验证是恢复一次——控制面回来了但业务起不来,就是这个坑。
怎么规避:把卷备份作为独立验收项写进方案,etcd 快照与卷备份分别定时、分别验证。Velero 部署后必须确认 node-agent 的 DaemonSet 在所有有状态节点上就绪,并给 StatefulSet 统一加文件级备份注解。
为什么坑:备份仓库是有索引和去重块的结构,删除备份只打标记,数据块仍被索引引用。团队看到备份列表里旧备份消失了,就以为空间已经释放,实际用量曲线一直在涨。
怎么判断:对比备份清单里的备份数量与对象存储的实际用量。如果删除了一批备份后用量没有回落,就是维护没跟上。再看仓库的维护记录,是否有执行失败或长时间未执行。
怎么规避:把仓库维护纳入定时任务,并设置合理的执行窗口。给维护任务配资源限制,防止它抢占业务资源。用量设置告警阈值,持续增长而无回落时触发排查。
为什么坑:备份开始时数据库可能还有未落盘的数据或正在进行的事务,此时拷出的文件等价于断电后的磁盘状态。备份任务本身完全感知不到这个问题,状态照样是成功。
怎么判断:恢复后的数据库如果频繁触发崩溃恢复、启动耗时明显变长、或出现表损坏告警,基本可以确定是崩一致。更严格的方式是在恢复环境里做一次完整性检查并抽样比对记录。
怎么规避:给有状态 Pod 配 pre/post 备份钩子,执行刷盘、冻结或导出。对支持导出逻辑备份的服务,优先让钩子生成导出文件再由 Velero 备份该文件。每次改钩子配置后重跑一次恢复验证。
为什么坑:备份的意义在于源失效时它还在。同机房、同存储系统、同账号的备份,在机房断电、存储整列损坏、账号被攻破这三类场景下会与源数据一起丢失,等于备份只覆盖了误操作这一类风险。
怎么判断:列出备份存放位置与源集群的关系:是否同机房、是否共用同一套存储、是否共用同一个云账号与管理凭据。三项中只要有任意一项重合,故障域就没有隔离。
怎么规避:至少做到同城不同机房,重要数据做到异地。备份桶使用独立账号与独立凭据,并开启版本控制与保留策略。备份节点与业务节点分属不同机房,异地副本定期做一次可恢复性验证。
不重复,两者解决的是不同问题。etcd 快照的恢复粒度是整个集群,适合控制面整体损毁后的整机回滚;它不覆盖持久卷里的数据,也无法只挑一个命名空间出来。Velero 备份的是资源清单加卷内文件,可以按命名空间、按标签筛选恢复,还能跨集群搬运。判断是否需要两套并存,看你的事故清单:如果里面有"误删某个配置""某个命名空间要单独回滚""这套环境要搬到另一个集群",etcd 快照一条都解决不了。反过来,如果 etcd 集群本身多数派损坏,Velero 也帮不上忙——它的元数据有一部分存在源集群里。所以两者是互补关系,兜底和日常分别走不同的路。
取决于三件事:数据量增长速度、是否已有可用的机房资源、以及合规对数据出境和存放地的要求。云对象存储省运维,按需扩容,跨区域复制是现成能力,但长期存放的累积成本和出口流量费要算清楚,数据量大时这笔账不便宜。自建对象存储(比如用 MinIO 搭一套)前期成本可控、带宽内网免费、数据位置自己说了算,代价是副本、扩容、磁盘更换都要自己扛。自建路线下硬件选型是重点:备份机首要指标是硬盘容量和可靠性,其次是网络出口。像一万网络这类深耕 IDC 19 年(成立于 2007 年)的服务商,提供华南、华东、华北、中国香港等多个节点可选,大硬盘裸金属机型(如 E5-2620 32G/1T ¥999 起、E5-2698v4×2 32G/1T ¥3999 起)适合做备份目标机,轻量的一万云 ¥25 起可以跑校验类任务,实际价格以官网实时价为准。无论选哪条,都要保证备份节点与业务节点不在同一故障域。
文件级备份的首次是全量,后续会做去重增量,所以"全量频率"这个概念在这里更多是指完整备份链的起点。日常建议按业务变更频率定:变更频繁的核心库可以每天一次,配置类为主的环境每周一次也够。真正要设计的是保留结构——日备保留一到两周,周备保留一到两个月,月备保留满足合规要求的最长周期。保留期的下限由合规留存要求决定,不是由存储预算决定;预算只决定上限。设置 TTL 时别忘了配套仓库维护,否则过期备份只是被标记删除,空间不会释放。另外要给备份任务设超时和告警,失败要能被发现。
演练的动作要固定成清单:恢复到独立环境、核对恢复出的对象数量与备份记录一致、确认 PVC 处于 Bound 且 Pod 能挂载、确认应用探针通过、抽样几条业务数据做内容比对。四项全过才算通过,只看任务状态为 Completed 不算。演练环境必须是独立的命名空间或独立集群,不要在生产上跑——恢复默认跳过同名资源,在生产上演练极易误判"成功"。频率上,每季度至少一次完整演练,控制面大版本升级、存储后端更换、Velero 版本升级后各追加一次。演练结果要记录耗时,这个数字才是你真实可用的恢复时间。
用 Velero 恢复时的 StorageClass 映射功能,把源集群的名称改写成目标集群的名称。前置动作是先把两边的 StorageClass 清单拉出来做对照,确认名称差异和参数差异,写进映射配置里。要注意的不只是名称:provisioner 类型、 reclaimPolicy、是否允许扩容、挂载选项都可能不同,卷绑定到目标类之后行为会有变化。如果目标集群缺少对应的 CSI 驱动,映射做得再对也恢复不出来,这一步要在迁移前确认。恢复后重点检查 PVC 是否 Bound,Pending 的话看事件里的原因,通常是类名找不到或者驱动不可用。另外把这一项纳入迁移检查表,避免下次再漏。
会,而且它的资源开销通常高于普通备份任务。维护要遍历仓库索引、重写元数据,对 CPU 和内存的要求都不低,又因为由 node-agent 在节点上执行,可能直接和业务 Pod 抢资源。规避手段是三层:给执行维护的 Pod 设明确的 CPU 和内存 limit,防止吃满触发驱逐;把维护排到业务低峰窗口,并设执行超时;在维护期间观察节点负载与业务延迟指标,异常时中断。可以接受的话,把维护安排在没有重要业务跑的独立节点上。判断影响是否可控,看维护执行窗口内的业务延迟曲线和节点内存水位,两者都没有明显抬升才算配置合适。
有必要,但要按规模裁剪,不要照搬大集群的配置。几台机器的集群最容易掉进"反正也没多少数据,手工重建就行"的坑——真出事时手工重建的成本远高于配一次备份。裁剪建议:保留 etcd 定时快照作为兜底,它成本最低;用 Velero 做带 PV 的文件级备份,备份目标放在集群外的一台独立机器或对象存储上,保证故障域隔离;数据库额外跑一份逻辑备份,用于精确找回单表数据。演练可以简化成每季度一次,只验证核心服务能否恢复、数据能否读出来。需要提醒的是,小规模集群往往没有专职运维,备份任务失败没人看,所以告警一定要配,失败要能第一时间发现。
判断一套 K8s 备份方案是否成立,方法是从最坏场景倒推。如果最坏情况是"整个机房不可用",那么备份必须异地,且备份仓库与源集群在机房、存储系统、管理凭据三个维度上都隔离;如果最坏情况是"某个人误删了一个命名空间",那么方案必须具备命名空间级恢复能力,etcd 快照在这条路上直接出局;如果最坏情况是"数据库单表被写坏",那么只有应用逻辑备份能救,卷快照和 etcd 快照都没用。
把这三类场景写下来,逐条对照方案能否覆盖,缺口就是下一步要做的事。Velero 在这套体系里的位置很明确:它解决按命名空间的恢复、PV 的文件级备份、以及跨集群迁移,是 etcd 快照的补充而不是替代。真正决定备份有没有效的,是每季度那次恢复演练里四项验证能否全过——备份任务日志里的 Completed 从来不是证据,能恢复出来的数据才是。
本文关于备份路径划分、组件职责与配置判断的表述,参考以下公开资料:Velero 官方文档中关于备份与恢复、BackupRepository 仓库维护、node-agent 与旧版 restic 的关系、CSI 卷快照支持、备份钩子注解、恢复时 StorageClass 映射与已有资源覆盖策略的说明;Kubernetes 官方文档中关于 etcd 备份与恢复、持久卷、Volume Snapshot 与 CSI 驱动能力的章节;etcd 官方运维文档中的灾难恢复部分;以及一万网络官网公布的服务器租用、裸金属与一万云产品节点与价格信息(以官网实时价为准)。文中涉及的耗时、带宽与资源占用均为定性描述,具体数值需结合自身环境实测确认。
Copyright © 2013-2020 idc10000.net. All Rights Reserved. 一万网络 科技有限公司 版权所有 深圳市科技有限公司 粤ICP备07026347号
本网站的域名注册业务代理北京新网数码信息技术有限公司的产品