對于非共享數據,I/O和延遲要求較高的應用場景,可以選擇云盤作為持久化存儲卷。本文介紹如何為應用動態掛載云盤存儲卷,并驗證云盤的持久化存儲。
背景信息
云盤是一種數據塊級別的塊存儲產品,采用分布式多副本機制,具有低時延、高性能、持久性、高可靠等特點。適用于非共享數據,以及對I/O、延遲要求較高的應用場景。更多信息,請參見存儲概述。
ACS僅支持動態掛載云盤存儲卷,暫不支持靜態掛載云盤存儲卷。
前提條件
ACS集群中已安裝managed-csiprovisioner組件。
您可以在ACS集群管理頁的左側導航欄選擇
,在存儲頁簽下查看managed-csiprovisioner組件的安裝情況。使用限制
云盤為非共享存儲,一個云盤存儲卷只能掛載到一個Pod上。
云盤只能掛載到相同可用區的Pod上,不支持跨可用區掛載。
注意事項
推薦使用StatefulSet掛載云盤或者單獨為Pod掛載云盤,不推薦使用Deployment。
說明由于一個云盤只能掛載到一個Pod上,為Deployment掛載云盤時,Replica必須配置為1,即無法為每個Pod配置獨立的存儲卷,并且不能保證掛載、卸載的優先順序。此外,由于Deployment的升級策略,重啟Pod時,新的Pod可能會一直無法掛載云盤。因此不推薦為Deployment掛載云盤。
動態掛載云盤時,自動創建的云盤采用按量計費。
動態掛載云盤時,如果在應用的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
相關參數說明如下:
參數
說明
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
,此時將按照配置順序依次嘗試創建指定類型的云盤,直到創建成功。fstype
云盤的文件系統類型。默認為ext4。支持
ext3
、ext4
、xfs
。performanceLevel
ESSD云盤的性能級別。默認為
PL1
。支持PL0
、PL1
、PL2
或PL3
。更多信息,請參見ESSD云盤。provisioner
驅動類型。此處配置為
diskplugin.csi.alibabacloud.com
,表示使用阿里云云盤CSI插件。reclaimPolicy
云盤的回收策略,僅支持
Delete
,表示刪除PVC時,PV和云盤會一起刪除。volumeBindingMode
云盤的綁定模式。僅支持
WaitForFirstConsumer
,表示延遲綁定,即先調度Pod,再根據Pod的可用區信息創建云盤。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。
登錄容器計算服務控制臺。
在集群頁面,單擊目標集群ID,進入該集群的管理頁面。
在集群管理頁面的左側導航欄,選擇
。創建存儲類。
在存儲類頁面,單擊創建。
在彈出的對話框中,完成參數配置,然后單擊創建。
參數
說明
示例
名稱
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
,此時將按照配置順序依次嘗試創建指定類型的云盤,直到創建成功。可添加以下參數:
fstype
云盤的文件系統類型。默認為ext4。支持
ext3
、ext4
、xfs
。performanceLevel
ESSD云盤的性能級別。默認為
PL1
。支持PL0
、PL1
、PL2
或PL3
。更多信息,請參見ESSD云盤。
type:cloud_essd
回收策略
云盤的回收策略,僅支持
Delete
,表示刪除PVC時,PV和云盤會一起刪除。Delete
綁定模式
云盤的綁定模式。僅支持
WaitForFirstConsumer
,表示延遲綁定,即先調度Pod,再根據Pod的可用區信息創建云盤。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