3、存储变更场景分析:在线扩容、存储类型迁移、卷加密启用/禁用、回收策略变更
Kubernetes 存储变更并非单一操作,而是涉及多个维度的生命周期管理。在生产环境中,最常见的变更场景包括:在线扩容、存储类型迁移、卷加密启用/禁用以及回收策略变更。每种变更对数据一致性和集群稳定性都有不同的影响,需要针对性地设计门禁策略。
3.1 变更场景总览与风险矩阵
下表从数据风险、中断时长、回滚复杂度三个维度,对四种核心变更场景进行对比,帮助团队在制定门禁规则时确定优先级。
| 变更场景 | 数据风险等级 | 预期中断时长 | 回滚复杂度 | 典型触发条件 |
|---|---|---|---|---|
| 在线扩容 | 低(仅扩展元数据) | 秒级(CSI 驱动处理) | 低(缩容受限) | PVC 存储利用率 > 80% |
| 存储类型迁移 | 高(全量数据拷贝) | 分钟~小时级 | 高(需保留源卷) | 存储性能升级、成本优化 |
| 卷加密启用/禁用 | 极高(密钥管理失败) | 分钟级(重加密过程) | 极高(需密钥备份) | 合规审计、安全策略变更 |
| 回收策略变更 | 中(误删 PV 风险) | 无中断(仅元数据) | 低(策略可逆) | 存储资源池规划调整 |
3.2 在线扩容:最频繁的存储变更
在线扩容是 Kubernetes 中最常见的存储操作,通常由 PVC 的 storage 字段变更触发。CSI 驱动负责在存储后端执行卷扩展,并在文件系统层面完成 resize。
3.2.1 扩容流程与门禁检查点
- 准入检查:确认 StorageClass 的
allowVolumeExpansion: true。 - 容量校验:新容量必须大于当前容量,且不超过存储池配额。
- Pod 状态检查:如果卷被 Pod 使用中,需确保 Pod 所在节点支持在线扩容(通常需要重启 Pod 才能识别新大小)。
- 文件系统扩展:CSI 驱动调用
NodeExpandVolume完成文件系统 resize。
storage 值的变更都应被 Admission Webhook 直接拒绝。
# 在线扩容示例:修改 PVC 的 storage 字段
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi # 从 50Gi 扩容到 100Gi
storageClassName: csi-hostpath-sc
3.3 存储类型迁移:跨存储后端的数据搬迁
存储类型迁移通常涉及将数据从一个 StorageClass(如 HDD 后端)迁移到另一个 StorageClass(如 SSD 后端)。Kubernetes 本身不提供原生的迁移机制,通常需要借助第三方工具(如 Velero、Restic)或存储厂商的卷克隆/快照功能。
3.3.1 迁移流程与回滚策略
下图展示了基于卷快照的存储类型迁移流程,以及回滚时的数据恢复路径。
3.4 卷加密启用/禁用:最高风险变更
卷加密通常在 StorageClass 层面通过 parameters 字段配置,例如使用 csi.storage.k8s.io/fstype: ext4 配合 KMS 密钥。启用或禁用加密需要重新创建卷,无法原地修改。
3.4.1 加密变更的不可逆性
Kubernetes 不支持对已有卷原地启用或禁用加密。任何加密状态的变更都必须通过“创建新卷 + 数据迁移”的方式完成。这意味着加密变更本质上是一次存储类型迁移,但额外增加了密钥管理的复杂度。
# 加密 StorageClass 示例(使用 AWS EBS CSI 驱动)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-encrypted-sc
provisioner: ebs.csi.aws.com
parameters:
type: gp3
encrypted: "true"
kmsKeyId: "arn:aws:kms:us-west-2:123456789012:key/abc123"
3.4.2 门禁检查清单
- 密钥可用性:KMS 密钥必须处于“启用”状态,且集群节点有权限访问。
- 密钥轮换策略:如果启用加密,需确认密钥轮换周期是否满足合规要求。
- 禁用加密风险:禁用加密意味着数据以明文存储,需通过安全审计门禁。
- 回滚密钥:如果加密参数错误,必须保留旧密钥直到所有依赖卷被删除或重新加密。
3.5 回收策略变更:Retain / Delete / Recycle
回收策略(Reclaim Policy)控制 PV 被释放后的行为。变更回收策略是元数据操作,不会影响正在使用的卷,但会改变 PV 的生命周期终结行为。
3.5.1 策略变更影响对比
| 回收策略 | 变更前状态 | 变更后行为 | 数据保留 | 回滚方式 |
|---|---|---|---|---|
| Delete → Retain | PVC 删除后 PV 自动删除 | PVC 删除后 PV 保留 | 是 | 手动删除 PV 或改回 Delete |
| Retain → Delete | PVC 删除后 PV 保留 | PVC 删除后 PV 自动删除 | 否(数据丢失) | 无法回滚(数据已删除) |
| Recycle → 其他 | PVC 删除后 PV 被清理并重用 | 根据新策略执行 | 取决于新策略 | 需重建 PV |
Retain 变更为 Delete 是不可逆的。一旦 PVC 被删除,PV 和数据将立即被清理。门禁应强制要求:变更前必须确认 PVC 不会被删除,或先创建数据快照。
3.5.2 回收策略变更的自动化门禁
通过 Admission Webhook 可以拦截回收策略变更请求,并执行以下检查:
- PV 状态检查:如果 PV 处于
Bound状态,禁止从Retain变更为Delete。 - PVC 关联检查:如果存在关联的 PVC,变更必须经过人工审批。
- 数据备份确认:在变更前要求用户提供备份证明(如 Velero 备份记录)。
# 回收策略变更示例:将 PV 从 Retain 改为 Delete
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-data
spec:
persistentVolumeReclaimPolicy: Delete # 原为 Retain
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/pv
3.6 变更场景综合门禁矩阵
下表汇总了四种变更场景的门禁检查项,可作为 Admission Webhook 的规则配置参考。
| 变更场景 | 必须检查项 | 建议检查项 | 自动拦截条件 |
|---|---|---|---|
| 在线扩容 | allowVolumeExpansion=true | 存储池配额、节点磁盘余量 | 新容量 ≤ 当前容量 |
| 存储类型迁移 | 源卷快照存在、目标 StorageClass 可用 | 迁移窗口期、应用只读状态 | 源卷与目标卷在同一存储后端 |
| 卷加密启用/禁用 | KMS 密钥状态、密钥权限 | 合规审计标签、密钥轮换计划 | 密钥处于“禁用”或“待删除”状态 |
| 回收策略变更 | PV 状态、PVC 关联 | 数据备份记录、变更审批 | Retain → Delete 且 PV 为 Bound |