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 扩容流程与门禁检查点
- 准入检查: 确认 StorageClass 中
allowVolumeExpansion: true;确认当前 PVC 状态为Bound。 - 控制器扩容: K8s 调用 CSI Controller 的
ControllerExpandVolume,后端存储卷大小变更。 - 节点扩容: Kubelet 在挂载节点上调用
NodeExpandVolume,文件系统感知新容量。 - 验证: 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 迁移流程与风险点
- 源卷快照: 创建 CSI 快照或 Velero 备份,确保数据一致性。
- 新卷创建: 在目标存储类下创建新 PVC,容量与源卷一致或更大。
- 数据拷贝: 通过 Rsync、Restic 或 CSI 克隆功能完成数据同步。
- 挂载切换: 更新 Deployment/StatefulSet 的 PVC 引用,触发 Pod 重建。
- 验证与清理: 确认数据完整性后,删除源卷快照和旧 PVC。
压测指标: 迁移吞吐量(MB/s)、迁移时长(分钟/TB)、RPO(数据丢失窗口)、RTO(服务恢复时间)。对于 1TB 以上的 PVC,建议在沙盘中模拟网络限速(如 100Mbps)下的迁移行为,评估对生产业务的影响。
3.6 变更场景关系图
下图展示了四种 PVC 变更场景在 K8s 控制面与数据面的交互关系,以及门禁压测沙盘的介入位置:
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 变更操作前自动触发沙盘验证,通过后方可进入生产执行阶段。