在 Kubernetes 的存储管理中,PVC(PersistentVolumeClaim) 和 PV(PersistentVolume) 是最核心的概念之一。很多开发者和运维人员在实践中都会产生一个疑问:当我们删除一个 PVC 之后,与之绑定的 PV 会怎样?是跟着一起消失,还是被保留下来?
今天,我们就通过一个完整的实操案例,带你彻底理解 Kubernetes PV 的 Reclaim Policy(回收策略),并手把手教你如何进行验证。
1、实验目标
- 理解 PV 的
ReclaimPolicy 三种类型:Retain、Delete 以及已废弃的 Recycle。
- 通过实际操作,验证删除 PVC 后 PV 的状态变化。
- 掌握不同回收策略在生产环境中的适用场景。
2、实验环境
- Kubernetes 集群:版本 v1.24+,可使用 kubeadm 搭建或 Minikube。
- 命令行工具:已配置
kubectl。
- 存储类型:为方便本地测试,本例使用 NFS 作为后端存储,你也可以使用
hostPath 类型。
环境概况
[root@k8s-master01 ~]# kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master01.dinginx.org Ready control-plane 41h v1.35.0 11.0.1.10 <none> Ubuntu 22.04.2 LTS 5.15.0-160-generic docker://28.4.0
k8s-node01.dinginx.org Ready <none> 41h v1.35.0 11.0.1.11 <none> Ubuntu 22.04.5 LTS 5.15.0-164-generic docker://28.4.0
k8s-node02.dinginx.org Ready <none> 41h v1.35.0 11.0.1.12 <none> Ubuntu 22.04.5 LTS 5.15.0-164-generic docker://29.1.3
k8s-node03.dinginx.org Ready <none> 41h v1.35.0 11.0.1.13 <none> Ubuntu 22.04.2 LTS 5.15.0-173-generic docker://27.5.1
[root@k8s-master01 ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy ok
3、操作步骤
3.1 创建 PV
首先,我们创建一个 PV,并将其回收策略显式地设置为 Retain。
[root@k8s-master01 /data/manifests/pv]# cat 01-pv-ReclaimPolicy.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: dinginx-pv-ReclaimPolicy
spec:
accessModes:
- ReadWriteOnce
nfs:
path: /data/nfs-server/pv/dinginx001
server: 11.0.1.8
# 回收策略
# Delete:PVC 删除 → PV 和存储资源同时删除
# Retain:PVC 删除 → PV 保留,数据不丢失,需手动清理
# Recycle:旧版本 Kubernetes 的简单回收,已废弃
persistentVolumeReclaimPolicy: Retain
capacity:
storage: 5Gi
说明:persistentVolumeReclaimPolicy 字段决定了 PV 在其绑定的 PVC 被删除后的处理方式。
回收策略概述
1.回收策略概述
Retain:
“保留回收”策略允许手动回收资源,删除pvc时,pv仍然存在,并且该卷被视为“已释放(Released)”。
在管理员手动回收资源之前,使用该策略其他Pod将无法直接使用。
温馨提示:
(1)在k8s1.15.12版本测试时,删除pvc发现nfs存储卷的数据并不会被删除,pv也不会被删除;
Delete:
对于支持删除回收策略的卷插件,k8s将删除pv及其对应的数据卷数据。建议使用动态存储类(sc)实现,才能看到效果哟!
对于AWS EBS, GCE PD, Azure Disk, or OpenStack Cinder等存储卷会被删除。
温馨提示:
(1)在k8s1.15.12版本测试时,在不使用sc时,则删除pvc发现nfs存储卷的数据并不会被删除;
(2)在k8s1.15.12版本测试时,在使用sc后,可以看到删除效果哟;
Recycle:
对于“回收利用”策略官方已弃用。相反,推荐的方法是使用[动态资源调配](https://yunpan.plus/f/47-1)。而动态存储类已经不支持该类型啦!
如果基础卷插件支持,回收回收策略将对卷执行基本清理(rm -rf /thevolume/*),并使其再次可用于新的声明。
温馨提示,在k8s1.15.12版本测试时,删除pvc发现nfs存储卷的数据被删除。
创建资源并查看
[root@k8s-master01 /data/manifests/pv]# kubectl apply -f 01-pv-ReclaimPolicy.yaml
persistentvolume/dinginx-pv-reclaimpolicy created
[root@k8s-master01 /data/manifests/pv]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
dinginx-pv-reclaimpolicy 5Gi RWO Retain Available <unset> 3s
3.2 创建 PVC 并绑定 PV
接着,创建一个 PVC 来申请存储,它会自动绑定到我们刚创建的、状态为 Available 的 PV 上。
[root@k8s-master01 /data/manifests/pvc]# cat 03-pvc-reclaimpolicy.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-reclaimpolicy
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
[root@k8s-master01 /data/manifests/pvc]# kubectl apply -f 03-pvc-reclaimpolicy.yaml
[root@k8s-master01 /data/manifests/pvc]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
persistentvolume/dinginx-pv-reclaimpolicy 5Gi RWO Retain Bound default/pvc-reclaimpolicy <unset> 2m57s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
persistentvolumeclaim/pvc-reclaimpolicy Bound dinginx-pv-reclaimpolicy 5Gi RWO <unset> 7s
✅ 观察 PV 状态变为 Bound,并且 CLAIM 字段显示已被名为 pvc-reclaimpolicy 的 PVC 占用。
3.3 删除 PVC 并验证 PV
现在,我们来执行关键操作:删除这个 PVC。
[root@k8s-master01 /data/manifests/pvc]# kubectl delete pvc pvc-reclaimpolicy
persistentvolumeclaim “pvc-reclaimpolicy” deleted from default namespace
# pv状态变为released状态,PV 数据保留,不自动删除,需手动清理或重新绑定
[root@k8s-master01 /data/manifests/pvc]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
dinginx-pv-reclaimpolicy 5Gi RWO Retain Released default/pvc-reclaimpolicy <unset> 55s
可以看到,PV 的状态从 Bound 变成了 Released。这是因为它的回收策略是 Retain。不同的回收策略会导致不同的结果:
| ReclaimPolicy |
PV 状态 |
描述 |
| Retain |
Released |
PV 和数据均被保留,不会自动删除。需要管理员手动清理后才能重新使用。 |
| Delete |
删除/Terminating |
PV 及其对应的底层存储资源(如云硬盘)会被自动删除。 |
| Recycle |
Released |
PV 会尝试清理数据并重置状态(此策略已废弃,不推荐使用)。 |
3.4 手动清理 Retain 类型 PV
对于 Retain 策略的 PV,在删除 PVC 后,其状态为 Released。此时,它无法被新的 PVC 直接绑定。我们尝试创建一个同名的新 PVC:
# 再次创建pvc无法关联pv
[root@k8s-master01 /data/manifests/pvc]# kubectl apply -f 03-pvc-reclaimpolicy.yaml
persistentvolumeclaim/pvc-reclaimpolicy created
[root@k8s-master01 /data/manifests/pvc]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
persistentvolume/dinginx-pv-reclaimpolicy 5Gi RWO Retain Released default/pvc-reclaimpolicy <unset> 4m10s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
persistentvolumeclaim/pvc-reclaimpolicy Pending <unset> 4s
新 PVC 的状态为 Pending,因为可用的 PV (dinginx-pv-reclaimpolicy) 仍然记录着对旧 PVC 的引用 (claimRef)。要使它恢复可用,需要手动清理这个引用,这是运维中常见的操作。
# 需执行手动清理操作
[root@k8s-master01 /data/manifests/pvc]# kubectl patch pv dinginx-pv-reclaimpolicy -p '{"spec":{"claimRef": null}}'
persistentvolume/dinginx-pv-reclaimpolicy patched
# 查看pv已重新关联pvc
[root@k8s-master01 /data/manifests/pvc]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
persistentvolume/dinginx-pv-reclaimpolicy 5Gi RWO Retain Bound default/pvc-reclaimpolicy <unset> 5m53s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
persistentvolumeclaim/pvc-reclaimpolicy Bound dinginx-pv-reclaimpolicy 5Gi RWO <unset> 107s
✅ 执行 kubectl patch 命令清除 claimRef 后,PV 状态恢复为 Available 并迅速被等待中的 PVC 重新绑定,现在 PV 可以被新的 PVC 正常使用了。
4、原理解释
-
PV 与 PVC 的关系
- PVC 是用户对存储资源的“申请单”。
- PV 是集群中实际的存储资源“实体”。
- 当 PVC 被删除时,PV 的命运就由其
ReclaimPolicy 决定。
-
ReclaimPolicy 含义
Delete:PVC 删除后,PV 和底层存储资源一并删除。适用于云平台上的动态供给卷,节约资源。
Retain:PVC 删除后,PV 和数据都被保留。适用于包含重要数据、需要手动审查或备份的场景。
Recycle:PVC 删除后,PV 会尝试清空数据以便复用。此策略已被废弃,由 Dynamic Provisioning(动态供给)配合 Delete 策略取代。
-
考试与实践重点
- 在 CKA 等认证考试中,PV/PVC 的生命周期、回收策略及状态验证是常考点。
- 运维中需要熟练使用
kubectl get pv/pvc 并理解输出字段的含义,特别是 STATUS、CLAIM 和 RECLAIM POLICY。
5、总结
通过本次实验,我们可以清晰地得出结论:
- 删除 PVC 后,PV 是否保留,完全由其
ReclaimPolicy 决定。
Retain 策略可以安全保留数据,适合重要数据的场景,但需要后续手动管理。
Delete 策略可以自动回收资源,适合临时数据或云环境,避免资源浪费。
- 掌握
kubectl get pv 查看状态,以及 kubectl patch pv 手动管理 Retain 类型 PV 的方法,是日常运维的必备技能。
希望这篇实战解析能帮助你彻底理解 Kubernetes 的存储回收机制。如果你在部署或管理 Kubernetes 集群时遇到其他存储相关问题,欢迎在技术社区交流探讨。
官方参考链接