PV是kubernetes集群的存储资源,而PVC则代表着资源需求。创建PVC时对PV发起的使用申请,即为“绑定”。PV和PVC是一一对应的关系,可用于响应PVC申请的PV必须要能够容纳PVC的请求条件,它们二者的交互遵循如下生命周期。
一、存储供给
存储供给(Provisioning)是指为PVC准备可用的PV机制。kubernetes支持两种PV供给方式:静态供给和动态供给。
1. 静态供给
静态供给是指由集群管理员手动创建一定数量的PV的资源供应方式。这些PV负责处理存储系统的细节,并将其抽象成易用的存储资源供用户使用。静态提供的PV可能属于某存储类,也可能没有存储类,这一点取决于管理员的设定。
下面示例就是静态供给,手动创建PV,没有存储类的示例:
创建nfs共享目录:
[root@k8s-master1 ~]# vim /etc/exports [root@k8s-master1 ~]# export export exportfs [root@k8s-master1 ~]# exportfs -arv exporting 10.0.0.131/24:/data/volume_test/v1 exporting 10.0.0.131/24:/data/volumes
创建pv资源:
[root@k8s-master1 pv]# cat pv-test.yaml apiVersion: v1 kind: PersistentVolume metadata: name: pv-static-test spec: capacity: storage: 1Gi accessModes: ["ReadWriteOnce"] nfs: path: /data/volume_test/v1 server: 10.0.0.131 [root@k8s-master1 pv]# kubectl apply -f pv-test.yaml persistentvolume/pv-static-test created [root@k8s-master1 pv]# kubectl get pv -o wide NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE pv-static-test 1Gi RWO Retain Available 15s Filesystem
2. 动态供给
不存在某静态的PV匹配到用户的PVC申请时,kubernetes集群会尝试为PVC动态创建符合需求的PV,此即为动态供给。这种方式依赖于存储类的辅助,PVC必须向一个事先存在的存储类发起动态分配PV的请求,没有指定存储类的PVC请求会被禁止使用动态创建PV的方式。
下面示例就是动态供给,动态创建PV,PVC的创建依赖于存储类course-nfs-storage
[root@k8s-master1 storageclass]# cat test-pvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nfs-dynamic-001 spec: storageClassName: course-nfs-storage accessModes: - ReadWriteMany resources: requests: storage: 1Gi
二、 存储绑定
用户基于一系列存储需求和访问模式定义好的PVC后,kubernetes系统的控制器即会为其查找匹配的PV,并于找到之后在此二者之间创建其关联的关系,而后它们二者之间的状态即转为“绑定(Binding)”。若PV是为PVC而动态创建的,则该PV专用于其PVC。
若是无法为PVC找到可匹配的PV,则PVC将一直处于未绑定(unbound)状态,直到有符合条件的PV出现并完全绑定方式才可用。
1. 存储使用
Pod资源基于persistentVolumeClaim卷类型的定义,将选定的PVC关联为存储卷,而后即可为内部的容器所使用的。对于支持多种访问模式的存储卷来说,用户需要额外指定要使用的模式。一旦完成将存储卷挂载至pod对象的容器中,其应用即可使用关联的PV提供的存储空间。
创建PVC,关联到匹配的PV,PVC的状态处于Binding状态:
[root@k8s-master1 pv]# vim pvc-demo2.yaml [root@k8s-master1 pv]# cat pvc-demo2.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-test spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 1Gi You have new mail in /var/spool/mail/root [root@k8s-master1 pv]# kubectl apply -f pvc-demo2.yaml persistentvolumeclaim/pvc-test created [root@k8s-master1 pv]# kubectl get pvc -o wide NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE pvc-test Bound pv-static-test 1Gi RWO 6s Filesystem
创建pod使用创建的PVC
[root@k8s-master1 pv]# cat pod-pvc.yaml apiVersion: v1 kind: Pod metadata: name: pvc-pod spec: containers: - name: nginx image: nginx:latest imagePullPolicy: IfNotPresent volumeMounts: - name: html mountPath: /usr/share/nginx/html volumes: - name: html persistentVolumeClaim: claimName: pvc-test [root@k8s-master1 pv]# kubectl apply -f pod-pvc.yaml pod/pvc-pod created [root@k8s-master1 pv]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nfs-client-provisioner-5d65b75f7-2f7qx 1/1 Running 3 5h15m 10.244.36.87 k8s-node1 <none> <none> pvc-pod 1/1 Running 0 6s 10.244.36.93 k8s-node1 <none> <none>
在NFS服务器的共享目录下创建访问页面:
[root@k8s-master1 ~]# cd /data/volume_test/v1 You have new mail in /var/spool/mail/root [root@k8s-master1 v1]# echo "test pvc in nginx container" >>index.html [root@k8s-master1 v1]# cat index.html test pvc in nginx container [root@k8s-master1 v1]#
测试访问页面,查看数据是否已被同步到容器中
[root@k8s-master1 pv]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nfs-client-provisioner-5d65b75f7-2f7qx 1/1 Running 3 5h23m 10.244.36.87 k8s-node1 <none> <none> pvc-pod 1/1 Running 0 8m6s 10.244.36.94 k8s-node1 <none> <none> You have new mail in /var/spool/mail/root [root@k8s-master1 pv]# curl 10.244.36.94 test pvc in nginx container [root@k8s-master1 pv]#
上述命令结果说明创建的PVC已被pvc-pod使用
2. PVC保护
为了避免使用中的存储卷被移除而导致数据丢失,kubernetes 自1.9版本起引入了PVC保护机制。启用了此特性后,万一有用户删除了仍处于某pod资源使用中的pvc时,kubernetes不会立即予以移除,而是推迟到不再被任何pod资源使用后方才执行删除操作。处于此阶段的PVC资源的status字段为“Termination”,并且其Finalizers字段中包含“kubernetes.io/pvc-protection”。
测试PVC的保护机制,删除pvc,查看pvc的状态变为Terminating:
[root@k8s-master1 pv]# kubectl get pvc -o wide NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE pvc-test Bound pv-static-test 1Gi RWO 16m Filesystem [root@k8s-master1 pv]# kubectl delete pvc pvc-test persistentvolumeclaim "pvc-test" deleted [root@k8s-master1 ~]# kubectl get pvc -o wide NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE pvc-test Terminating pv-static-test 1Gi RWO 16m Filesystem [root@k8s-master1 ~]# kubectl describe pvc pvc-test Name: pvc-test Namespace: default StorageClass: Status: Terminating (lasts 77s) Volume: pv-static-test Labels: <none> Annotations: pv.kubernetes.io/bind-completed: yes pv.kubernetes.io/bound-by-controller: yes Finalizers: [kubernetes.io/pvc-protection] Capacity: 1Gi Access Modes: RWO VolumeMode: Filesystem Used By: pvc-pod Events: <none> [root@k8s-master1 ~]#
删除pod, 再次查看pvc,发现pvc已被删除
[root@k8s-master1 pv]# kubectl get pvc -o wide NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE pvc-test Terminating pv-static-test 1Gi RWO 20m Filesystem [root@k8s-master1 pv]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nfs-client-provisioner-5d65b75f7-2f7qx 1/1 Running 3 5h31m 10.244.36.87 k8s-node1 <none> <none> pvc-pod 1/1 Running 0 16m 10.244.36.94 k8s-node1 <none> <none> [root@k8s-master1 pv]# kubectl delete pods pvc-pod pod "pvc-pod" deleted [root@k8s-master1 pv]# kubectl get pvc -o wide No resources found in default namespace. [root@k8s-master1 pv]#
三、存储回收
完成存储卷的使用目标后之后,即可删除PVC对象以便进行资源回收。不过,
标签:master1,生命周期,pv,pvc,PVC,PV,k8s,root From: https://www.cnblogs.com/jiawei2527/p/16726305.html