关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

《K8s 集群备份不是只备份 etcd:Velero 的对象存储、PV 快照与恢复演练怎么配》

发布时间:2026-10-08

集群整个挂了。etcd 快照是有的,一周七份,一份没丢。运维照着文档把控制面拉回来,Deployment、Service、ConfigMap 全都回来了,kubectl get all -A 看着很正常。然后 Pod 起不来——MySQL 报数据目录损坏,MinIO 报 bucket 是空的,Prometheus 的 TSDB 目录只剩一个空壳。

那一刻现场才反应过来:持久卷里的数据,从来就不在 etcd 里。etcd 存的是"哪个 Pod 挂了个叫 data 的卷、这个卷对应哪块云盘"这类元数据,卷里的字节一字节都没进去。"我们每天备份 etcd"这句话,覆盖率只有一半。

先说那次恢复:etcd 快照救回了控制面,业务数据一字节都没回来

复盘下来,问题出在一个所有人默认成立的假设上:把"集群的状态"等同于"集群里的数据"。控制面确实完整恢复了,资源清单一个不差,可应用一启动就去读空目录。因为 etcd 里那条 PVC 记录指向的云盘,要么是随集群一起被删掉了,要么是新集群里根本没有对应的卷。

更麻烦的是恢复粒度。etcd 快照的恢复动作是"把整个集群回滚到某一时刻",你没法只挑一个命名空间出来。也就是说,如果只是为了找回某个人误删的一个 ConfigMap,用 etcd 快照回滚意味着整个集群所有业务的写入都要一起倒退——这个代价绝大多数团队付不起,最后只能手工重建,备份形同虚设。

把三类东西分开看,是做 K8s 备份的第一步:控制面对象(存在 etcd 里)、持久卷数据(存在块存储或文件系统里)、业务语义数据(数据库里的一行、一个对象存储里的一个文件)。这三样东西的恢复粒度、恢复代价、存放要求全都不一样,任何单一工具都覆盖不全。Velero 的定位是第二类和第一类的组合——它能按命名空间收集资源清单,又能把 PV 目录做文件级备份,但它是 etcd 快照的补充,不是替代。判断备份有没有效,唯一标准是恢复演练结果,不是备份任务日志里那一行 Completed。

etcd 快照能回滚整个集群,但它天生救不了单个命名空间

etcd 是 K8s 的唯一真相源,所有 API 对象的当前状态都以键值对形式存在其中。做一次 etcd 快照,拿到的就是这一刻全部对象的序列化结果。它的优点是干净、一致、与底层存储无关——不管你的卷是云盘、NFS 还是本地目录,etcd 快照都只管对象。

它的边界同样清晰。第一,恢复粒度是整个集群。快照恢复的标准流程是停掉控制面、把数据目录换成快照内容、重启,集群里所有对象回到快照时刻。这中间没有"筛选"这一步。第二,它不含持久卷里的数据。etcd 里只有 PV/PVC 的绑定关系描述,卷的实际内容由 CSI 驱动或存储后端管理。第三,它对"部分误删"这种高频事故几乎没有用——为了一个 ConfigMap 回滚整个集群,风险远大于收益。

什么情况下 etcd 快照才是首选

etcd 快照真正的主场是控制面整体损毁:三节点 etcd 集群多数派挂了且数据目录损坏、升级过程中把 etcd 写坏了、或者有人执行了范围过大的删除操作导致整个集群不可用。这类场景下你要的就是"整机回到某时刻",etcd 快照恰好匹配。除此之外,日常的数据找回应该交给卷快照、文件级备份和应用逻辑备份。

别把 etcd 快照和 Velero 备份对立起来

两者是并存关系,不是二选一。etcd 快照负责"控制面能不能重建",Velero 负责"某个命名空间能不能单独回来、卷里的数据能不能跟着回来、这套东西能不能搬到另一个集群"。很多团队的最终形态是:etcd 定时快照作为兜底,Velero 做日常可粒度化恢复,数据库另外跑自己的逻辑备份。

