找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4955

积分

0

好友

656

主题
发表于 5 天前 | 查看: 29| 回复: 0

在 Kubernetes 的存储管理中,PVC(PersistentVolumeClaim)PV(PersistentVolume) 是最核心的概念之一。很多开发者和运维人员在实践中都会产生一个疑问:当我们删除一个 PVC 之后,与之绑定的 PV 会怎样?是跟着一起消失,还是被保留下来?

今天,我们就通过一个完整的实操案例,带你彻底理解 Kubernetes PV 的 Reclaim Policy(回收策略),并手把手教你如何进行验证。

1、实验目标

  1. 理解 PV 的 ReclaimPolicy 三种类型:RetainDelete 以及已废弃的 Recycle
  2. 通过实际操作,验证删除 PVC 后 PV 的状态变化。
  3. 掌握不同回收策略在生产环境中的适用场景。

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、原理解释

  1. PV 与 PVC 的关系

    • PVC 是用户对存储资源的“申请单”。
    • PV 是集群中实际的存储资源“实体”。
    • 当 PVC 被删除时,PV 的命运就由其 ReclaimPolicy 决定。
  2. ReclaimPolicy 含义

    • Delete:PVC 删除后,PV 和底层存储资源一并删除。适用于云平台上的动态供给卷,节约资源。
    • Retain:PVC 删除后,PV 和数据都被保留。适用于包含重要数据、需要手动审查或备份的场景。
    • Recycle:PVC 删除后,PV 会尝试清空数据以便复用。此策略已被废弃,由 Dynamic Provisioning(动态供给)配合 Delete 策略取代。
  3. 考试与实践重点

    • 在 CKA 等认证考试中,PV/PVC 的生命周期、回收策略及状态验证是常考点。
    • 运维中需要熟练使用 kubectl get pv/pvc 并理解输出字段的含义,特别是 STATUSCLAIMRECLAIM POLICY

5、总结

通过本次实验,我们可以清晰地得出结论:

  • 删除 PVC 后,PV 是否保留,完全由其 ReclaimPolicy 决定。
  • Retain 策略可以安全保留数据,适合重要数据的场景,但需要后续手动管理。
  • Delete 策略可以自动回收资源,适合临时数据或云环境,避免资源浪费。
  • 掌握 kubectl get pv 查看状态,以及 kubectl patch pv 手动管理 Retain 类型 PV 的方法,是日常运维的必备技能。

希望这篇实战解析能帮助你彻底理解 Kubernetes 的存储回收机制。如果你在部署或管理 Kubernetes 集群时遇到其他存储相关问题,欢迎在技术社区交流探讨。

官方参考链接




上一篇:从源码看Claude Code的记忆系统:为什么说它比想象中初级,以及如何用memsearch打破孤岛?
下一篇:Claude Code源码再泄露:.npmignore配置缺失,一年内两次“自爆”打脸自家Harness理念
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-7 17:26 , Processed in 0.728979 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表