共計 2919 個字符,預計需要花費 8 分鐘才能閱讀完成。
Kubernetes PV/PVC/StroageClass 的持久化存儲是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面丸趣 TV 小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
PersistentVolume(簡稱 PV)和 PersistentVolumeClaim(簡稱 PVC)
PersistentVolume(持久卷,簡稱 PV)是集群內,由管理員提供的網絡存儲的一部分。就像集群中的節點一 樣,PV 也是集群中的一種資源。它也像 Volume 一樣,是一種 volume 插件,但是它的生命周期卻是和使用它的 Pod 相互獨立的。PV 這個 API 對 象,捕獲了諸如 NFS、ISCSI、或其他云存儲系統的實現細節。
PersistentVolumeClaim(持久卷聲明,簡稱 PVC)是用戶的一種存儲請求。它和 Pod 類似,Pod 消耗 Node 資源,而 PVC 消耗 PV 資源。Pod 能夠請求特定的資源(如 CPU 和內存)。PVC 能夠請求指定的大小和訪問的模式(可以被映射為一次讀寫或者多次只讀)。
PVC 允許用戶消耗抽象的存儲資源,用戶也經常需要各種屬性(如性能)的 PV。集群管理員需要提供各種各樣、不同大小、不同訪問模式的 PV,而不用向用戶暴露這些 volume 如何實現的細節。因為這種需求,就催生出一種 StorageClass 資源。
StorageClass 提供了一種方式,使得管理員能夠描述他提供的存儲的等級。集群管理員可以將不同的等級映射到不同的服務等級、不同的后端策略。
供給
PV 是集群中的資源,PVC 是對這些資源的請求,同時也是這些資源的“提取證”。PV 和 PVC 的交互遵循以下生命周期:
有兩種 PV 提供的方式:靜態和動態。
靜態
集群管理員創建多個 PV,它們攜帶著真實存儲的詳細信息,這些存儲對于集群用戶是可用的。它們存在于 Kubernetes API 中,并可用于存儲使用。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01
namespace: sit
spec:
capacity:
storage: 100Gi
accessModes:
– ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 10.42.0.55
path: /opt/public
動態
當管理員創建的靜態 PV 都不匹配用戶的 PVC 時,集群可能會嘗試專門地供給 volume 給 PVC。這種供給基于 StorageClass:PVC 必須請求這樣一個等級,而管理員必須已經創建和配置過這樣一個等級,以備發生這種動態供給的情況。請求等級配置為“”的 PVC,有效地禁用了它自身的動態供給功能。
Kubernetes 1.4 中加入了一個 新的 API 對象 StorageClass,可以定義多個 StorageClass 對象,并可以分別指定存儲插件、設置參數,用于提供不同的存儲卷。這樣的設計讓集群管理員能夠在同一個集群內,定義和提供不同類型的、不同參數的卷(相同或者不同的存儲系統)。這樣的設計還確保了最終用戶在無需了解太多的情況下,有能力選擇不同的存儲選項。
這種場景比較常見的是使用在高級的私有云分布式存儲或者公有云存儲情況下,大多數是集成第三方的
舉例:創建一個 slow,另外一個 fast 的盤在谷歌云上
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: slow
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: fast
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
綁定
用戶創建一個 PVC(或者之前就已經就為動態供給創建了),指定要求存儲的大小和訪問模式。master 中有一個控制回路用于監控新的 PVC,查找匹配的 PV(如果有),并把 PVC 和 PV 綁定在一起。如果一個 PV 曾經動態供給到了一個新的 PVC,那么這個回路會一直綁定這個 PV 和 PVC。另外,用戶總是至少能得到它們所要求的存儲,但是 volume 可能超過它們的請求。一旦綁定了,PVC 綁定就是專屬的,無論它們的綁定模式是什么。
如果沒找到匹配的 PV,那么 PVC 會無限期得處于 unbound 未綁定狀態,一旦 PV 可用了,PVC 就會又變成綁定狀態。比如,如果一個供給了很多 50G 的 PV 集群,不會匹配要求 100G 的 PVC。直到 100G 的 PV 添加到該集群時,PVC 才會被綁定。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-test01
namespace:
spec:
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 100Gi
使用
Pod 使用 PVC 就像使用 volume 一樣。集群檢查 PVC,查找綁定的 PV,并映射 PV 給 Pod。對于支持多種訪問模式的 PV,用戶可以指定想用的模式。
一旦用戶擁有了一個 PVC,并且 PVC 被綁定,那么只要用戶還需要,PV 就一直屬于這個用戶。用戶調度 Pod,通過在 Pod 的 volume 塊中包含 PVC 來訪問 PV。
kind: Pod
apiVersion: v1
metadata:
name: task-pv-pod
spec:
volumes:
– name: task-pv-storage
persistentVolumeClaim:
claimName: pvc-test01
containers:
– name: task-pv-container
image: nginx
ports:
– containerPort: 80
name: http-server
volumeMounts:
– mountPath: /usr/share/nginx/html
name: task-pv-storage
釋放
當用戶使用 PV 完畢后,他們可以通過 API 來刪除 PVC 對象。當 PVC 被刪除后,對應的 PV 就被認為是已經是“released”了,但還不能再給另外一個 PVC 使用。前一個 PVC 的屬于還存在于該 PV 中,必須根據策略來處理掉。
回收
PV 的回收策略告訴集群,在 PV 被釋放之后集群應該如何處理該 PV。當前,PV 可以被 Retained(保留)、Recycled(再利用)或者 Deleted(刪除)。保留允許手動地再次聲明資源。對于支持刪除操作的 PV 卷,刪除操作會從 Kubernetes 中移 除 PV 對象,還有對應的外部存儲(如 AWS EBS,GCE PD,Azure Disk,或者 Cinder volume)。動態供給的卷總是會被刪除。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注丸趣 TV 行業資訊頻道,感謝您對丸趣 TV 的支持。