1 PVC介紹
PVC是用戶層面,作為對存儲資源的需求申請,主要包括了存儲空間大小、訪問模式、PV的選擇條件、存儲類別等信息的設置。
2 PVC的參數詳解
2.1 PVC的yaml模板
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-stoarge
selector:
matchLabels:
pv: test-pv1
2.2 PVC參數說明
spec.accessModes
:訪問模式;描述用戶應用對存儲資源的訪問權限。
- RWO:ReadWriteOnce,僅允許單個節點掛載進行讀寫;
- ROX:ReadOnlyMany,允許多個節點掛載且只讀;
- RWX:ReadWriteMany,允許多個節點掛載進行讀寫;
spec.resources.requests.storage
:資源請求的存儲大小;spec.storageClassName
:存儲卷模式,指定一個StorageClass資源對象的名稱,具有特定類別的PV只能與請求了該類別的PVC進行綁定;(動態存儲);當然,也可以設置為spec.storageClassName=“”
,未設置特定類型的PV只能與不請求任何類型的PVC進行綁定(靜態存儲)。spec.selector.matchLabels
: PV的選擇條件,可以通過標簽匹配進行PV綁定;也可以通過spec.selector.matchExpressions
進行條件標簽描述;
3 PVC的生命周期
$ kubectl get pvc
PVC一共也有4個生命周期階段:Available/Bound/Released/Failed
- Available: 可用狀態,無PV綁定;
- Bound:綁定狀態,已經和某個PV綁定;
- Released:釋放狀態,被綁定的PV已刪除,資源釋放,但沒有被集群回收;
- Failed:失敗狀態,自動資源回收失敗;
4 PVC的常用命令
- 創建(yaml的方式)
$ kubectl create -f pvc.yaml
- 刪除
$ kubectl delete pvc pvc_name
- 查看所有PVC
$ kubectl get pvc
- 查看某個PVC
$ kubectl get pvc pvc_name
- 查看詳情
$ kubectl describe pvc pvc_name
注意: 若在某個命名空間下,以上命令可以加上-n ns_name
5 PVC和PV的綁定
5.1 PV和PVC的生命周期
by 《k8s 權威指南》
其實,使用共享存儲就幾步:
Pod(Deployment等配置好PVC)—>PVC—>PV—>存儲資源。
-
資源供應
PVC使用存儲資源可以通過靜態綁定或者動態綁定,靜態模式就是集權管理員預先創建對應的PV對存儲特性進行設置;動態模式就是集權管理員預先創建好StorageClass資源對后端存儲進行描述,PVC創建時對存儲類型進行聲明,PVC創建后,k8s會自動創建合適的PV與PVC進行綁定。 -
資源綁定
創建好PVC后,PVC會在已存在的PV中選擇合適的PV進行綁定(可以通過標簽進行特定綁定,也可以不通過標簽,系統會自動選擇合適(容量大小等參數)的PV進行綁定。),綁定成功,狀態變成Bound,且該PV被對應的PVC獨占綁定,不可以再被其他PVC綁定,除非該PVC釋放。若在k8s系統中沒有找到合適的PV,則PVC一直處於Pending狀態。 -
資源使用
在Deployment等資源中,通過spec.template.spec.volumes:
進行PVC掛載路徑設置。
spec:
tempeate:
spec:
containers:
- name: container1
image: image1
volumeMounts:
- name: volume1
mountPath: /data/dir1
volumes:
- name: volume1
persistentVolumeClaim:
claimName: pvc1
-
資源釋放
刪除PVC,與該PVC綁定的PV狀態就會變成“Released”,該PVC在存儲設備上的數據刪除后,對應的PV才能與其他的PVC進行綁定。 -
資源回收
PV中可以通過spec.persistentVolumeReclaimPolicy
設置回收策略,這個主要用於綁定的PVC刪除后,資源釋放后如何處理該PVC在存儲設備上寫入的數據。
- Retain:保留,刪除PVC后,PV保留數據;
- Recycle:回收空間,刪除PVC后,簡單的清除文件;(NFS和HostPath存儲支持)
- Delete:刪除,刪除PVC后,與PV相連接的后端存儲會刪除數據;(AWS EBS、Azure Disk、Cinder volumes、GCE PD支持)
5.2 手動創建pv進行綁定
我們可以通過標簽的方式,將pvc綁定到特定的pv上。需要做兩步,一個是pv的yaml標簽,另一步是pvc的標簽匹配。
by 《k8s權威指南》
舉例:
- pv的yaml需要有
metadata.labels
進行標簽標記;
如:
[root@k8s /pv_test]# vim test_pv1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv1
labels:
pv: test-pv1
spec:
capacity:
storage: 2Mi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /date-nfs/k8s
server: 10.139.12.14
- pvc的yaml里需要有
spec.selector.matchLabels
進行標簽匹配。
[root@k8s /pvc_test]# vim test_pvc1.yaml
#persistent Volume Claim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc1
namespace: t1
spec:
#storageClassName: managed-nfs-storage
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
selector:
matchLabels:
pv: test-pv1
-
創建pv和pvc
$ kubectl create -f test_pv.yaml
$ kubectl create -f test_pvc.yaml
-
查看pv
$ kubectl get pv test-pv1
-
查看pvc
$ kubectl get pvc test-pvc1
我們可以看出test-pvc1持久卷聲明綁定到了test-pv1這個持久卷上了。
5.3 動態卷配置StorageClass
除了pvc綁定手動創建pv的方式,我們還可以通過動態卷配置StorageClass跳過手動pv的方式。
by 《k8s權威指南》
- 我們先要創建一個StorageClass資源。
[root@k8s /sc_test]# vim test_storageclass1.yaml
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: course-nfs-storage
provisioner: fuseim.pri/ifs
- 然后在pvc的yaml中增加
spec.storageClassName
進行配置。
[root@k8s /pvc_test]# vim test_pvc_sc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: course-nfs-storage
resources:
requests:
storage: 1Mi
-
創建StorageClass和PVC資源
$ kubectl create -f test_storageclass1.yaml
$ kubectl create -f test_pv_sc.yaml
-
查看SC
$ kubectl get sc course-nfs-storage
-
查看SC詳情
$ kubectl describe sc course-nfs-storage
-
查看PVC
$ kubectl get pvc test-pvc
-
查看PV
$ kubectl get pv
可以看到一個自動創建的pv,它的策略是Delete,即pvc刪除后會自動刪除。