三条备份路径各管一段,互相替代不了(对照表)

把备份拆成三条路径之后,最容易犯的错误是"选一条做扎实就够了"。实际上这三条路径的恢复粒度差着好几个数量级,代价也完全不同。下面这张表按"覆盖什么、能恢复到多细、要放在哪"三个维度做对照,配置方案基本可以从表里倒推出来。

备份路径 覆盖的内容 恢复粒度 恢复耗时量级 存放位置要求 适合解决什么问题
etcd 快照 存在 etcd 中的全部集群对象元数据:Deployment、Service、ConfigMap、Secret、CRD 与自定义资源等,不含持久卷内的实际数据 整个集群一次性回滚到某一时刻,无法只恢复单个命名空间或单个对象 取决于数据规模与集群对象总量,需实测确认 控制面节点可访问的存储,建议与集群分机房保存,避免整机故障连带失效 控制面整体损毁、大批对象被误删、集群升级失败后的整机回滚
CSI 卷快照 块存储层面的卷快照,包含卷内全部数据,能力取决于 CSI 驱动是否实现快照接口 单个 PVC 或单个卷,可配合对象清单做命名空间级恢复 取决于数据规模与存储后端能力,需实测确认 通常只能落在同一存储系统或同一区域,跨区域、跨介质能力由驱动决定 大卷快速回滚、要求分钟级恢复点、同一存储系统内的容灾与克隆
Velero 文件级备份 集群对象清单加 PV 目录的文件级副本,与底层存储解耦,可跨异构存储搬运 命名空间、标签或单个资源级别,支持筛选恢复与跨集群恢复 取决于数据规模、节点 IO 与出口带宽,需实测确认 任意 S3 兼容对象存储,可与源集群跨机房、跨城市隔离存放 按命名空间精确恢复、跨集群迁移、异构存储之间的数据搬运
应用逻辑备份 数据库 dump、消息队列导出、业务系统自带的导出接口,带业务语义 单库、单表甚至单条记录,可按业务对象精确找回 取决于数据规模与导入方式,需实测确认 应用所在机器之外另存一份,最好跨机房保存,并定期校验可导入性 误删单表、逻辑数据损坏、需要按业务对象精确定位找回

Velero server 与 node-agent 分工不同,缺一个就会恢复出空数据盘

Velero 由两部分组成,很多人只装了前者就去验收,结果踩到"清单恢复了但数据盘是空的"。理解这两个组件各干什么,是排错的第一刀。

Velero server:只管调 API 收清单

Velero server 是一个跑在集群里的 Deployment。备份时它通过 Kubernetes API 把指定范围内的资源对象序列化成 JSON 清单,打包写进对象存储里的备份目录。它不碰节点文件系统,也不读卷内容。如果只装 server,恢复后你会得到完整的 Deployment、Service、PVC 定义——以及一堆空目录。

node-agent:到节点上读 PV 目录做文件级备份

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 需要文件级备份

文件级备份不是自动对所有卷生效的,需要在 Pod 上加注解声明哪些卷要备份。漏打注解是"备份显示成功、恢复发现没数据"的另一个高频原因。实践中建议给 StatefulSet 模板统一加注解,并在 CI 或准入控制里做检查,避免新增有状态服务时漏掉。

备份仓库不维护,对象存储只会一路涨

文件级备份会把数据写进对象存储里一个叫备份仓库(BackupRepository)的结构。它不是一堆平铺的文件,而是带索引和去重块的仓库格式。这里有个很容易被忽略的机制:删除过期备份只是在清单里打了个删除标记,仓库里的数据块还在。真正释放空间要靠仓库维护,也就是 prune(清理未引用数据块)和 gc(回收仓库空间)。

Velero 会在备份任务里自动触发维护,但触发条件和维护频率是有限的。如果你的备份删除很频繁,或者备份任务被限速拖得很长,维护就可能跟不上,对象存储的用量图会呈现"只涨不跌"的走势。这时需要显式执行仓库维护命令,把空间真正收回来。

