缩容与删除时卷怎么处理
StatefulSet 的 persistentVolumeClaimRetentionPolicy 决定由模板自动创建的 PVC 在缩容(whenScaled)或删除整个 StatefulSet(whenDeleted)时是保留还是删除,两个维度的默认值都是 Retain,也就是保留数据。选择 Delete 会让缩容即删除对应卷,属于高风险配置。需要注意的是,手工创建的 PVC 不在这套策略的管理范围内,需要自行处理。
基本信息
| 适用对象 | 支持该字段的较新版本 StatefulSet |
|---|---|
| 关键字段 | spec.persistentVolumeClaimRetentionPolicy |
| 取值 | whenDeleted 与 whenScaled,各自可取 Retain(默认)或 Delete |
| 作用对象 | 由 volumeClaimTemplates 自动创建的 PVC |
| 范围提醒 | 手工创建的 PVC 不受该策略影响 |
典型使用场景
- 生产数据库:保持默认保留策略,避免缩容误删数据
- 临时测试环境:配置删除策略,让回收更彻底、少留垃圾
- 发布回滚场景:确认缩容不会连带删卷,保证数据可回退
- 容量清理:定期检查保留策略下残留的卷,安排回收
- 容器化改造:把原先手工管理的数据卷纳入策略统一治理
策略配置
策略配置
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db
spec:
replicas: 3
serviceName: db-headless
persistentVolumeClaimRetentionPolicy:
whenDeleted: Retain # 删除 StatefulSet 时:Retain 或 Delete
whenScaled: Retain # 缩容时:Retain 或 Delete
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 100Gi核对与手工清理
核对与手工清理
kubectl get sts db -o jsonpath='{.spec.persistentVolumeClaimRetentionPolicy}'
kubectl get pvc -l app=db # 看残留卷与状态
kubectl get sts db -o jsonpath='{.spec.replicas}' # 参照副本数判断哪些编号应存在
kubectl describe pvc data-db-2 # 确认无 Pod 挂载后再删除策略取值的后果
| 配置 | 触发场景 | 后果 |
|---|---|---|
| whenScaled: Retain | 缩容时 | 保留卷与数据,需手工回收 |
| whenScaled: Delete | 缩容时 | 卷随副本一并删除,数据不可恢复 |
| whenDeleted: Retain | 删除 StatefulSet | 保留卷,便于重建后继续使用 |
| whenDeleted: Delete | 删除 StatefulSet | 连同卷一起清理,回收彻底 |
生产环境建议保持默认保留:缩容往往发生在扩容回退或发布回滚的场景,此时删卷等于直接删掉数据。
保留策略会给存储留下残留卷:需要有定期清理与巡检流程,否则容量与费用会随发布次数缓慢增长。
回收残留卷前先确认三件事:没有 Pod 正在挂载、数据不需要保留、对应的备份或快照是否齐备;三条都确认后再删除,能避免多数误删事故。