• Kubernetes——PV与PVC


    目录

    一、PV和PVC详解

    二、PV和PVC生命周期

    2.1 Provisioning

    2.2 Binding

    2.3 Using

    2.4 Releasing

    2.5 Reclaiming

    2.6 Recycling

    三、访问模式

    3.1 PV 的访问模式(accessModes)

    3.2 PV的回收策略(persistentVolumeReclaimPolicy) 

    3.3 PV的状态

    四、实验验证

    4.1 安装nfs

    4.2 创建pv.yaml 

    4.3 PVC 

    4.4 实验

    五、关于statefulset 

    5.1  statefulset的启停顺序

    5.2 StatefulSet使用场景:

    一、PV和PVC详解

    当前,存储的方式和种类有很多,并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中,放了方便我们的使用和管理,Kubernetes提出了PV和PVC的概念,这样Kubernetes集群的管理人员就可以将注意力集中到Kubernetes集群中来,而无需操心后端的存储设备。

    1. pv : 相当于磁盘分区
    2. pvc: 相当于磁盘请求

    PersistentVolumeClaim(PVC)是用户存储的请求

    1. PVC的使用逻辑:在pod中定义一个存储卷(该存储卷类型为PVC),
    2. 定义的时候直接指定大小,pvc必须与对应的pv建立关系,
    3. pvc会根据定义去pv申请,而pv是由存储空间创建出来的。
    4. pv和pvc是kubernetes抽象出来的一种存储资源。
    • PV : 持久化卷的意思,是对底层的共享存储的一种抽象
    • PVC(Persistent Volume Claim)是持久卷请求于存储需求的一种声明(PVC其实就是用户向kubernetes系统发出的一种资源需求申请。)

    从上图可以看出,底层的存储可以使各种类型,包括NFS、Ceph、CIFS等等,而Kubernetes会把这些存储统一抽象为PV。PV,即Persistent Volume,是集群中配置的存储资源。PVC,即Persistent Volume Claim,是用户存储的请求,通常我们在一个Pod中定义一个存储卷,定义的时候会指定该存储卷的相关信息,比如空间大小、可读可写等属性。但是PVC并不是真正的存储空间,Pod的PVC和PV之间必须建立某种联系,这样才能使得Pod可以调用实际存储空间。

    1. apiVersion: v1
    2. kind: PersistentVolume
    3. metadata:
    4. name: pv2
    5. spec:
    6. nfs: # 存储类型,与底层真正存储对应
    7. capacity: # 存储能力,目前只支持存储空间的设置
    8. storage: 2Gi
    9. accessModes: # 访问模式
    10. storageClassName: # 存储类别
    11. persistentVolumeReclaimPolicy: # 回收策略

    使用了PV和PVC之后,工作可以得到进一步的细分:

    存储:存储工程师维护
    PV: kubernetes管理员维护
    PVC:kubernetes用户维护

    二、PV和PVC生命周期

    实际上,不管是PV,还是PVC,都遵循以下生命周期:

    2.1 Provisioning

    • Provisioning,即配置阶段。一般而言,PV的提供方式有两种——静态和动态。
    • 所谓静态提供,就是Kubernetes管理员创建多个PV,这些PV的存储空间等属性已经确定,并且已经和真实的存储设备进行了关联。Pod中的PVC可以根据需要请求这些PV。
    • 所谓动态提供,需要依托与StorageClass的支持,这时Kubernetes会尝试为PVC来动态的创建PV。这样做的好处是避免出现这种情况:部分PVC被分配给了远远超出其资源需求的PV、或者说系统存在很多资源较少的PV,但是一个资源需求很高的PVC缺无法被满足的情况。

    2.2 Binding

    在动态配置的情况下,用户创建或者已经创建了具有特定数量的PVC后,PVC与PV绑定的过程。
    如果没有满足PVC请求需求的PV,那么PVC将无法被创建,因此造成的结果就是相应的Pod也不会被创建。

    2.3 Using

    即PVC与PC绑定后,Pod对存储空间的使用过程。

    2.4 Releasing

    当Pod被删除或者对该PV的资源使用结束后,Kubernetes就会删除该PVC对象,相应的也会回收PV资源,这时的PV就会处于这种状态。但是此时的PV还需要处理完毕之前的Pod在该存储卷上存储信息后才能够被使用。

    2.5 Reclaiming

    PV的回收策略对被释放的PV的处理过程。

    2.6 Recycling

    根据配置,有时PV会被执行擦除操作,删除掉该存储空间上的所有信息,并且该存储资源也可以被再次使用。

    三、访问模式

    3.1 PV 的访问模式(accessModes)

    模式解释

    ReadWriteOnce

    (RWO)

    可读可写,但只支持被单个节点挂载。

    ReadOnlyMany

    (ROX)

    只读,可以被多个节点挂载。

    ReadWriteMany

    (RWX)

    多路可读可写。这种存储可以以读写的方式被多个节点共享。不是每一种存储都支持这三种方式,像共享方式,目前支持的还比较少,比较常用的是 NFS。在PVC绑定PV时通常根据两个条件来绑定,一个是存储的大小,另一个就是访问模式。

    3.2 PV的回收策略(persistentVolumeReclaimPolicy) 

    策略解释
    Retain不清理,保留Volume (需要手动清理)
    Recycle删除数据,即rm -rf /thevolumel*(只有NFS和HostPath支持)
    Delete删除存储资源,比如删除AWS EBS卷(只有AWS EBS,GCE PD,Azure Disk和Cinder支持)

    3.3 PV的状态

    状态解释
    Available可用
    Bound已经分配给PVC
    ReleasedPVC解绑但还未执行回收策略
    Failed发生错误

    四、实验验证

    4.1 安装nfs

    1. # 1、创建目录
    2. [root@k8s ~]# mkdir /root/data/{pv1,pv2,pv3} -pv
    3. # 2、暴露服务
    4. [root@k8s ~]# vim /etc/exports
    5. /root/data/pv1 192.168.223.0/24(rw,sync,no_root_squash)
    6. /root/data/pv2 192.168.223.0/24(rw,sync,no_root_squash)
    7. /root/data/pv3 192.168.223.0/24(rw,sync,no_root_squash)
    8. # 3、重启服务
    9. [root@k8s ~]# systemctl restart nfs

    4.2 创建pv.yaml 

    1. apiVersion: v1
    2. kind: PersistentVolume
    3. metadata:
    4. name: pv1
    5. spec:
    6. capacity:
    7. storage: 10Gi
    8. accessModes:
    9. - ReadWriteMany
    10. persistentVolumeReclaimPolicy: Retain #回收策略
    11. storageClassName: nfs #类别名字
    12. nfs: #nfs存储
    13. path: /root/data/pv1 #nfs挂载路径
    14. server: 192.168.15.30 #对应的nfs服务器
    15. [root@k8s pv]# kubectl apply -f pv.yaml
    16. persistentvolume/pv1 created
    17. [root@k8s pv]# kubectl get pv
    18. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    19. pv1 10Gi RWX Retain Available nfs 4s

    4.3 PVC 

    PVC是资源的申请,用来声明对存储空间、访问模式、存储类别需求信息。下面是资源清单文件:

    1. apiVersion: v1
    2. kind: PersistentVolumeClaim
    3. metadata:
    4. name: pvc
    5. namespace: dev
    6. spec:
    7. accessModes: # 访问模式
    8. selector: # 采用标签对PV选择
    9. storageClassName: # 存储类别
    10. resources: # 请求空间
    11. requests:
    12. storage: 5Gi

    PVC 的关键配置参数说明: 

    访问模式(accessModes)

    ​用于描述用户应用对存储资源的访问权限

    选择条件(selector)

    通过Label Selector的设置,可使PVC对于系统中己存在的PV进行筛选

    存储类别(storageClassName)

    PVC在定义时可以设定需要的后端存储的类别,只有设置了该class的pv才能被系统选出

    资源请求(Resources )

    描述对存储资源的请求

    4.4 实验

    1. apiVersion: v1
    2. kind: PersistentVolumeClaim
    3. metadata:
    4. name: pvc1
    5. namespace: dev
    6. spec:
    7. accessModes:
    8. - ReadWriteMany
    9. resources:
    10. requests:
    11. storage: 1Gi
    12. ---
    13. apiVersion: v1
    14. kind: PersistentVolumeClaim
    15. metadata:
    16. name: pvc2
    17. namespace: dev
    18. spec:
    19. accessModes:
    20. - ReadWriteMany
    21. resources:
    22. requests:
    23. storage: 1Gi
    24. ---
    25. apiVersion: v1
    26. kind: PersistentVolumeClaim
    27. metadata:
    28. name: pvc3
    29. namespace: dev
    30. spec:
    31. accessModes:
    32. - ReadWriteMany
    33. resources:
    34. requests:
    35. storage: 1Gi # 如果pvc大于pv,则绑定不上
    1. # 1、创建pvc
    2. [root@k8s ~]# kubectl create -f pvc.yaml
    3. persistentvolumeclaim/pvc1 created
    4. persistentvolumeclaim/pvc2 created
    5. persistentvolumeclaim/pvc3 created
    6. # 2、查看pvc
    7. [root@k8s ~]# kubectl get pvc -n dev -o wide
    8. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
    9. pvc1 Bound pv1 1Gi RWX 15s Filesystem
    10. pvc2 Bound pv2 2Gi RWX 15s Filesystem
    11. pvc3 Bound pv3 3Gi RWX 15s Filesystem
    12. # 3、查看pv
    13. [root@k8s k8s]# kubectl get pv -n dev
    14. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    15. pv1 1Gi RWX Retain Bound dev/pvc1 4m25s
    16. pv2 2Gi RWX Retain Bound dev/pvc2 4m25s
    17. pv3 3Gi RWX Retain Bound dev/pvc3

    创建pods.yaml, 使用pv 

    1. apiVersion: v1
    2. kind: PersistentVolume
    3. metadata:
    4. name: pv2
    5. spec:
    6. capacity:
    7. storage: 2Gi
    8. accessModes:
    9. - ReadWriteMany
    10. persistentVolumeReclaimPolicy: Retain
    11. storageClassName: nfs
    12. nfs:
    13. path: /root/data/pv2 #路径和地址全部指向nfs机器
    14. server: 192.168.223.30
    15. ---
    16. apiVersion: v1
    17. kind: PersistentVolume
    18. metadata:
    19. name: pv3
    20. spec:
    21. capacity:
    22. storage: 1Gi
    23. accessModes:
    24. - ReadWriteMany
    25. persistentVolumeReclaimPolicy: Retain
    26. storageClassName: nfs
    27. nfs:
    28. path: /root/data/pv3
    29. server: 192.168.223.30
    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: nginx
    5. labels:
    6. app: nginx
    7. spec:
    8. ports:
    9. - port: 80
    10. name: web
    11. clusterIP: none #无头service
    12. selector:
    13. app: nginx
    14. ---
    15. apiVersion: apps/v1
    16. kind: StatefulSet #一个接着一个创建
    17. metadata:
    18. name: web
    19. spec:
    20. selector:
    21. matchLabels:
    22. app: nginx
    23. serviceName: "nginx"
    24. replicas: 3
    25. template:
    26. metadata:
    27. labels:
    28. app: nginx
    29. spec:
    30. containers:
    31. - name: nginx
    32. image: wangyanglinux/myapp:v1
    33. ports:
    34. - containerPort: 80
    35. name: web
    36. volumeMounts:
    37. - name: www
    38. mountPath: /usr/share/nginx/html
    39. volumeClaimTemplates:
    40. - metadata:
    41. name: www
    42. spec:
    43. accessModes: [ "ReadWriteMany" ]
    44. storageClassName: "nfs"
    45. resources:
    46. requests:
    47. storage: 1Gi
    1. [root@k8s pv]# kubectl get pvc
    2. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    3. www-web-0 Bound pv3 1Gi RWX nfs 10s
    4. www-web-1 Bound pv2 2Gi RWX nfs 4s
    5. [root@k8s pv]# kubectl get pods
    6. NAME READY STATUS RESTARTS AGE
    7. web-0 1/1 Running 0 17s
    8. web-1 1/1 Running 0 11s
    9. web-2 0/1 Pending 0 5s
    10. [root@k8s pv]# kubectl get pods
    11. NAME READY STATUS RESTARTS AGE
    12. web-0 1/1 Running 0 28s
    13. web-1 1/1 Running 0 22s
    14. web-2 0/1 Pending 0 16s
    15. [root@k8spv]# kubectl get pods
    16. NAME READY STATUS RESTARTS AGE
    17. web-0 1/1 Running 0 29s
    18. web-1 1/1 Running 0 23s

    效果测试 

    1. #查看pv2的存储
    2. [root@k8s pv]# kubectl get pv
    3. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    4. pv2 2Gi RWX Retain Bound default/www-web-1 nfs 93s
    5. pv3 1Gi RWX Retain Bound default/www-web-0 nfs 93s
    6. [root@k8s pv]# kubectl describe pv pv2
    7. Name: pv2
    8. Labels:
    9. Annotations: pv.kubernetes.io/bound-by-controller: yes
    10. Finalizers: [kubernetes.io/pv-protection]
    11. StorageClass: nfs
    12. Status: Bound
    13. Claim: default/www-web-1
    14. Reclaim Policy: Retain
    15. Access Modes: RWX
    16. VolumeMode: Filesystem
    17. Capacity: 2Gi
    18. Node Affinity:
    19. Message:
    20. Source:
    21. Type: NFS (an NFS mount that lasts the lifetime of a pod)
    22. Server: 192.168.223.30
    23. Path: /root/data/pv2
    24. ReadOnly: false
    25. Events:
    26. #进入挂载目录创建index.html文件
    27. [root@k8s pv]# cd /root/data/pv2
    28. [root@k8s pv2]# ls
    29. [root@k8s pv2]# vim index.html
    30. [root@k8s pv2]# cat index.html
    31. aaaaaa
    32. [root@k8s pv2]# chmod 777 index.html
    33. [root@k8s pv2]# kubectl get pv -o wide
    34. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
    35. pv2 2Gi RWX Retain Bound default/www-web-1 nfs 4m20s Filesystem
    36. pv3 1Gi RWX Retain Bound default/www-web-0 nfs 4m20s Filesystem
    37. [root@k8s pv2]# kubectl get pods -o wide
    38. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    39. web-0 1/1 Running 0 4m14s 10.150.2.120 k8s-node-02
    40. web-1 1/1 Running 0 4m8s 10.150.1.96 k8s-node-01
    41. web-2 0/1 Pending 0 4m2s
    42. [root@k8s pv2]# curl 10.150.1.96
    43. aaaaaa
    44. statefulset访问的名称一样,当删除pod的时候 ,名称不变。地址会变。例如web-1一样。
    45. [root@k8s pv2]# kubectl delete pods web-1
    46. pod "web-1" deleted
    47. [root@k8s pv2]# kubectl get pods
    48. NAME READY STATUS RESTARTS AGE
    49. web-0 1/1 Running 0 9m26s
    50. web-1 1/1 Running 0 58s
    51. web-2 0/1 Pending 0 9m14s
    52. [root@k8s pv2]# kubectl get pods -o wide
    53. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    54. web-0 1/1 Running 0 9m35s 10.150.2.120 k8s-node-02
    55. web-1 1/1 Running 0 67s 10.150.1.97 k8s-node-01
    56. web-2 0/1 Pending 0 9m23s
    57. #新的IP地址访问,一样可以访问到
    58. [root@k8s-master-01 pv2]# curl 10.150.1.97
    59. aaaaaa
    60. [root@k8s-master-01 pv2]#
    61. 其余pv类似

    五、关于statefulset 

    • 匹配 Pod name(网络标识)的模式为: (statefulset 名称)-(序号),比如上面的示例: web-0,web-1,web-2        
    • StatefulSet为每个Pod副本创建了一个DNS域名,这个域名的格式为:                    $(podname).(headlessserver name),也就意味着服务间是通过Pod域名来通信而非Pod lP,因为当Pod所在Node发生故障时,Pod会被飘移到其它Node 上,Pod IP会发生变化,但是Pod域名不会有变化
    • tatefulSet使用Headless服务来控制Pod的域名,这个域名的FQDN为: (servicename).(namespace).svc.cluster.local,其中,"cluster.local”指的是集群的域名
    • 根据volumeClaimTemplates,为每个Pod创建一个pvc, pvc的命名规则匹配模式:(volumeClaimTemplates.name)-(pod_name),比如上面的volumeMounts.name=www,Podname=web-[0-2],因此创建出来的PVC是www-web-0、www-web-1、www-web-2
    • 删除Pod不会删除其pvc,手动删除pvc将自动释放pv
    1. [root@k8s pv2]# kubectl get pods
    2. NAME READY STATUS RESTARTS AGE
    3. test-pd 1/1 Running 0 14s
    4. web-0 1/1 Running 0 16m
    5. web-1 1/1 Running 0 8m16s
    6. web-2 0/1 Pending 0 16m
    7. [root@k8s pv2]# kubectl exec -it test-pd -- sh
    8. / # ping web-0.nginx
    9. ping: bad address 'web-0.nginx'
    10. / # ping web-0.nginx
    11. PING web-0.nginx (10.150.2.120): 56 data bytes
    12. 64 bytes from 10.150.2.120: seq=0 ttl=64 time=4.891 ms
    13. 64 bytes from 10.150.2.120: seq=1 ttl=64 time=0.209 ms
    14. 64 bytes from 10.150.2.120: seq=2 ttl=64 time=0.196 ms
    15. 64 bytes from 10.150.2.120: seq=3 ttl=64 time=0.131 ms
    16. 64 bytes from 10.150.2.120: seq=4 ttl=64 time=0.128 ms

    5.1  statefulset的启停顺序

    • 有序部署:部署StatefulSet时,如果有多个Pod副本,它们会被顺序地创建(从0到N-1)并且,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态。
    • 有序删除:当Pod被删除时,它们被终止的顺序是从N-1到0。
    • 有序扩展:当对Pod执行扩展操作时,与部署一样,它前面的Pod必须都处于Running和Ready状态。

    5.2 StatefulSet使用场景:

    • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现。稳定的网络标识符,即Pod重新调度后其PodName和HostName不变。
    • 有序部署,有序扩展,基于init containers来实现。
    • 有序收缩。
    1. [root@k8s pv2]# kubectl get pods -o wide -n kube-system
    2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    3. coredns-f68b4c98f-nkqlm 1/1 Running 2 22d 10.150.0.7 k8s-master-01 <none> <none>
    4. coredns-f68b4c98f-wzrrq 1/1 Running 2 22d 10.150.0.6 k8s-master-01 <none> <none>
    5. etcd-k8s-master-01 1/1 Running 3 22d 192.168.223.30 k8s-master-01 <none> <none>
    6. kube-apiserver-k8s-master-01 1/1 Running 3 22d 192.168.223.30 k8s-master-01 <none> <none>
    7. kube-controller-manager-k8s-master-01 1/1 Running 4 22d 192.168.223.30 k8s-master-01 <none> <none>
    8. kube-flannel-ds-8zj9t 1/1 Running 1 11d 192.168.223.30 k8s-node-01 <none> <none>
    9. kube-flannel-ds-jmq5p 1/1 Running 0 11d 192.168.223.30 k8s-node-02 <none> <none>
    10. kube-flannel-ds-vjt8b 1/1 Running 4 11d 192.168.223.30 k8s-master-01 <none> <none>
    11. kube-proxy-kl2qj 1/1 Running 2 22d 192.168.223.30 k8s-master-01 <none> <none>
    12. kube-proxy-rrlg4 1/1 Running 1 22d 192.168.223.9 k8s-node-01 <none> <none>
    13. kube-proxy-tc2nd 1/1 Running 0 22d 192.168.223.10 k8s-node-02 <none> <none>
    14. kube-scheduler-k8s-master-01 1/1 Running 4 22d 192.168.223.30 k8s-master-01 <none> <none>
    15. [root@k8s-master-01 pv2]# dig -t A nginx.default.svc.cluster.local. @10.150.0.7
    16. ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> -t A nginx.default.svc.cluster.local. @10.244.0.7
    17. ;; global options: +cmd
    18. ;; Got answer:
    19. ;; WARNING: .local is reserved for Multicast DNS
    20. ;; You are currently testing what happens when an mDNS query is leaked to DNS
    21. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26852
    22. ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
    23. ;; WARNING: recursion requested but not available
    24. ;; OPT PSEUDOSECTION:
    25. ; EDNS: version: 0, flags:; udp: 4096
    26. ;; QUESTION SECTION:
    27. ;nginx.default.svc.cluster.local. IN A
    28. ;; ANSWER SECTION:
    29. nginx.default.svc.cluster.local. 30 IN A 10.111.55.241
    30. ;; Query time: 7 msec
    31. ;; SERVER: 10.150.0.7#53(10.150.0.7)
    32. ;; WHEN: 一 0806 00:00:38 CST 2021
    33. ;; MSG SIZE rcvd: 107

    删除对应的pod、svc、statefulset、pv、pvc 

    1. [root@k8s pv]# kubectl get pods
    2. NAME READY STATUS RESTARTS AGE
    3. test-pd 1/1 Running 0 18m
    4. web-0 1/1 Running 0 34m
    5. web-1 1/1 Running 0 26m
    6. web-2 0/1 Pending 0 34m
    7. [root@k8s pv]# kubectl delete -f pod.yaml
    8. service "nginx" deleted
    9. statefulset.apps "web" deleted
    10. [root@k8s pv]# kubectl get pods
    11. NAME READY STATUS RESTARTS AGE
    12. test-pd 1/1 Running 0 18m
    13. web-0 0/1 Terminating 0 35m
    14. web-1 0/1 Terminating 0 26m
    15. [root@k8s pv]# kubectl get svc
    16. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    17. kubernetes ClusterIP 10.96.0.1 443/TCP 22d
    18. [root@k8s pv]# kubectl delete statefulsets.apps --all
    19. No resources found
    20. [root@k8s pv]# kubectl get pv
    21. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    22. pv2 2Gi RWX Retain Bound default/www-web-1 nfs 35m
    23. pv3 1Gi RWX Retain Bound default/www-web-0 nfs 35m
    24. [root@k8s pv]# kubectl get pvc
    25. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    26. www-web-0 Bound pv3 1Gi RWX nfs 35m
    27. www-web-1 Bound pv2 2Gi RWX nfs 35m
    28. www-web-2 Pending nfs 35m
    29. [root@k8s pv]# kubectl delete pvc --all
    30. persistentvolumeclaim "www-web-0" deleted
    31. persistentvolumeclaim "www-web-1" deleted
    32. persistentvolumeclaim "www-web-2" deleted
    33. #查看pv显示release状态
    34. [root@k8s pv]# kubectl get pv
    35. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    36. pv2 2Gi RWX Retain Released default/www-web-1 nfs 36m
    37. pv3 1Gi RWX Retain Released default/www-web-0 nfs 36m
    38. #编辑pv2的yaml格式、因为 claimRef的显示所以一直显示release的状态,可以通过edit修改pv2的yaml,删除对应的claimRef的那一段
    39. [root@k8s pv]# kubectl edit pv pv2 -o yaml
    40. # Please edit the object below. Lines beginning with a '#' will be ignored,
    41. # and an empty file will abort the edit. If an error occurs while saving this file will be
    42. # reopened with the relevant failures.
    43. #
    44. apiVersion: v1
    45. kind: PersistentVolume
    46. metadata:
    47. annotations:
    48. kubectl.kubernetes.io/last-applied-configuration: |
    49. {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"pv2"},"spec":{"accessModes":["ReadWriteMany"],"capacity":{"storage":"2Gi"},"nfs":{"path":"/root/data/pv2","server":"192.168.15.31"},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"nfs"}}
    50. pv.kubernetes.io/bound-by-controller: "yes"
    51. creationTimestamp: "2021-12-26T15:34:19Z"
    52. finalizers:
    53. - kubernetes.io/pv-protection
    54. name: pv2
    55. resourceVersion: "501755"
    56. uid: 7b9f8b31-f111-4064-9ec7-d06e55f6bebd
    57. spec:
    58. accessModes:
    59. - ReadWriteMany
    60. capacity:
    61. storage: 2Gi
    62. claimRef:
    63. apiVersion: v1
    64. kind: PersistentVolumeClaim
    65. name: www-web-1
    66. namespace: default
    67. resourceVersion: "498363"
    68. uid: 7d47eaf8-8bed-40fc-b790-18e93a8a0398
    69. nfs:
    70. path: /root/data/pv2
    71. "/tmp/kubectl-edit-euy6w.yaml" 37L, 1260C
    1. #这时候发现状态已经为 Available状态
    2. [root@k8s pv]# kubectl get pv
    3. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    4. pv2 2Gi RWX Retain Available nfs 44m
    5. pv3 1Gi RWX Retain Released default/www-web-0 nfs 44m

  • 相关阅读:
    docker的基本使用
    区分stable diffusion中的通道数与张量维度
    Spring Cloud--从零开始搭建微服务基础环境【三】
    2016-2023全国MEM国家A类线趋势图:浙大MEM要高多少?
    Outside ExpertPDF HtmlToPdf 转换器 17.0
    python基础总结(二)
    清晰还原31年前现场,火山引擎超清修复Beyond经典演唱会
    Qt实现文本编辑器(一)
    类和对象(中)(构造函数、析构函数和拷贝构造函数)
    “恰好装满求最值”背包问题的初始化解析
  • 原文地址:https://blog.csdn.net/weixin_67470255/article/details/126194218