维护本身是有代价的:它要遍历仓库索引、重写元数据,对 CPU 和内存的要求往往高于普通备份任务。所以仓库维护需要两件事——一是给 node-agent 或维护用的 Pod 设明确的资源限制,避免它把业务节点资源吃干;二是给它一个执行窗口,避开业务高峰。把维护任务和资源限制一起写进部署清单,比事后手工补救省事得多。

CSI 卷快照快但绑死存储,文件级备份慢但能跨集群

这两条路都能保住卷里的数据,但机制完全不同,选择依据不是"哪个更先进",而是"恢复点目标能不能接受"。

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),这组凭据应该按最小权限原则发放:只给这一个桶的读写权限,不给列举全部桶、删除桶、修改桶策略的权限。理由很直接——备份任务本身不需要那些权限,多给的每一分权限,都是勒索软件或误操作可以利用的空间。

仓库本身还有一层独立的加密口令,它用来加密分块数据。这层口令和对象存储凭据必须分开保管,因为两者放在一起意味着"拿到一份就同时拿到了钥匙和仓库"。口令丢失的后果是全部历史备份不可恢复,所以它至少要有一份离线副本,并且在人员变动时有移交流程。仓库口令一旦建立不要随意更换,更换会导致旧备份无法解密。

对象存储侧的防误删要做三件事:开启版本控制,让被覆盖或删除的对象保留历史版本;配置对象锁或合规保留策略,在保留期内禁止删除和覆盖;对删除操作要求多因素认证。这三件事是防勒索的最后一道防线——攻击者即便拿到了写权限,也删不掉保留期内的备份数据。

文件级备份会抢业务 IO,限速与并发窗口要提前定

node-agent 在节点上读 PV 目录,读的是业务正在用的同一块盘。不限速的话,大卷备份期间业务延迟会明显上升,这是文件级备份绕不开的物理成本。

控制手段有三个层面。资源限制上,给 node-agent 的 Pod 设明确的 CPU 和内存 limit,避免它把节点资源吃满触发驱逐。并发上,Velero 侧有控制并发文件下载、并发上传的参数,可以按节点规模下调。时间上,把备份任务排到业务低峰,并给备份任务设超时,避免它拖到早高峰还没跑完。

观察指标要在第一次全量备份时就建立基线:节点的磁盘读 IOPS 与读带宽、节点出口带宽占用、对象存储的请求量与限流错误。特别注意的是,增量备份不等于 IO 减半——为了找出哪些文件变了,node-agent 仍要遍历整棵文件树做比对,只是上传量减少了。真正吃资源的是仓库维护,它的 CPU 和内存开销通常高于普通备份,更要放进低峰窗口。

保留策略要对齐合规留存期,备份元数据也要能搬走

保留策略(TTL)不应该拍脑袋定。它的下限由合规要求决定:等保、行业监管、审计要求里通常会明确日志和业务数据的留存周期,备份的保留期至少要覆盖这个周期。上限由存储成本决定。两者之间的区间才是可以自由设计的部分。

常用的是分层的保留结构:日备保留较短周期、周备保留中期、月备或季度备保留满足合规的最长周期。分层的好处是既能快速回到最近几天,又不会让每天的备份把存储撑爆。设置 TTL 时要记住,过期只是标记删除,必须配合仓库维护才会真正释放空间。

还有一项容易被忽略:备份元数据本身的可移植性。备份的索引信息一部分在对象存储里,一部分作为集群对象存在源集群的 etcd 中。源集群整体损毁时,光有对象存储里的仓库还不够,需要在新集群上重新同步仓库才能识别历史备份。所以异地容灾方案里必须包含"仓库本身的异地复制",通常用对象存储的跨区域复制能力实现,并且要定期在异地验证一次能否列出并恢复历史备份。

跨版本升级的兼容性也要纳入保留策略

Velero 跨大版本升级时,仓库格式可能变化。升级前要确认新版本能否读取旧仓库,做法是在测试环境用新版本挂载一份旧仓库做恢复验证。不能读的话,升级窗口内要保留旧版本可回滚的能力,或者先把关键数据导出成独立副本。

