對於非共用資料,I/O和延遲要求較高的應用情境,可以選擇雲端硬碟作為持久化儲存卷。本文介紹如何為應用掛載雲端硬碟動態儲存裝置卷,並驗證雲端硬碟的持久化儲存。
背景資訊
雲端硬碟是一種資料區塊層級的Block Storage產品,採用分布式多副本機制,具有低時延、高效能、持久性、高可靠等特點。適用於非共用資料,以及對I/O、延遲要求較高的應用情境。更多資訊,請參見儲存概述。
ACS僅支援動態掛載雲端硬碟儲存卷,暫不支援靜態掛載雲端硬碟儲存卷。
前提條件
ACS叢集中已安裝csi-provisioner組件。
您可以在ACS叢集管理頁的左側導覽列單擊組件管理,然後在儲存頁簽下確認csi-provisioner組件的安裝情況。
使用限制
雲端硬碟為非共用儲存,一個雲端硬碟儲存卷只能掛載到一個Pod上。
雲端硬碟只能掛載到相同可用性區域的Pod上,不支援跨可用性區域掛載。
注意事項
推薦使用StatefulSet掛載雲端硬碟或者單獨為Pod掛載雲端硬碟,不推薦使用Deployment。
說明由於一個雲端硬碟只能掛載到一個Pod上,為Deployment掛載雲端硬碟時,Replica必須配置為1,即無法為每個Pod配置獨立的儲存卷,並且不能保證掛載、卸載的優先順序。此外,由於Deployment的升級策略,重啟Pod時,新的Pod可能會一直無法掛載雲端硬碟。因此不推薦為Deployment掛載雲端硬碟。
使用雲端硬碟動態儲存裝置卷時,自動建立的雲端硬碟採用隨用隨付。
關於雲端硬碟如何計費,請參見Block Storage計費。
關於雲端硬碟的價格資訊,請參見Block Storage價格。
使用雲端硬碟動態儲存裝置卷時,如果在應用的YAML中配置了
securityContext.fsgroup,在掛載完成後,ACS會執行chmod和chown操作,導致掛載時間延長。說明配置了
securityContext.fsgroup後,掛載雲端硬碟時會自動調整卷內檔案的所有者,根據檔案數量,這可能導致較長的準備時間。您可以將fsGroupChangePolicy配置為OnRootMismatch,實現僅在初次開機容器時才會調整檔案的所有者,後續Pod升級或重建等情境下,掛載時間長度會恢複正常。若仍不能滿足需求,建議利用initContainer自行實現調整許可權相關操作。
掛載雲端硬碟儲存卷
kubectl
步驟一:建立StorageClass
預設情況下,ACS提供了名為alicloud-disk-topology-alltype的StorageClass,該StorageClass支援依次建立cloud_essd(ESSD雲端硬碟)、cloud_ssd(SSD雲端硬碟)和cloud_efficiency (高效雲端硬碟)類型的PV。如果預設提供的StorageClass無法滿足您的需求,您可以參考以下步驟手動建立新的StorageClass。
串連叢集。具體操作,請參見擷取叢集kubeconfig並通過kubectl工具串連叢集或在CloudShell上通過kubectl管理Kubernetes叢集。
參考參數說明表修改以下YAML內容,並儲存為disk-sc.yaml。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-disk-essd provisioner: diskplugin.csi.alibabacloud.com parameters: type: cloud_essd fstype: ext4 performanceLevel: PL1 reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true相關參數說明如下:
參數
說明
parameters.type雲端硬碟類型。取值如下:
cloud_essd_entry:ESSD Entry雲端硬碟cloud_auto:ESSD AutoPL雲端硬碟cloud_essd(預設值):ESSD雲端硬碟cloud_ssd:SSD雲端硬碟cloud_efficiency:高效雲端硬碟
支援任意組合上述參數,例如:
type: cloud_efficiency, cloud_ssd, cloud_essd,此時將按照配置順序依次嘗試建立指定類型的雲端硬碟,直到建立成功。說明您可以結合雲端硬碟計費、效能等選擇合適的雲端硬碟類型。更多資訊,請參見Block Storage價格和Block Storage效能。
parameters.fstype雲端硬碟的檔案系統類型。預設為ext4。支援
ext3、ext4、xfs。parameters.performanceLevelESSD雲端硬碟的效能層級。預設為
PL1。支援PL0、PL1、PL2或PL3。更多資訊,請參見ESSD雲端硬碟。provisioner驅動類型。此處配置為
diskplugin.csi.alibabacloud.com,表示使用阿里雲雲端硬碟CSI外掛程式。reclaimPolicy雲端硬碟的回收策略,僅支援
Delete,表示刪除PVC時,PV和雲端硬碟會一起刪除。volumeBindingMode雲端硬碟的繫結模式。如果是多可用性區域叢集,建議使用
WaitForFirstConsumer。WaitForFirstConsumer:延遲綁定,即先調度Pod,再根據Pod的可用性區域資訊建立雲端硬碟。Immediate:先建立雲端硬碟再建立Pod。
重要如果在ACK叢集中使用ACS算力,且ACS Pod需要掛載雲端硬碟,請採用nodeSelector或者ResourcePolicy的方式將Pod調度到虛擬節點。如果採用添加Pod Label(
alibabacloud.com/acs: "true")的調度方式,則不支援使用WaitForFirstConsumer類型的Storageclass。allowVolumeExpansion是否自動擴容雲端硬碟。
建立StorageClass。
kubectl create -f disk-sc.yaml查看StorageClass。
kubectl get sc預期返回:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE alicloud-disk-essd diskplugin.csi.alibabacloud.com Delete WaitForFirstConsumer true 78s alicloud-disk-topology-alltype diskplugin.csi.alibabacloud.com Delete WaitForFirstConsumer true 23d ......
步驟二:建立PVC
將以下YAML內容儲存為disk-pvc.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOncePod volumeMode: Filesystem resources: requests: storage: 20Gi storageClassName: alicloud-disk-essd相關參數說明如下:
參數
說明
accessModes訪問模式。目前僅支援ReadWriteOncePod。
volumeMode儲存卷的模式。取值範圍:
Filesystem(預設):檔案系統Block:塊
storage分配給Pod的儲存容量,即要建立的雲端硬碟容量大小。
storageClassName要綁定的StorageClass名稱。
建立PVC。
kubectl create -f disk-pvc.yaml查看PVC。
kubectl get pvc預期返回如下,可以看到由於
volumeBindingMode為WaitForFirstConsumer,此時PVC還未綁定PV。NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Pending alicloud-disk-essd <unset> 7s
步驟三:建立應用並掛載雲端硬碟
使用以下YAML內容,建立disk-test.yaml檔案。
以下YAML樣本可以建立包含1個Pod的StatefulSet,Pod通過名為
disk-pvc的PVC申請儲存資源,掛載路徑為/data。apiVersion: apps/v1 kind: StatefulSet metadata: name: disk-test spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest ports: - containerPort: 80 volumeMounts: - name: pvc-disk mountPath: /data volumes: - name: pvc-disk persistentVolumeClaim: claimName: disk-pvc建立StatefulSet並掛載雲端硬碟。
kubectl create -f disk-test.yaml重要建立StatefulSet時,系統將根據PVC和StorageClass的配置自動建立一塊隨用隨付的雲端硬碟,以及對應的PV。
查看StatefulSet中Pod的部署情況。
kubectl get pod | grep disk-test預期返回如下,樣本使用的StatefulSet副本數為1,因此建立了一個Pod。
disk-test-0 1/1 Running 0 52s查看PVC。
kubectl get pvc預期返回如下,可以看到此時PVC已綁定自動建立的雲端硬碟類型的PV。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Bound d-uf698s3h14isyj6b**** 20Gi RWOP alicloud-disk-essd <unset> 111s查看掛載路徑,確認已掛載雲端硬碟。
kubectl exec disk-test-0 -- df | grep data預期返回:
/dev/vdb 20466256 24 20449848 1% /data
控制台
步驟一:建立儲存類(StorageClass)
預設情況下,ACS提供了名為alicloud-disk-topology-alltype的StorageClass,該StorageClass支援依次建立cloud_essd(ESSD雲端硬碟)、cloud_ssd(SSD雲端硬碟)和cloud_efficiency (高效雲端硬碟)類型的PV。如果預設提供的StorageClass無法滿足您的需求,您可以參考以下步驟手動建立新的StorageClass。
登入容器計算服務控制台。
在叢集列表頁面,單擊目的地組群名稱,進入該叢集的管理頁面。
在叢集管理頁面的左側導覽列,選擇。
建立儲存類。
在儲存類頁面,單擊建立。
在彈出的對話方塊中,完成參數配置,然後單擊建立。
參數
說明
樣本
名稱
StorageClass名稱,自訂輸入。格式要求請參考介面提示。
alicloud-disk-essd
儲存卷類型
選擇雲端硬碟。
雲端硬碟
參數
預設參數為
type,表示雲端硬碟類型。取值如下:cloud_essd_entry:ESSD Entry雲端硬碟cloud_auto:ESSD AutoPL雲端硬碟cloud_essd(預設值):ESSD雲端硬碟cloud_ssd:SSD雲端硬碟cloud_efficiency:高效雲端硬碟
支援任意組合上述參數,例如:
type: cloud_efficiency, cloud_ssd, cloud_essd,此時將按照配置順序依次嘗試建立指定類型的雲端硬碟,直到建立成功。說明您可以結合雲端硬碟計費、效能等選擇合適的雲端硬碟類型。更多資訊,請參見Block Storage價格和Block Storage效能。
可添加以下參數:
fstype雲端硬碟的檔案系統類型。預設為ext4。支援
ext3、ext4、xfs。performanceLevelESSD雲端硬碟的效能層級。預設為
PL1。支援PL0、PL1、PL2或PL3。更多資訊,請參見ESSD雲端硬碟。
type:cloud_essd
回收策略
雲端硬碟的回收策略,僅支援
Delete,表示刪除PVC時,PV和雲端硬碟會一起刪除。Delete
繫結模式
雲端硬碟的繫結模式。如果是多可用性區域叢集,建議使用
WaitForFirstConsumer。WaitForFirstConsumer:延遲綁定,即先調度Pod,再根據Pod的可用性區域資訊建立雲端硬碟。Immediate:先建立雲端硬碟再建立Pod。
重要如果在ACK叢集中使用ACS算力,且ACS Pod需要掛載雲端硬碟,請採用nodeSelector或者ResourcePolicy的方式將Pod調度到虛擬節點。如果採用添加Pod Label(
alibabacloud.com/acs: "true")的調度方式,則不支援使用WaitForFirstConsumer類型的Storageclass。WaitForFirstConsumer
步驟二:建立儲存聲明(PVC)
在叢集管理頁面的左側導覽列,選擇。
在儲存聲明頁面,單擊建立。
在彈出的對話方塊中,完成參數配置,然後單擊建立。
參數
說明
樣本
儲存宣告類型
選擇雲端硬碟。
雲端硬碟
名稱
PVC名稱,自訂輸入。格式要求請參考介面提示。
disk-pvc
分配模式
預設已選擇使用儲存類動態建立。
使用儲存類動態建立
已有儲存類
選擇要綁定的StorageClass。
alicloud-disk-essd
總量
分配給Pod的儲存容量,即要建立的雲端硬碟容量大小。
20Gi
訪問模式
僅支援ReadWriteOnce,表示卷只能被一個Pod以讀寫方式掛載。
ReadWriteOnce
建立完成後,在儲存聲明頁面可以看到新建立的PVC,由於StorageClass中繫結模式為
WaitForFirstConsumer,此時PVC還未綁定PV,狀態為Pending。
步驟三:建立應用並掛載雲端硬碟
在叢集管理頁面的左側導覽列,選擇。
在有狀態頁面,單擊使用鏡像建立。
完成StatefulSet的參數配置,單擊建立。
需要注意的參數如下,其他參數保持預設即可。更多資訊,請參見建立有狀態工作負載StatefulSet。
配置頁
參數
說明
樣本
應用基本資料
應用程式名稱
StatefulSet名稱,自訂輸入。格式要求請參考介面提示。
disk-test
副本數量
配置StatefulSet的副本數量。
1
容器配置
鏡像名稱
輸入用於部署應用的鏡像地址。
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
所需資源
設定所需的vCPU和記憶體資源。
0.25 vCPU,0.5 GiB
資料卷
單擊增加雲端儲存聲明,然後完成參數配置。
掛載源:選擇之前建立的PVC。
容器路徑:輸入雲端硬碟要掛載到的容器路徑。
掛載源:disk-pvc
容器路徑:/data
查看應用部署情況。
在有狀態頁面,單擊應用程式名稱。
在容器組頁簽下,確認Pod已正常運行(狀態為Running)。
查看儲存卷和儲存聲明。
在儲存卷頁面,可以看到已自動建立了一個PV,該PV的名稱對應雲端硬碟ID。
在儲存聲明頁面,可以看到PVC已綁定PV,狀態為Bound。
驗證雲端硬碟的持久化儲存
按照上文樣本建立的StatefulSet中含有1個Pod,該Pod掛載了一個雲端硬碟。當該Pod被刪除時,自動建立的新Pod將重新掛載之前的雲端硬碟,雲端硬碟中的資料仍然保留。您可以通過以下方式驗證雲端硬碟的持久化儲存。
查看掛載路徑,即查看雲端硬碟中的資料。
kubectl exec disk-test-0 -- ls /data預期返回:
lost+found在雲端硬碟中寫入檔案。
kubectl exec disk-test-0 -- touch /data/test刪除Pod。
kubectl delete pod disk-test-0說明刪除StatefulSet中的Pod後,系統會自動建立一個新的Pod。
查看新建立的Pod。
kubectl get pod預期返回如下,由於StatefulSet的命名特性,新建立的Pod和之前的Pod名稱一致。
NAME READY STATUS RESTARTS AGE disk-test-0 1/1 Running 0 27s確認新建立的Pod已重新掛載雲端硬碟,雲端硬碟中的資料仍然存在。
kubectl exec disk-test-0 -- ls /data預期返回如下,可以看到雲端硬碟中存在之前寫入的
test檔案。lost+found test