1 PVC介紹
??PVC是用戶層面,作為對存儲資源的需求申請,主要包括了存儲空間大小、訪問模式、PV的選擇條件、存儲類別等信息的設(shè)置。
2 PVC的參數(shù)詳解
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參數(shù)說明
-
spec.accessModes:訪問模式;描述用戶應(yīng)用對存儲資源的訪問權(quán)限。
- RWO:ReadWriteOnce,僅允許單個節(jié)點掛載進(jìn)行讀寫;
- ROX:ReadOnlyMany,允許多個節(jié)點掛載且只讀;
- RWX:ReadWriteMany,允許多個節(jié)點掛載進(jìn)行讀寫;
-
spec.resources.requests.storage:資源請求的存儲大?。?/li> -
spec.storageClassName:存儲卷模式,指定一個StorageClass資源對象的名稱,具有特定類別的PV只能與請求了該類別的PVC進(jìn)行綁定;(動態(tài)存儲);當(dāng)然,也可以設(shè)置為spec.storageClassName=“”,未設(shè)置特定類型的PV只能與不請求任何類型的PVC進(jìn)行綁定(靜態(tài)存儲)。 -
spec.selector.matchLabels: PV的選擇條件,可以通過標(biāo)簽匹配進(jìn)行PV綁定;也可以通過spec.selector.matchExpressions進(jìn)行條件標(biāo)簽描述;
3 PVC的生命周期
$ kubectl get pvc

PVC一共也有4個生命周期階段:Available/Bound/Released/Failed
- Available: 可用狀態(tài),無PV綁定;
- Bound:綁定狀態(tài),已經(jīng)和某個PV綁定;
- Released:釋放狀態(tài),被綁定的PV已刪除,資源釋放,但沒有被集群回收;
- Failed:失敗狀態(tài),自動資源回收失??;
4 PVC的常用命令
- 創(chuàng)建(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 權(quán)威指南》
其實,使用共享存儲就幾步:
Pod(Deployment等配置好PVC)—>PVC—>PV—>存儲資源。
資源供應(yīng)
PVC使用存儲資源可以通過靜態(tài)綁定或者動態(tài)綁定,靜態(tài)模式就是集權(quán)管理員預(yù)先創(chuàng)建對應(yīng)的PV對存儲特性進(jìn)行設(shè)置;動態(tài)模式就是集權(quán)管理員預(yù)先創(chuàng)建好StorageClass資源對后端存儲進(jìn)行描述,PVC創(chuàng)建時對存儲類型進(jìn)行聲明,PVC創(chuàng)建后,k8s會自動創(chuàng)建合適的PV與PVC進(jìn)行綁定。資源綁定
創(chuàng)建好PVC后,PVC會在已存在的PV中選擇合適的PV進(jìn)行綁定(可以通過標(biāo)簽進(jìn)行特定綁定,也可以不通過標(biāo)簽,系統(tǒng)會自動選擇合適(容量大小等參數(shù))的PV進(jìn)行綁定。),綁定成功,狀態(tài)變成Bound,且該PV被對應(yīng)的PVC獨占綁定,不可以再被其他PVC綁定,除非該PVC釋放。若在k8s系統(tǒng)中沒有找到合適的PV,則PVC一直處于Pending狀態(tài)。資源使用
在Deployment等資源中,通過spec.template.spec.volumes:進(jìn)行PVC掛載路徑設(shè)置。
spec:
tempeate:
spec:
containers:
- name: container1
image: image1
volumeMounts:
- name: volume1
mountPath: /data/dir1
volumes:
- name: volume1
persistentVolumeClaim:
claimName: pvc1
資源釋放
刪除PVC,與該PVC綁定的PV狀態(tài)就會變成“Released”,該PVC在存儲設(shè)備上的數(shù)據(jù)刪除后,對應(yīng)的PV才能與其他的PVC進(jìn)行綁定。資源回收
PV中可以通過spec.persistentVolumeReclaimPolicy設(shè)置回收策略,這個主要用于綁定的PVC刪除后,資源釋放后如何處理該PVC在存儲設(shè)備上寫入的數(shù)據(jù)。
- Retain:保留,刪除PVC后,PV保留數(shù)據(jù);
- Recycle:回收空間,刪除PVC后,簡單的清除文件;(NFS和HostPath存儲支持)
- Delete:刪除,刪除PVC后,與PV相連接的后端存儲會刪除數(shù)據(jù);(AWS EBS、Azure Disk、Cinder volumes、GCE PD支持)
5.2 手動創(chuàng)建pv進(jìn)行綁定
??我們可以通過標(biāo)簽的方式,將pvc綁定到特定的pv上。需要做兩步,一個是pv的yaml標(biāo)簽,另一步是pvc的標(biāo)簽匹配。
by 《k8s權(quán)威指南》
舉例:
- pv的yaml需要有
metadata.labels進(jìn)行標(biāo)簽標(biāo)記;
如:
[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進(jìn)行標(biāo)簽匹配。
[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
創(chuàng)建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 動態(tài)卷配置StorageClass
除了pvc綁定手動創(chuàng)建pv的方式,我們還可以通過動態(tài)卷配置StorageClass跳過手動pv的方式。
by 《k8s權(quán)威指南》
- 我們先要創(chuàng)建一個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進(jìn)行配置。
[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
創(chuàng)建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
在這里插入圖片描述
可以看到一個自動創(chuàng)建的pv,它的策略是Delete,即pvc刪除后會自動刪除。