恢复顺序与资源依赖:先有 PVC 再有 Pod,先有 CRD 再有 CR

恢复不是把所有对象一股脑塞回去就行,资源之间有依赖顺序。Velero 内部有默认的资源优先级排序,但遇到自定义资源和 Operator 时,需要人工确认顺序是否合理。

最典型的依赖是卷:必须先把 PV/PVC 恢复出来并完成卷数据写入,Pod 启动时才挂得上。文件级备份的卷数据恢复是异步进行的,Pod 可能在数据还没写完时就已经被调度起来,这时需要靠初始化容器或恢复钩子把启动时机推迟到数据就绪之后。

第二类是 CRD 与 CR 的依赖。如果目标集群还没装对应的 CRD,自定义资源恢复时会被直接跳过,日志里可能只是一行警告。Operator 管理的服务尤其要注意:正确顺序是先安装 Operator 和 CRD,再恢复 CR,让 Operator 去 reconcile。反过来的话,CR 恢复失败且不会自动重试。

第三类是准入控制带来的二次变更。目标集群上的 mutating webhook 可能在恢复过程中改写对象内容,导致恢复出来的资源和备份时不一致。恢复完成后要抽查几个关键对象,确认没有被意外改写。有状态服务的 Pod 序号与卷绑定关系也要核对,StatefulSet 的序号错位会导致数据挂错卷。

四类备份事故:为什么坑、怎么判断、怎么规避

一、只做 etcd 快照,PV 数据没备份

为什么坑:etcd 只存对象元数据,卷内容由存储后端管理,两者的数据路径完全独立。团队把"备份了 etcd"理解成"备份了集群",是因为平时看到集群状态都是从 API 读的,误以为那些状态就是全部。

怎么判断:检查备份方案里有没有针对 PV 的动作。如果备份产物只有一个 etcd 快照文件,或者 Velero 备份描述里没有任何卷条目,就说明数据面是裸奔的。更直接的验证是恢复一次——控制面回来了但业务起不来,就是这个坑。

怎么规避:把卷备份作为独立验收项写进方案,etcd 快照与卷备份分别定时、分别验证。Velero 部署后必须确认 node-agent 的 DaemonSet 在所有有状态节点上就绪,并给 StatefulSet 统一加文件级备份注解。

二、备份成功但不做仓库维护,对象存储持续膨胀

为什么坑:备份仓库是有索引和去重块的结构,删除备份只打标记,数据块仍被索引引用。团队看到备份列表里旧备份消失了,就以为空间已经释放,实际用量曲线一直在涨。

怎么判断:对比备份清单里的备份数量与对象存储的实际用量。如果删除了一批备份后用量没有回落,就是维护没跟上。再看仓库的维护记录,是否有执行失败或长时间未执行。

怎么规避:把仓库维护纳入定时任务,并设置合理的执行窗口。给维护任务配资源限制,防止它抢占业务资源。用量设置告警阈值,持续增长而无回落时触发排查。

三、没配备份钩子,拿到崩一致的数据库副本

为什么坑:备份开始时数据库可能还有未落盘的数据或正在进行的事务,此时拷出的文件等价于断电后的磁盘状态。备份任务本身完全感知不到这个问题,状态照样是成功。

怎么判断:恢复后的数据库如果频繁触发崩溃恢复、启动耗时明显变长、或出现表损坏告警,基本可以确定是崩一致。更严格的方式是在恢复环境里做一次完整性检查并抽样比对记录。

怎么规避:给有状态 Pod 配 pre/post 备份钩子,执行刷盘、冻结或导出。对支持导出逻辑备份的服务,优先让钩子生成导出文件再由 Velero 备份该文件。每次改钩子配置后重跑一次恢复验证。

四、备份和源集群放在同一个故障域

为什么坑:备份的意义在于源失效时它还在。同机房、同存储系统、同账号的备份,在机房断电、存储整列损坏、账号被攻破这三类场景下会与源数据一起丢失,等于备份只覆盖了误操作这一类风险。

