题干与适用场景
Kubernetes v1.36 将 VolumeGroupSnapshot、VolumeGroupSnapshotContent 和 VolumeGroupSnapshotClass 提升为 groupsnapshot.storage.k8s.io/v1。面试官希望你说明:多个 PersistentVolumeClaim 如何形成同一恢复点、CSI 驱动承担什么职责,以及快照并不等于应用一致性时如何补齐方案。
面试官考察点
- 能否区分崩溃一致性、应用一致性和最终一致性。
- 能否解释 Kubernetes 控制器、外部快照控制器与 CSI 驱动的边界。
- 能否识别只支持 CSI 驱动、容量与区域约束、快照生命周期等前置条件。
- 能否把恢复目标、演练指标和失败回滚写成可执行流程。
回答前需要澄清的问题
先确认数据库是否支持在线备份、卷是否都由同一个 CSI 驱动管理,以及业务的 RPO、RTO 和跨可用区要求。还要确认快照由存储系统保证写入顺序,还是需要应用先 flush、冻结或暂停写入。
30 秒回答框架
我会把方案分成四层:应用层先建立一致性点;Kubernetes 层用 VolumeGroupSnapshot 记录一组 PVC;CSI 驱动在存储侧创建组快照;恢复层把快照恢复成新卷并做校验。该 API 在 v1.36 GA,但只解决卷组的崩溃一致性编排,不能替代数据库日志、密钥管理和定期恢复演练。
分步骤深入解答
1. 建立一致性点
数据库先执行可证明的备份动作,例如短暂冻结写入、flush WAL 或生成检查点。记录事务位点、快照时间和应用版本,随后再创建卷组快照。若只调用存储快照而没有应用协作,恢复结果可能是磁盘层一致、业务层不一致。
2. 创建并观测组快照
为同一数据库实例的 PVC 创建 VolumeGroupSnapshot,并等待状态中的 ready 信号。控制器负责对象生命周期,CSI 驱动负责具体存储操作;驱动必须支持卷组快照扩展 API。对每个成员卷记录快照句柄、容量、区域和错误原因,避免把部分成功误判为可恢复。
3. 恢复与校验
恢复时为每个成员创建新 PVC,保持文件系统和数据库卷的映射关系。先在隔离环境启动数据库,校验 WAL 位点、表数量、校验和及关键业务查询,再切换流量。跨区域恢复要验证快照副本是否可读,以及 CSI 驱动对目标拓扑的限制。
4. 运维边界
设置保留策略、加密与访问控制,监控快照创建耗时和失败率。把快照当作恢复材料而非永久归档:定期导出到独立介质,并通过演练测量实际 RPO、RTO。删除 PVC、快照对象或存储后端对象前,要确认回收策略不会误删仍在使用的恢复点。
高质量示范回答
我会先定义恢复目标,再选择同一 CSI 驱动管理的 PVC 集合。应用侧生成检查点并记录 WAL 位点,必要时短暂停写;随后创建 groupsnapshot.storage.k8s.io/v1 的 VolumeGroupSnapshot。控制器只负责 Kubernetes 对象协调,真正的组快照语义由 CSI 驱动和存储系统提供,所以我会检查驱动版本、区域、容量和快照配额,并把每个成员的 ready 状态纳入告警。
恢复流程不会直接覆盖生产卷,而是从组快照创建新 PVC,在隔离命名空间启动数据库,验证 WAL、校验和与业务查询,再执行切换。若某个成员失败,整组标记为不可用并回滚,不把部分快照宣称为完整备份。最后用定期演练证明 RPO、RTO,配合独立归档、加密和最小权限,防止快照成为单点或泄露源。
常见错误
- 把 GA 误解为所有存储驱动都自动支持;该能力依赖 CSI 驱动和存储实现。
- 只描述创建快照,不说明组内成员的部分失败、拓扑和生命周期。
- 把崩溃一致性当成应用一致性,遗漏 flush、WAL 或检查点。
- 只保存快照元数据,从未在隔离环境启动并验证恢复结果。
追问及应对
如果一个成员卷创建失败怎么办?
将组快照标记为不可用,保留错误事件和已创建句柄,清理孤儿资源后重试。恢复流程只接受完整成员集合,并把部分成功计入告警和容量审计。
为什么不用每个 PVC 单独创建快照?
单卷快照缺少共同的恢复点,跨卷写入顺序可能不一致。组快照把成员集合和组级操作交给存储系统,仍需应用层检查点来获得业务一致性。
如何证明方案真的满足 RPO 和 RTO?
按固定周期在隔离集群恢复,记录从检查点到可查询服务的时间、数据位点差异和失败率。演练结果进入发布门禁;未达到阈值就调整快照频率、归档路径或切换流程。