3. PVC 变更场景分析:扩容、缩容、回收策略变更、存储类迁移

在 Kubernetes 生产环境中,PVC 的变更操作是引发存储故障与容量事故的高频风险点。本章围绕四种核心变更场景——扩容、缩容、回收策略变更、存储类迁移——逐一拆解其底层机制、风险特征与门禁压测要点。

3.1 场景总览与风险矩阵

四种变更场景在触发条件、底层依赖、数据面影响和回滚能力上存在显著差异。下表从 SRE 视角进行横向对比:

变更场景 触发方式 底层依赖 数据面影响 回滚能力 典型风险等级
扩容 修改 PVC spec.resources.requests.storage CSI Driver、后端存储卷扩展能力 仅元数据变更,数据不迁移 不支持缩容回滚 中
缩容 K8s 1.28+ 支持,需 Feature Gate CSI Driver、文件系统收缩能力 可能触发数据截断或文件系统损坏 不支持自动回滚 高
回收策略变更 修改 PV spec.persistentVolumeReclaimPolicy PV 状态机、存储后端回收行为 影响 PVC 删除时 PV 的最终处置 支持手动改回 中
存储类迁移 创建新 PVC 并迁移数据,或使用 CSI 迁移 CSI Migration、Velero/第三方工具 全量数据拷贝,IO 敏感 需保留源卷 极高
SRE 核心原则: 缩容与存储类迁移属于破坏性变更,必须在沙盘环境中通过压测验证数据完整性与恢复时间目标(RTO),严禁直接在生产环境执行未经门禁的变更操作。

3.2 扩容场景

扩容是 PVC 变更中最常见的操作,但并非所有存储后端都支持在线扩容。CSI Driver 必须实现 ControllerExpandVolume 和 NodeExpandVolume 两个 RPC 接口,且后端存储卷必须处于可扩展状态。

3.2.1 扩容流程与门禁检查点

  1. 准入检查: 确认 StorageClass 中 allowVolumeExpansion: true;确认当前 PVC 状态为 Bound。
  2. 控制器扩容: K8s 调用 CSI Controller 的 ControllerExpandVolume,后端存储卷大小变更。
  3. 节点扩容: Kubelet 在挂载节点上调用 NodeExpandVolume,文件系统感知新容量。
  4. 验证: PVC 状态变为 FileSystemResizePending 或直接完成;Pod 内 df -h 确认新容量。
压测要点: 在沙盘中模拟 100 个 PVC 并发扩容,观察 CSI Controller 的 QPS 瓶颈与后端存储的 IO 延迟变化。重点关注扩容过程中已有 Pod 的读写 IO 是否出现毛刺或超时。

3.3 缩容场景

K8s 从 v1.28 开始通过 Alpha Feature Gate VolumeShrink 支持 PVC 缩容。缩容操作具有不可逆的数据风险,因为文件系统收缩后,超出新容量范围的数据会被截断。

3.3.1 缩容前置条件与风险控制

前置条件 说明
Feature Gate 开启 API Server 和 Kubelet 均需启用 VolumeShrink
CSI Driver 支持 需实现 ControllerExpandVolume 且支持缩小容量
文件系统兼容 ext4/xfs 支持在线收缩,但需确保文件系统使用率低于目标容量
数据备份 缩容前必须通过 Velero 或快照完成全量备份
禁止行为: 不允许对挂载了数据库或日志文件的 PVC 执行缩容操作。缩容后文件系统元数据损坏将导致数据永久丢失,且无法通过常规手段恢复。

3.4 回收策略变更

PV 的回收策略(Reclaim Policy)决定 PVC 被删除后 PV 的最终命运。变更回收策略本身不触发数据移动,但会改变存储后端的生命周期管理行为。

3.4.1 三种回收策略对比

策略 PVC 删除后 PV 行为 数据保留 适用场景
Retain PV 保留,状态变为 Released 是 需要手动恢复或迁移数据的场景
Delete PV 及后端存储卷被自动删除 否 临时卷、CI/CD 环境
Recycle PV 被清理后重新可用(已弃用) 否 仅适用于 NFS 等静态卷

3.4.2 变更操作与门禁

回收策略变更仅需修改 PV 对象的 spec.persistentVolumeReclaimPolicy 字段。门禁压测应验证:

  • 从 Delete 改为 Retain 后,删除 PVC 不会误删后端存储卷。
  • 从 Retain 改为 Delete 后,删除 PVC 能正确触发后端卷删除。
  • 跨 CSI Driver 的回收策略变更是否被正确同步。

3.5 存储类迁移

存储类迁移是最复杂的 PVC 变更场景,涉及数据全量拷贝、新卷创建、挂载切换和旧卷清理。常见迁移路径包括:

  • CSI Migration: 从 in-tree 插件迁移到 CSI Driver。
  • 跨存储类迁移: 从 HDD 存储类迁移到 SSD 存储类。
  • 跨集群迁移: 使用 Velero 或 Restic 进行 PVC 数据迁移。

3.5.1 迁移流程与风险点

  1. 源卷快照: 创建 CSI 快照或 Velero 备份,确保数据一致性。
  2. 新卷创建: 在目标存储类下创建新 PVC,容量与源卷一致或更大。
  3. 数据拷贝: 通过 Rsync、Restic 或 CSI 克隆功能完成数据同步。
  4. 挂载切换: 更新 Deployment/StatefulSet 的 PVC 引用,触发 Pod 重建。
  5. 验证与清理: 确认数据完整性后,删除源卷快照和旧 PVC。
压测指标: 迁移吞吐量(MB/s)、迁移时长(分钟/TB)、RPO(数据丢失窗口)、RTO(服务恢复时间)。对于 1TB 以上的 PVC,建议在沙盘中模拟网络限速(如 100Mbps)下的迁移行为,评估对生产业务的影响。

3.6 变更场景关系图

下图展示了四种 PVC 变更场景在 K8s 控制面与数据面的交互关系,以及门禁压测沙盘的介入位置:

PVC 变更场景与门禁压测沙盘交互关系 PVC 对象 扩容 缩容 回收策略变更 存储类迁移 门禁压测沙盘 准入检查 → 并发压测 → 数据完整性验证 → 回滚演练 扩容 缩容 回收策略变更 存储类迁移 门禁压测沙盘

3.7 变更门禁压测清单

在沙盘环境中,针对每种变更场景,SRE 团队应执行以下门禁压测项目:

变更场景 压测项目 通过标准
扩容 并发扩容 50 个 PVC,模拟生产负载 扩容成功率 100%,Pod IO 无中断
扩容过程中 CSI Controller 重启 扩容状态自动恢复,最终一致
缩容 缩容至文件系统使用率 80% 的容量 缩容成功,数据完整性校验通过
缩容后立即执行文件系统一致性检查 fsck 无错误,元数据无损坏
回收策略变更 从 Delete 改为 Retain 后删除 PVC PV 保留,状态变为 Released
从 Retain 改为 Delete 后删除 PVC PV 和后端卷被正确删除
存储类迁移 1TB PVC 跨存储类迁移,限速 100Mbps 迁移完成,数据校验 MD5 一致
迁移过程中源卷故障 迁移任务失败,源卷数据不受影响
沙盘自动化建议: 将上述压测清单编写为 k6 或 LitmusChaos 实验,集成到 CI/CD 门禁流水线中。每次 PVC 变更操作前自动触发沙盘验证,通过后方可进入生产执行阶段。