
状态服务运行在容器中,数据的生命线不在镜像里,在挂载的 Volume 上。Pod 可以任意重建、迁移和缩容,但是 PVC 中的数据库表、日志文件以及队列位置信息和配置元数据不能丢失。仅仅依靠存储卷本身并不能起到备份的作用,快照成功也不能保证能够恢复——缺少的是「资源对象 + 持久卷数据」绑定点的恢复能力。
Volume 挂载层首先要做好以下几件事:StatefulSet 使用稳定的 PVC 模板,根据读写负载选择 ReadWriteOnce 或者 ReadWriteMany;数据库类负载在打快照之前要进行静默(fsfreeze、flush、锁表或者停写钩子),防止出现“拔电源式”的崩溃副本。CSI 快照可以和同存储后端一起秒级打点,Restic/Kopia 文件级备份可以用作跨集群、异构存储的安全措施。
Velero 把两件事合在一起了:API 对象(Deployment、Service、Secret、PVC 声明、RBAC、CRD)存到对象存储中,PV 数据通过 CSI 快照或者 Node Agent 文件备份来保存。在恢复的时候除了还原 YAML 之外还会根据备份元数据重新创建 PVC、克隆快照和挂载回原来的路径上。
恢复演练要真实进行,不能在生产命名空间里裸恢复:
- 映射到隔离命名空间(
--namespace-mappings prod:prod-drill) - 把Secret的生产方式改成和真实的流量一起进入外部队列
- 通过创建恢复点来等待Pod就绪
- 检查数据行数量、文件数量、事务日志以及读写探测
- RTO/RPO、清空
分布式有状态集群(如Etcd、Cassandra和Kafka等)不能仅依靠单一卷的快照来保证数据的一致性,还需要结合应用程序层面的导出或者主节点的一致性快照来进行备份,否则在恢复之后会出现偏移量不一致以及副本分裂的情况。
备份状态为Completed才算是及格线,而部分失败、CSI超时、PVC没有进入备份、StorageClass不在目标集群、fsGroup权限异常等问题只有在实际测试中才会出现。
有状态应用容灾底线是打快照,在隔离环境中可以按时间恢复、数据一致、业务正常运行。Volume 挂载解决了运行时的持久化问题,Velero 解决了编排级别的迁移和恢复问题,定期进行真实的演练使两者形成闭环成为可用的备份方案。