kubernetes pv回收策略
本文最近更新于2021.9.11
kubernetes pv回收策略
當用戶不再使用其存儲卷時,他們可以從 API 中將 PVC 對象刪除,從而允許該資源被回收再利用。PersistentVolume 對象的回收策略告訴集群,當其被從申領中釋放時如何處理該數據卷。 目前,數據卷可以被 Retained(保留)、Recycled(回收)或 Deleted(刪除)。
1、保留(Retain)
回收策略Retain使得用戶可以手動回收資源。當 PersistentVolumeClaim 對象被刪除時,PersistentVolume 卷仍然存在,對應的數據卷被視為"已釋放(released)"。 由于卷上仍然存在著前一申領人的數據,該卷還不能用于其他申領。 管理員可以通過下面的步驟來手動回收該卷:
2、刪除(Delete)
對于支持Delete回收策略的卷插件,刪除動作會將 PersistentVolume 對象從 Kubernetes 中移除,同時也會從外部基礎設施(如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)中移除所關聯的存儲資產。 動態供應的卷會繼承其 StorageClass 中設置的回收策略,該策略默認 為Delete。 管理員需要根據用戶的期望來配置 StorageClass;否則 PV 卷被創建之后必須要被 編輯或者修補。
3、回收(Recycle)
警告:回收策略Recycle已被廢棄。取而代之的建議方案是使用動態供應。
kubernetes 持久卷概念
PersistentVolume 子系統為用戶和管理員提供了一組 API,將存儲如何供應的細節從其如何被使用中抽象出來。為了實現這點,引入了一些新的資源和概念:
- PV(PersistentVolume,持久卷),是集群中的一塊存儲,可以由管理員事先供應,或者使用存儲類(Storage
Class)來動態供應。 持久卷是集群資源,就像節點也是集群資源一樣。 - PVC(PersistentVolumeClaim,持久卷申領),表達的是用戶對存儲的請求。 PVC申領請求特定的大小和訪問模式的PV卷。
- StorageClass(存儲類),集群管理員需要能夠提供不同性質的PersistentVolume,并且這些 PV卷之間的差別不僅限于卷大小和訪問模式,同時又不能將卷是如何實現的這些細節暴露給用戶。為了滿足這類需求,就有了存儲類(StorageClass)資源。
- volume, 卷的核心是一個目錄,其中可能存有數據,Pod 中的容器可以訪問該目錄中的數據。
- volumeclaim, 使用卷時,在 .spec.volumes 字段中設置為 Pod 提供的卷,并在 .spec.containers[*].volumeMounts 字段中聲明卷在容器中的掛載位置。
相關概念示意圖:
下面以NFS存儲為例演示pv回收策略及如何復用被保留的pv卷。
kubernetes pv創建流程
1、創建靜態pv,定義存儲容量、訪問模式及回收策略,注意這里的回收策略為Retain保留:
[root@master hostpath]# cat pv.yaml apiVersion: v1 kind: PersistentVolume metadata:name: task-pv-volumelabels:type: local spec:storageClassName: nfscapacity:storage: 10GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:server: 10.0.0.5path: "/nginx"查看創建的pv,該pv狀態為Available ,可用于pvc申請:
[root@master hostpath]# kubectl apply -f pv.yaml [root@master hostpath]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE task-pv-volume 10Gi RWO Retain Available nfs 2s2、創建pvc綁定到pv
[root@master hostpath]# cat pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata:name: task-pv-claim spec:storageClassName: nfsaccessModes:- ReadWriteOnceresources:requests:storage: 3Gi查看創建的pvc,此時pvc已經隨機獲取到一個可用pv并與其綁定,查看pvc及pv都為Bound狀態
[root@master hostpath]# kubectl apply -f pvc.yaml [root@master hostpath]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE task-pv-claim Bound task-pv-volume 10Gi RWO nfs 3s[root@master hostpath]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE task-pv-volume 10Gi RWO Retain Bound default/task-pv-claim nfs 2m58s3、創建pod申請pvc
[root@master hostpath]# cat pod.yaml kind: Service apiVersion: v1 metadata:name: task-pv-service spec:ports:- port: 80type: NodePortselector:app: nginx --- apiVersion: v1 kind: Pod metadata:name: task-pv-podlabels:app: nginx spec:containers:- name: task-pv-containerimage: nginxports:- containerPort: 80name: "http-server"volumeMounts:- mountPath: "/usr/share/nginx/html"name: task-pv-storagevolumes:- name: task-pv-storagepersistentVolumeClaim:claimName: task-pv-claim查看創建的pod:
[root@master hostpath]# kubectl get pod NAME READY STATUS RESTARTS AGE task-pv-pod 1/1 Running 0 84s[root@master hostpath]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 36h task-pv-service NodePort 10.233.11.207 <none> 80:31181/TCP 6s向pod內寫入測試數據,并連接到NFS Server查看持久化數據:
[root@master hostpath]# kubectl exec task-pv-pod -- sh -c "echo 'Hello from Kubernetes storage' > /usr/share/nginx/html/index.html"[root@nfs-server nfs-share]# cat nginx/index.html Hello from Kubernetes storage瀏覽器訪問web應用:
kubernetes pv回收策略
1、刪除pod,該pvc及pv依然保留并處于綁定狀態,因此刪除pod對pvc及pv沒有影響:
[root@product-cluster nfs-share]# kubectl delete pods task-pv-pod2、繼續刪除pvc,此時pv是否被刪除取決于其回收策略,回收策略為Delete則pv也會被自動刪除,回收策略為Retain則pv會被保留
[root@product-cluster nfs-share]# kubectl delete pvc task-pv-claim可以看到pv依然保留,并且狀態由Bound變為Released,該狀態pv無法被新的pvc申領,只有PV處于Available狀態時才能被pvc申領。
[root@product-cluster nfs-share]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE task-pv-volume 10Gi RWO Retain Released default/task-pv-claim nfs 10m被保留下來的PV在spec.claimRef字段記錄著原來PVC的綁定信息:
[root@product-cluster nfs-share]# kubectl get pv task-pv-volume -o yaml apiVersion: v1 kind: PersistentVolume ...... spec:accessModes:- ReadWriteOncecapacity:storage: 10GiclaimRef:apiVersion: v1kind: PersistentVolumeClaimname: task-pv-claimnamespace: defaultresourceVersion: "792426"uid: 325b013f-0467-4078-88e9-0fc208c6993cnfs:path: /nginxserver: 10.0.0.5persistentVolumeReclaimPolicy: RetainstorageClassName: nfsvolumeMode: Filesystem status:phase: Released刪除綁定信息中的resourceVersion和uid鍵,即可重新釋放PV使其狀態由Released變為Available
[root@product-cluster nfs-share]# kubectl edit pv task-pv-volume ...... spec:accessModes:- ReadWriteOncecapacity:storage: 10GiclaimRef:apiVersion: v1kind: PersistentVolumeClaimname: task-pv-claimnamespace: default ......再次查看pv狀態已經變為Available
[root@product-cluster nfs-share]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE task-pv-volume 10Gi RWO Retain Available default/task-pv-claim nfs 20m由于該pv中spec.claimRef.name和spec.claimRef.namespace鍵不變,該pv依然指向原來的pvc名稱,具有相應spec的新PVC能夠準確綁定到該PV。重新恢復之前刪除的pvc及pod:
[root@master hostpath]# kubectl apply -f pvc.yaml[root@master hostpath]# kubectl apply -f pod.yaml查看pvc及pod狀態
[root@master hostpath]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE task-pv-claim Bound task-pv-volume 10Gi RWO nfs 71s[root@master hostpath]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE task-pv-volume 10Gi RWO Retain Bound default/task-pv-claim nfs 33m[root@master hostpath]# kubectl get pods NAME READY STATUS RESTARTS AGE task-pv-pod 1/1 Running 0 62s再次訪問web應用,之前寫入的數據依然存在,數據成功恢復:
配置pv回收策略
pv回收策略可以在多個地方定義。
1、在pv中定義回收策略
apiVersion: v1 kind: PersistentVolume metadata:name: pv0003 spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: slowmountOptions:- hard- nfsvers=4.1nfs:path: /tmpserver: 172.17.0.22、在storageclass中定義pv回收策略
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata:name: gp2-retainannotations: provisioner: kubernetes.io/aws-ebs parameters:type: gp2fsType: ext4 reclaimPolicy: Retain修改pv回收策略
對于動態配置的PersistentVolumes來說,默認回收策略為 “Delete”。這表示當用戶刪除對應的PersistentVolumeClaim時,動態配置的 volume 將被自動刪除。如果 volume 包含重要數據時,這種自動行為可能是不合適的。這種情況下,更適合使用 “Retain” 策略。使用 “Retain” 時,如果用戶刪除PersistentVolumeClaim,對應的PersistentVolume不會被刪除。相反,它將變為Released狀態,表示所有的數據可以被手動恢復。
使用如下命令可以修改pv回收策略:
kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'綁定pvc到特定pv
默認pvc會隨機申請滿足條件的任意pv,可以使用如下兩種方式將pvc綁定到特定pv上:
1、在pvc中直接指定pv名稱
apiVersion: v1 kind: PersistentVolumeClaim metadata:name: foo-pvcnamespace: foo spec:storageClassName: "" # Empty string must be explicitly set otherwise default StorageClass will be setvolumeName: foo-pv首先需要保留該存儲卷,claimRef在 PV的字段中指定相關的 PersistentVolumeClaim,以便其他 PVC 無法綁定到它。
apiVersion: v1 kind: PersistentVolume metadata:name: foo-pv spec:storageClassName: ""claimRef:name: foo-pvcnamespace: foo2、可以使用對 pv 打 label 的方式,具體如下:
創建 pv,指定 label
[root@server PV]# cat pv-test1.yaml kind: PersistentVolume apiVersion: v1 metadata:name: test1-pvnamespace: kubeflowlabels:pv: test1 spec:capacity:storage: 100MiaccessModes:- ReadWriteOncehostPath:path: "/data/test1"然后創建 pvc,使用 matchLabel 來關聯剛創建的 pv
[root@server PV]# cat pvc1.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata:name: test2-pvc spec:accessModes:- ReadWriteOnceresources:requests:storage: 100Miselector:matchLabels:pv: test1參考:
https://blog.51cto.com/ygqygq2/2308576
https://blog.csdn.net/zwqjoy/article/details/88051147
總結
以上是生活随笔為你收集整理的kubernetes pv回收策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lvgl chart
- 下一篇: 地图历史大反转!GISer如何查看历史影