怎么判断:列出备份存放位置与源集群的关系:是否同机房、是否共用同一套存储、是否共用同一个云账号与管理凭据。三项中只要有任意一项重合,故障域就没有隔离。

怎么规避:至少做到同城不同机房,重要数据做到异地。备份桶使用独立账号与独立凭据,并开启版本控制与保留策略。备份节点与业务节点分属不同机房,异地副本定期做一次可恢复性验证。

关于 etcd、Velero 与演练的七个高频疑问

1. 已经备份了 etcd,再用 Velero 备份是不是重复劳动

不重复,两者解决的是不同问题。etcd 快照的恢复粒度是整个集群,适合控制面整体损毁后的整机回滚;它不覆盖持久卷里的数据,也无法只挑一个命名空间出来。Velero 备份的是资源清单加卷内文件,可以按命名空间、按标签筛选恢复,还能跨集群搬运。判断是否需要两套并存,看你的事故清单:如果里面有"误删某个配置""某个命名空间要单独回滚""这套环境要搬到另一个集群",etcd 快照一条都解决不了。反过来,如果 etcd 集群本身多数派损坏,Velero 也帮不上忙——它的元数据有一部分存在源集群里。所以两者是互补关系,兜底和日常分别走不同的路。

2. 备份仓库放自建对象存储还是云对象存储

取决于三件事:数据量增长速度、是否已有可用的机房资源、以及合规对数据出境和存放地的要求。云对象存储省运维,按需扩容,跨区域复制是现成能力,但长期存放的累积成本和出口流量费要算清楚,数据量大时这笔账不便宜。自建对象存储(比如用 MinIO 搭一套)前期成本可控、带宽内网免费、数据位置自己说了算,代价是副本、扩容、磁盘更换都要自己扛。自建路线下硬件选型是重点:备份机首要指标是硬盘容量和可靠性,其次是网络出口。像一万网络这类深耕 IDC 19 年(成立于 2007 年)的服务商,提供华南、华东、华北、中国香港等多个节点可选,大硬盘裸金属机型(如 E5-2620 32G/1T ¥999 起、E5-2698v4×2 32G/1T ¥3999 起)适合做备份目标机,轻量的一万云 ¥25 起可以跑校验类任务,实际价格以官网实时价为准。无论选哪条,都要保证备份节点与业务节点不在同一故障域。

3. 多久做一次全量备份,备份保留多久

文件级备份的首次是全量,后续会做去重增量,所以"全量频率"这个概念在这里更多是指完整备份链的起点。日常建议按业务变更频率定:变更频繁的核心库可以每天一次,配置类为主的环境每周一次也够。真正要设计的是保留结构——日备保留一到两周,周备保留一到两个月,月备保留满足合规要求的最长周期。保留期的下限由合规留存要求决定,不是由存储预算决定;预算只决定上限。设置 TTL 时别忘了配套仓库维护,否则过期备份只是被标记删除,空间不会释放。另外要给备份任务设超时和告警,失败要能被发现。

4. 恢复演练该怎么做,多久做一次

演练的动作要固定成清单:恢复到独立环境、核对恢复出的对象数量与备份记录一致、确认 PVC 处于 Bound 且 Pod 能挂载、确认应用探针通过、抽样几条业务数据做内容比对。四项全过才算通过,只看任务状态为 Completed 不算。演练环境必须是独立的命名空间或独立集群,不要在生产上跑——恢复默认跳过同名资源,在生产上演练极易误判"成功"。频率上,每季度至少一次完整演练,控制面大版本升级、存储后端更换、Velero 版本升级后各追加一次。演练结果要记录耗时,这个数字才是你真实可用的恢复时间。

5. 跨集群迁移时 StorageClass 名称不一致怎么办

