首页/云/Kubernetes 速查/StatefulSet 的 PVC 保留策略

StatefulSet 的 PVC 保留策略

persistentVolumeClaimRetentionPolicy 决定缩容或删除 StatefulSet 时自动删除还是保留 PVC:默认全部保留,防止误删数据。

Kubernetes 速查云更新于 2026-10-13

缩容与删除时卷怎么处理

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 正在挂载、数据不需要保留、对应的备份或快照是否齐备;三条都确认后再删除,能避免多数误删事故。

易错点

  • 开启缩容删除又用缩容做回滚:回滚过程中数据被删除,事后无法恢复
  • 以为策略覆盖所有 PVC:手工创建的卷不在管理范围内,清理时容易漏掉或误删
  • 保留策略下没有清理流程:残留卷长期占用存储,容量与成本问题在数月后才显现
  • 删除 PVC 前不确认数据用途:卷删除后重新创建的同名卷会被重新供应,旧数据无法找回

数据来源与参考

  • Kubernetes 官方文档 · StatefulSet(PersistentVolumeClaim Retention)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