PV/PVC是什么?
PV(Persistent Volume):描述的是持久化的Volume實體概念,生命周期與Pod創(chuàng)建和銷毀事件無關(guān)。要么運行事先準(zhǔn)備好,要么通過動態(tài)創(chuàng)建。
PVC(PersistentVolumeClaim):PVC是對PV的請求,申明Pod所希望使用的持久化存儲的屬性,例如容量,讀寫權(quán)限。
Kubernete Volumes能夠幫忙應(yīng)用持久化數(shù)據(jù),PV/PVC是Kubernetes Volumes存儲類型的一種,其它類型還有:
本地存儲:emptyDir / hostPath
網(wǎng)絡(luò)存儲:
in-tree: aws ElasticBlockStore / gcePersistentDisk / nfs
out-of-tree:csi等網(wǎng)絡(luò)存儲插件
Project Volume:secret / configmap / downwardAPI / serviceAccountToken
PV/PVC的意義
- 使用不同的控制器來管理計算與存儲資源,解耦POD與Volume的生命周期,實現(xiàn)計算與存儲分離。
- PVC只需要關(guān)注應(yīng)用需要知道的配置,如存儲大小、訪問模式,讀寫模式等,而不需要知道存儲的細(xì)節(jié),實現(xiàn)開發(fā)與運維職責(zé)分離。開發(fā)只需要提需求,知道自己需要的存儲容量,模式就夠了,他并不關(guān)心存儲是由什么設(shè)備提供的,資源池的夠不夠,而運維人員則相反,他更關(guān)心的底層的存儲狀態(tài)。
PV創(chuàng)建的兩種方式:靜態(tài)與動態(tài)
靜態(tài)創(chuàng)建方式,下圖為靜態(tài)創(chuàng)建的示意圖。

- 研發(fā)用戶需要創(chuàng)建存儲資源,于是創(chuàng)建了PVC(持久化存儲卷請求),申明需要的存儲資源大小以及訪問模式
- 集群管理人員(運維人員)根據(jù)需求配置手動創(chuàng)建對應(yīng)的PV(持久化存儲卷)
- OpenShift/K8S會根據(jù)配置將PV/PVC進(jìn)行綁定,讓PVC與真實的存儲資源關(guān)聯(lián)。
這種方式有幾個問題:
- 需要手動創(chuàng)建PV,增加了運維管理的復(fù)雜度。
- 如果有大量配置一樣的PVC需求時,PVC與設(shè)定的PV需要單獨的設(shè)置進(jìn)行綁定。
動態(tài)創(chuàng)建方式,下圖為動態(tài)創(chuàng)建的示意圖。

- 集群管理人員(運維人員)提前部署好存儲的provisioner,并創(chuàng)建好對應(yīng)storageclass
- 研發(fā)用戶需要創(chuàng)建存儲資源,于是創(chuàng)建了PVC(持久化存儲卷請求),申明需要的存儲的provisioner以及存儲大小
- provisioner監(jiān)聽到PVC資源的創(chuàng)建,自動創(chuàng)建PV,并與PVC進(jìn)行綁定,讓PVC與真實的存儲資源關(guān)聯(lián)。
一旦準(zhǔn)備好動態(tài)創(chuàng)建存儲環(huán)境,存儲資源便以服務(wù)的方式提供給研發(fā)人員,實現(xiàn)存儲資源自服務(wù)。
如何將PV與PVC綁定
在上一部分介紹了靜態(tài)創(chuàng)建存儲資源與動態(tài)創(chuàng)建存儲資源的過程與特點,很明顯動態(tài)創(chuàng)建存儲資源使用更方便,但是在生產(chǎn)中,受到環(huán)境的限制,靜態(tài)創(chuàng)建存儲資源的方式仍然很常見。這時,如何準(zhǔn)確地綁定PVC與對應(yīng)的PV就是需要注意的問題了。下面列出了解決這個問題的三種方法。
第一種,在PV中添加label,在PVC中添加matchLabels進(jìn)行關(guān)聯(lián)
創(chuàng)建PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv1
labels:
pv: nfs-pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
server: 10.2.1.2
path: "/exports/pv1"
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
selector:
matchLabels:
pv: "nfs-pv1"
matchExpressions:
- {key: environment, operator: In, values: [dev]}
# 本地盤PV
kind: PersistentVolume
apiVersion: v1
metadata:
name: test2-pv
namespace: kubeflow
labels:
pv: test2
spec:
capacity:
storage: 100Mi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data/test2"
第二種,PV配置中指定關(guān)聯(lián)的PVC
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv1
labels:
pv: nfs-pv1
spec:
capacity:
storage: 1Gi
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: openldap-volume-1
namespace: openldap
accessModes:
- ReadWriteMany
nfs:
server: 10.2.1.2
path: "/exports/pv1"
第三種,PVC中設(shè)置volumeName
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
volumeName: nfs-pv1