用 Velero 恢复时的 StorageClass 映射功能,把源集群的名称改写成目标集群的名称。前置动作是先把两边的 StorageClass 清单拉出来做对照,确认名称差异和参数差异,写进映射配置里。要注意的不只是名称:provisioner 类型、 reclaimPolicy、是否允许扩容、挂载选项都可能不同,卷绑定到目标类之后行为会有变化。如果目标集群缺少对应的 CSI 驱动,映射做得再对也恢复不出来,这一步要在迁移前确认。恢复后重点检查 PVC 是否 Bound,Pending 的话看事件里的原因,通常是类名找不到或者驱动不可用。另外把这一项纳入迁移检查表,避免下次再漏。

6. 备份仓库维护会不会影响正在跑的业务

会,而且它的资源开销通常高于普通备份任务。维护要遍历仓库索引、重写元数据,对 CPU 和内存的要求都不低,又因为由 node-agent 在节点上执行,可能直接和业务 Pod 抢资源。规避手段是三层:给执行维护的 Pod 设明确的 CPU 和内存 limit,防止吃满触发驱逐;把维护排到业务低峰窗口,并设执行超时;在维护期间观察节点负载与业务延迟指标,异常时中断。可以接受的话,把维护安排在没有重要业务跑的独立节点上。判断影响是否可控,看维护执行窗口内的业务延迟曲线和节点内存水位,两者都没有明显抬升才算配置合适。

7. 小规模集群,只有几台机器,有没有必要上这一套

有必要,但要按规模裁剪,不要照搬大集群的配置。几台机器的集群最容易掉进"反正也没多少数据,手工重建就行"的坑——真出事时手工重建的成本远高于配一次备份。裁剪建议:保留 etcd 定时快照作为兜底,它成本最低;用 Velero 做带 PV 的文件级备份,备份目标放在集群外的一台独立机器或对象存储上,保证故障域隔离;数据库额外跑一份逻辑备份,用于精确找回单表数据。演练可以简化成每季度一次,只验证核心服务能否恢复、数据能否读出来。需要提醒的是,小规模集群往往没有专职运维,备份任务失败没人看,所以告警一定要配,失败要能第一时间发现。

结论:先把最坏场景写清楚,再倒推备份方案

判断一套 K8s 备份方案是否成立,方法是从最坏场景倒推。如果最坏情况是"整个机房不可用",那么备份必须异地,且备份仓库与源集群在机房、存储系统、管理凭据三个维度上都隔离;如果最坏情况是"某个人误删了一个命名空间",那么方案必须具备命名空间级恢复能力,etcd 快照在这条路上直接出局;如果最坏情况是"数据库单表被写坏",那么只有应用逻辑备份能救,卷快照和 etcd 快照都没用。

把这三类场景写下来,逐条对照方案能否覆盖,缺口就是下一步要做的事。Velero 在这套体系里的位置很明确:它解决按命名空间的恢复、PV 的文件级备份、以及跨集群迁移,是 etcd 快照的补充而不是替代。真正决定备份有没有效的,是每季度那次恢复演练里四项验证能否全过——备份任务日志里的 Completed 从来不是证据,能恢复出来的数据才是。

Kubernetes 备份与 Velero 配置要点的资料出处

本文关于备份路径划分、组件职责与配置判断的表述,参考以下公开资料:Velero 官方文档中关于备份与恢复、BackupRepository 仓库维护、node-agent 与旧版 restic 的关系、CSI 卷快照支持、备份钩子注解、恢复时 StorageClass 映射与已有资源覆盖策略的说明;Kubernetes 官方文档中关于 etcd 备份与恢复、持久卷、Volume Snapshot 与 CSI 驱动能力的章节;etcd 官方运维文档中的灾难恢复部分;以及一万网络官网公布的服务器租用、裸金属与一万云产品节点与价格信息(以官网实时价为准)。文中涉及的耗时、带宽与资源占用均为定性描述,具体数值需结合自身环境实测确认。


上一篇:2026 服务器租用自建检索服务 Solr 落地全解:集合分片、缓存命中与提交策略六维对比 + 避坑避雷手册

下一篇:《内存不动只换 CPU 值不值 700 元:俄罗斯服务器四档里 02→03 这一跳该怎么判断》