在 Kubernetes 里删除一个 PVC,底层的数据盘居然也跟着没了——这不是 bug,而是一个默认配置的"陷阱"。
很多人在用 K8s 时都踩过这个坑:以为删除 PVC 只是释放逻辑资源,结果发现云盘数据也丢了。问题出在 StorageClass 的一个参数上:Reclaim Policy。这个看似不起眼的配置,默认是 Delete,意味着删除 PVC 会级联删除底层存储,生产数据说没就没。
今天来聊聊这个容易被忽略但影响重大的配置。
01Reclaim Policy 是什么?
简单来说,Reclaim Policy 决定了删除 PVC 后,PV 和底层云盘会发生什么。Kubernetes 提供三种回收策略:
•Delete(默认):删除 PVC 会连带删除 PV 和底层云盘,数据永久丢失
•Retain:删除 PVC 后,PV 会保留(状态变为 Released),底层云盘也保持不变
•Recycle(已废弃):PV 被清理后可以重新使用
用个比喻:Delete 就像删除电脑文件的同时把硬盘也格式化了;Retain 则是只删除文件索引,硬盘上的数据还在,可以恢复。
02为什么这个配置很危险?
问题在于,几乎所有主流云厂商的默认配置都是 Delete:
•AWS EBS:Delete
•GCP Persistent Disk:Delete
•阿里云 ESSD:Delete
•腾讯云 CBS:Delete
阿里云官方文档明确建议:"数据安全性要求高,推荐使用 Retain"。这个配置在 StorageClass 级别生效,意味着所有使用该 StorageClass 创建的 PVC 都会继承这个策略。一个默认配置,可能让整个集群的数据都面临风险。
03数据丢失的四种真实场景
1.误删 PVC 触发级联删除:执行 kubectl delete pvc my-data,以为只是删除逻辑资源,结果底层云盘也被删了。
2.Helm 升级触发 PVC 重建:Helm 升级时,如果 PVC 配置有变化,可能会触发重建。如果 reclaimPolicy 是 Delete,旧数据就没了。
3.Namespace 整体删除:kubectl delete namespace production 会删除命名空间内所有资源,包括 PVC。Delete 策略下,所有数据盘都会被清空。
4.误以为 Terminating 状态有保护:PVC 进入 Terminating 状态时,很多人以为还有机会恢复。实际上,如果 reclaimPolicy 是 Delete,最终还是会删除底层存储。
04如何排查风险?
先查看现有 PV 的策略:
kubectl get pv -o custom-columns=NAME:.metadata.name,RECLAIM_POLICY:.spec.persistentVolumeReclaimPolicy,STATUS:.status.phase
输出类似:
NAME RECLAIM_POLICY STATUS
pvc-5f8b7d9e-1234-5678-90ab-cdef12345678 Delete Bound
pvc-9a8b7c6d-4321-8765-fedc-ba9876543210 Retain Bound
如果看到大量 Delete,说明你的数据正处在风险中。
05如何修复?
修改已有 PV 的策略
对于已经存在的 PV,可以修改 reclaimPolicy:
kubectl patch pv <pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
修改后,PV 状态会变为 Released,但底层云盘会保留。
创建安全的 StorageClass
更好的做法是从源头解决问题,创建使用 Retain 策略的 StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard-retain
provisioner: diskplugin.csi.alibabacloud.com
reclaimPolicy: Retain # 关键配置
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
然后在新应用中使用这个 StorageClass:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
storageClassName: standard-retain
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
06最佳实践建议
1.生产环境用 Retain:对于生产数据,选择 Retain。宁愿手动清理,也不要自动删除。
2.测试环境可用 Delete:测试环境的数据不重要,可以用 Delete 自动清理,节省成本。
3.按业务场景区分
•数据库、对象存储:必须 Retain
•日志、临时文件:可以用 Delete
•缓存数据:根据重要性选择
4.建立审批流程:删除 PVC 需要多级审批,避免误操作。
5.定期备份不放松:即使用了 Retain,也要定期备份。Retain 是最后一道防线,不是替代备份。
07核心要点
1.默认配置很危险:所有云厂商默认都是 Delete
2.策略分三种:Delete(删盘)、Retain(保盘)、Recycle(已废弃)
3.风险场景:误删、Helm 升级、Namespace 删除、Terminating 状态
4.排查方法:kubectl get pv 查看当前策略
5.修复步骤:修改已有 PV + 创建安全 StorageClass
6.实践原则:生产用 Retain,测试用 Delete,按业务重要性选择
数据安全无小事。一个默认配置,可能让几年的业务数据瞬间丢失。建议今天就把集群里的 reclaimPolicy 检查一遍,该改的改,该创建的创建。
作者介绍:
我是老卢,一个在运维领域摸爬滚打了七年的90后,专注 k8s、DevOps、云原生、AIOps 技术。白天搬砖踩坑,晚上码字分享。相信技术改变生活,坚持输出有温度的文章。