本文為您介紹Kubernetes容器儲存相關的基礎知識,方便您全面地認識和運用Container Service的儲存功能。
Volume
容器中的檔案在磁碟上是臨時存放的,當容器重建時,容器中的檔案將會丟失,所以Kubernetes定義了儲存卷Volume以解決容器中的檔案因容器重啟而丟失的問題。Volume是Pod與外部存放裝置進行資料傳遞的通道,也是Pod與內部容器間、Pod與Pod間、Pod與外部環境進行資料共用的方式。
Volume定義了外置儲存的細節,並內嵌到Pod中作為Pod的一部分。其本質是外置儲存在Kubernetes系統的一個資源地圖,當負載需要使用外置儲存時,可以從Volume中查到相關資訊並進行掛載操作。
Volume生命週期和Pod一致,即Pod被刪除時,Volume本身可能會被刪除,但Volume中的資料是否保留,取決於Volume的類型以及配置。
您在ACK可以使用的常用Volume類型如下:
類型 | 描述 |
本機存放區 | 適用於本機存放區的儲存卷,例如hostPath、emptyDir等。本機存放區卷的資料儲存在叢集特定節點上,並且不能隨著應用遷移,節點停機時,資料將不再可用。 |
網路儲存 | 適用於網路儲存的儲存卷,例如Ceph、GlusterFS、NFS、iSCSI等。網路儲存卷的資料不在叢集的某個節點上,而是在遠端的儲存服務上,使用儲存卷時需將儲存服務掛載至本地使用。 |
Secret和ConfigMap | Secret和ConfigMap是特殊的儲存卷,其資料是叢集的一些對象資訊,該對象資料以卷的形式被掛載到節點上供應用使用。 |
PVC | 一種儲存卷定義方式,將儲存卷抽象成一個獨立於Pod的對象,這個對象定義(關聯)的儲存資訊即儲存卷對應的真正儲存資訊,供Kubernetes負載掛載使用。 |
Volume使用說明
一個Pod可以掛載多個Volume,但不建議給一個Pod掛載過多的Volume儲存卷。
一個Pod可以掛載多種類型的Volume。
每個被Pod掛載的Volume,可以在不同的容器間共用。
對於需要持久化的資料,Kubernetes環境推薦使用PVC和PV方式掛載Volume。
PV和PVC
並非所有Volume都具有持久化特性,為了實現持久化的儲存,容器儲存需依賴於一個遠程儲存服務。Kubernetes引入了PV和PVC兩個資來源物件,將儲存實現的細節從其如何被使用中抽象出來,從而讓使用者不用關心具體的基礎設施,當需要儲存資源時,聲明所需的儲存需求即可。
PV(PersistentVolume)
PV持久化儲存卷,表示具體儲存類型的卷,用於定義儲存實現的細節,例如,具體儲存類型、儲存卷參數,目標儲存資源所有相關的資訊都儲存在PV中,Kubernetes引用PV中的儲存資訊進行掛載。您可以直接建立PV,通過靜態卷的方式掛載,也可以建立StorageClass,由CSI的Provisioner組件動態建立PV進行掛載。
PV是一個叢集層級的概念,其對象作用範圍是整個Kubernetes叢集,而不是一個節點。PV擁有獨立的生命週期,不依附於Pod。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
spec:
capacity:
storage: 20Gi # 容量大小可以根據實際雲端硬碟大小填寫
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
csi:
driver: diskplugin.csi.alibabacloud.com
volumeHandle: <雲端硬碟ID>
volumeMode: FilesystemPVC(PersistentVolumeClaim)
PVC儲存聲明,表示Pod所需使用的持久化儲存請求。例如,Volume儲存大小、可讀寫權限等。PVC申請會消耗PV儲存資源。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
volumeName: pv-examplePV和PVC使用說明
PVC與PV是一一對應關係,不能一個PVC掛載多個PV,也不能一個PV掛載多個PVC。為應用配置儲存時,需要聲明一個儲存需求聲明(PVC),而Kubernetes會通過首選的方式選擇一個滿足PVC需求的PV,並與之綁定。PVC只有綁定了PV之後才能被Pod使用。滿足以下規則的PV才能被PVC綁定:
VolumeMode:被消費PV的VolumeMode需要和PVC一致。
AccessMode:被消費PV的AccessMode需要和PVC一致。
StorageClassName:如果PVC定義了此參數,PV必須有相關的參數定義才能進行綁定。
LabelSelector:通過標籤(Labels)匹配的方式從PV列表中選擇合適的PV綁定。
storage:被消費PV的capacity必須大於或者等於PVC的儲存容量需求才能被綁定。
PV和PVC中定義storage的作用:
PVC、PV綁定時,會根據各自的
storage進行篩選。通過PVC、StorageClass動態建立PV時,例如,雲端硬碟會參考PVC的
storage建立相應大小的PV和後端儲存。對於支援Resize操作的儲存類型,PVC的
storage作為擴容後PV、後端儲存的容量值。
真正的儲存卷資料流寫資料時,不會參考PVC和PV的storage欄位,而是依賴底層儲存介質的實際容量。
Volume訪問模式
您可以通過accessModes來定義Volume儲存卷的訪問模式。
ReadWriteOnce(RWO)
Volume可以被一個節點以讀寫方式掛載,例如阿里雲雲端硬碟。
ReadOnlyMany(ROX)
Volume可以被多個節點以唯讀方式掛載,例如阿里雲OSS。
ReadWriteMany(RWX)
Volume可以被多個節點以讀寫方式掛載,例如阿里雲NAS檔案系統。
如何在Pod中掛載Volume
靜態儲存卷
靜態儲存卷是由管理員建立的PV,阿里雲雲端硬碟、NAS和OSS儲存介質都支援通過靜態儲存卷的方式使用。
靜態儲存卷由叢集管理員分析叢集中儲存需求,並預先分配一些儲存介質(例如雲端硬碟、NAS等)。
管理員根據儲存實際情況,手工預先建立若干個PV對象,並定義好每個PV可以提供的具體儲存能力,等待PVC來消費。
使用者根據業務實際情況,建立PVC用於聲明Pod運行所需的儲存能力。
如果工作負載中定義了PVC需求,Pod在建立過程中,Kubernetes會通過相關規則完成PVC和匹配的PV進行綁定,實現應用對儲存服務的訪問。
動態儲存裝置卷
動態儲存裝置卷是指通過儲存外掛程式Provisioner自動建立的PV,阿里雲雲端硬碟、NAS和OSS儲存介質都支援通過動態儲存裝置卷的方式使用。
動態儲存裝置卷由叢集管理員配置好後端的儲存池,選擇不同的Provisioner,以建立不同的儲存類型。例如
diskplugin.csi.alibabacloud.com表示使用阿里雲雲端硬碟的Provisioner外掛程式。管理員無需手工分配PV,根據儲存配置相應的StorageClass,等待PVC來消費。
使用者根據業務實際情況,建立PVC用於聲明Pod運行所需的儲存能力,同時,在該PVC中聲明需通過哪個StorageClass來處理該PVC的請求。
如果工作負載中定義了PVC需求,Pod在建立過程中,Kubernetes會依據該PVC中關聯的StorageClass的儲存細節,由儲存外掛程式Provisioner動態建立一個PV,實現應用對儲存服務的訪問。
使用動態儲存裝置卷的優勢:
動態儲存裝置卷讓Kubernetes實現了PV的自動化生命週期管理,PV的建立、刪除都通過Provisioner完成。
自動化建立PV對象,減少了配置複雜度和叢集管理員的工作量。
動態儲存裝置卷可以實現PVC對儲存的需求容量和Provisioner輸出的PV容量一致,實現儲存容量規劃最優。
StorageClass
StorageClass用於定義儲存的類別,提供動態分配儲存卷的能力,您可以為其設定不同的參數,使儲存資源能夠根據需求自動供應和調整。在PVC儲存聲明中添加StorageClassName欄位,當PVC在叢集中找不到匹配的PV時,將根據StorageClassName的定義觸發相應的Provisioner組件自動建立合適的PV以及底層儲存,即建立動態儲存裝置卷,減少了建立和維護PV的工作量。下文以阿里雲盤為例介紹如何自訂StorageClass儲存類。更多關於雲端硬碟、NAS和OSS的自訂儲存類及參數說明,請參見使用雲端硬碟動態儲存裝置卷、使用NAS動態儲存裝置卷、使用OSS動態儲存裝置卷。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-disk-topology-alltype
provisioner: diskplugin.csi.alibabacloud.com
parameters:
type: cloud_auto,cloud_essd,cloud_ssd,cloud_efficiency
fstype: ext4
diskTags/a: b
encrypted: "false"
performanceLevel: PL1
provisionedIops: "40000"
burstingEnabled: "false"
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer 主要參數說明
參數 | 說明 | |
| 儲存資源供應商。支援配置如下:
| |
| 儲存資源雲端硬碟的參數設定。 | |
| 儲存資源雲端硬碟的回收策略,預設為
如果資料安全性要求高,推薦使用 | |
| 配置為 | |
| 雲端硬碟的繫結模式。預設為
| |
預設StorageClass
Kubernetes提供預設StorageClass機制,在PVC未指定StorageClassName的情況下,您可以通過預設StorageClass建立儲存卷。更多資訊,請參見Default StorageClass。
由於預設StorageClass會對所有PVC起作用,對於具備不同類型儲存卷能力的叢集,需謹慎使用。例如,您想產生一個NAS類型PVC、PV,並綁定PVC和PV,但可能因為有預設StorageClass而自動建立了雲端硬碟PV。ACK叢集沒有提供預設StorageClass,如果您期望使用預設StorageClass,可以參考以下配置。
配置預設StorageClass。
執行以下命令將StorageClass(alicloud-disk-topology-alltype)配置為一個預設StorageClass。
說明此處以alicloud-disk-topology-alltype為例進行說明,
kubectl annotate storageclass alicloud-disk-topology-alltype storageclass.kubernetes.io/is-default-class=true此時,查詢叢集中的StorageClass可以看到alicloud-disk-topology-alltype名字後面加了(default)字樣。
kubectl get sc返回結果如下:
NAME PROVISIONER AGE alicloud-disk-topology-alltype (default) diskplugin.csi.alibabacloud.com 96m使用預設StorageClass。
使用以下模板建立一個沒有配置StorageClass的PVC。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi叢集會自動建立一個雲端硬碟儲存卷(PV),且配置了預設StorageClass(alicloud-disk-topology-alltype)。
kubectl get pvc返回結果如下:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE disk-pvc Bound d-bp18pbai447qverm**** 20Gi RWO alicloud-disk-topology-alltype 49s
您可以通過以下命令取消預設儲存類型的配置。
kubectl annotate storageclass alicloud-disk-topology-alltype storageclass.kubernetes.io/is-default-class-Container Service for Kubernetes的StorageClass模板說明
StorageClass | 匹配的儲存卷類型 | 說明 |
alicloud-disk-efficiency | 上一代雲端硬碟 | |
alicloud-disk-ssd | 上一代雲端硬碟 | |
alicloud-disk-essd | 通過該StorageClass預設建立的為PL1層級的ESSD雲端硬碟。 | |
alicloud-disk-topology-alltype | 提供高可用選項,優先建立ESSD雲端硬碟。
| 多可用性區域情境推薦 |
alibabacloud-cnfs-nas | 建立叢集時,可預設建立CNFS託管的NAS儲存類,通過CNFS託管NAS使用時,可直接使用該儲存類。更多資訊,請參見使用CNFS管理NAS儲存卷。 | CNFS託管NAS使用情境 |
相關文檔
關於Container Service for Kubernetes儲存相關的更多資訊,請參見儲存。