簡稱PV。昨天有提到Volume可以想像成Pod的外接儲存空間,那PV就可以想像成在集群中的一顆硬碟。它可能是存在集群中的Node上,也有可能並不在集群中。
簡稱PVC,如果PV算是一顆硬碟,那PVC就是我們用這個硬碟所建立的Partition。PV和PVC是一對一的關係,擁有排他性,在ClaimRef中會記錄兩者的綁定關係。
如果建立PVC時,找不到符合條件的PV,那PVC就會一直處於未綁定狀態,直到出現符合條件的PV。可能會因為PV容量小於PVC請求之容量等原因所造成。
此外,當Pod正在Mount PVC時,因為避免資料遺失,這時的PVC是無法被刪除的。
有分為靜態和動態:
接下來我們看看要如何用YAML建立PV:
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
persistentVolumeReclaimPolicy: Delete
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
這邊有一個設定沒談到,它就是volumeMode:它有支援Filesystem和Block。預設為Filesystem。
我在過去實驗時有發現,當我們使用hostPath來建立PV時,capacity所設定的儲存空間大小,在實際上應用時,還是要依據這個位置本身有多少空間為主。
舉例來說,我使用hostPath在有100Gi的位置建立了10Gi的PV和PVC,然後提供給Pod使用。這時候Pod可以在volumeMounts可以使用的空間會是100Gi,而非10Gi。
早期的版本中有分為三種:
ReadWriteOnce:RWO,只允許一個Node以讀寫權限Mount,而這個Node則可以有多個Pod訪問這個PVC。
ReadOnlyMany:ROX,允許多個Node以只讀權限Mount。
ReadWriteMany:RWX,允許多個Node以讀寫權限Mount。
ReadWriteOncePod:RWOP,只允許一個Pod以讀寫權限Mount。在v1.22以後開始支援,且只支援CSI類型,CSI是一種標準的interface,讓其他廠商設計自己的儲存服務。
有分為三種:
在建立PVC時,系統會根據我們設定的PVC條件,來尋找相對應的PV,如果不符合則無法綁定。
條件主要分為:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 8Gi
storageClassName: manual
selector:
matchLabels:
release: "stable"
matchExpressions:
- {key: environment, operator: In, values: [dev]}
有幾種特定類型的PVC是支援擴張大小的,需要在StorageClass中將allowVolumeExpansion設為true才允許。我們只需編輯PVC,將容量改為更大,系統會自動調整PV。至於哪些類型支援擴張大小的,可以參考持久卷。
內容比想像中的多QQ,明天再來討論怎麼使用PVC以及StorageClass~
配置 Pod 以使用 PersistentVolume 作为存储