基於動態儲存裝置卷機制,可為每個應用副本自動建立並掛載一個獨立的雲端硬碟,適用於資料庫、中介軟體等等對 I/O 和延遲要求較高的情境,同時能夠簡化儲存的生命週期管理。
工作原理
在StatefulSet中使用雲端硬碟動態儲存裝置卷的流程如下:
定義模板
建立或使用預設 StorageClass,作為動態建立雲端硬碟的模板,規定其類型、效能、回收策略等關鍵參數。在應用中聲明儲存需求
在StatefulSet中定義
volumeClaimTemplates,並引用 StorageClass,聲明Pod待使用的PVC的規格,如儲存容量、訪問模式等。自動化建立並掛載儲存卷
StatefulSet 建立 Pod 時,系統會基於模板自動為其產生一個唯一的 PVC。CSI組件會根據 StorageClass 的規則建立 PV 並與 PVC 綁定,最終將該雲端硬碟掛載到 Pod 中。
適用範圍
可用性區域限制:除ESSD同城冗餘雲端硬碟外,其他雲端硬碟類型無法跨可用性區域掛載,只能掛載到同一可用性區域下的Pod。
執行個體規格類型系列限制:部分雲端硬碟類型僅支援掛載到特定的執行個體規格類型系列。
CSI組件限制:已安裝csi-plugin組件和csi-provisioner組件。
CSI組件預設安裝,請確保未手動卸載。可在頁面查看安裝情況。建議升級CSI組件至最新版本。
虛擬節點限制:如需在虛擬節點上使用雲端硬碟,需遵循叢集和kube-scheduler版本要求。
步驟一:選擇StorageClass
為便於使用,ACK提供多種預設StorageClass。由於StorageClass建立後無法修改,若預設配置不滿足需求,可通過手動建立StorageClass建立。
使用預設StorageClass
可從以下預設StorageClass中選擇一個,在應用的storageClassName欄位中引用其名稱即可。
StorageClass名稱 | 動態建立的雲端硬碟類型 |
| 預設先調度Pod再建立雲端硬碟,避免因可用性區域不匹配導致掛載失敗( |
| ESSD雲端硬碟,預設為PL1效能層級,雲端硬碟容量大小最低為20 GiB。 重要 雲盒內的ESSD雲端硬碟僅支援PL0層級,需手動建立StorageClass並指定 |
| SSD雲端硬碟,雲端硬碟容量大小最低為20 GiB。 |
| 高效雲端硬碟,雲端硬碟容量大小最低為20 GiB。 |
可通過kubectl describe sc <storageclass-name>查看StorageClass詳細配置。手動建立StorageClass
kubectl
建立
disk-sc.yaml。樣本以使用
volumeBindingMode: WaitForFirstConsumer延遲綁定PV的StorageClass為例。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: # StorageClass名稱 name: alicloud-disk-wait-for-first-consumer # 驅動類型,使用阿里雲雲端硬碟CSI外掛程式時固定為此值。 provisioner: diskplugin.csi.alibabacloud.com parameters: # 雲端硬碟類型,按優先順序自適應選擇 type: cloud_auto,cloud_essd,cloud_ssd # 檔案系統類型 fstype: ext4 diskTags: "a:b,b:c" encrypted: "false" # ESSD雲端硬碟的效能層級 performanceLevel: PL1 provisionedIops: "40000" burstingEnabled: "false" # 繫結模式,多可用性區域情境下建議使用WaitForFirstConsumer volumeBindingMode: WaitForFirstConsumer # 回收策略 reclaimPolicy: Retain # 是否允許儲存卷擴容 allowVolumeExpansion: true # 拓撲限制:限制雲端硬碟只能在指定的可用性區域建立 allowedTopologies: - matchLabelExpressions: - key: topology.diskplugin.csi.alibabacloud.com/zone values: # 替換為實際可用性區域 - cn-hangzhou-i - cn-hangzhou-k主要參數說明如下:
參數
說明
provisioner驅動類型,必填參數。使用阿里雲雲端硬碟CSI外掛程式時固定為
diskplugin.csi.alibabacloud.com。parameterstype雲端硬碟類型,必填參數。可取值:
cloud_essd(預設值):ESSD雲端硬碟cloud_auto:ESSD AutoPL雲端硬碟cloud_essd_entry:ESSD Entry雲端硬碟cloud_ssd:SSD雲端硬碟cloud_efficiency:高效雲端硬碟elastic_ephemeral_disk_standard:標準版彈性臨時盤elastic_ephemeral_disk_premium:進階版彈性臨時盤cloud_regional_disk_auto:ESSD同城冗餘雲端硬碟
支援任意組合,例如
type: cloud_ssd,cloud_essd,cloud_auto。系統將按配置順序依次嘗試建立。最終建立的雲端硬碟類型受節點執行個體、所在可用性區域雲端硬碟支援情況等因素影響。resourceGroupId雲端硬碟所屬資源群組。預設為
""。regionId雲端硬碟所在地區,與叢集地區相同。
fstype雲端硬碟使用的檔案系統。可取值:
ext4(預設)、xfs。mkfsOptions雲端硬碟格式化參數,如
mkfsOptions: "-O project,quota"。diskTags雲端硬碟標籤。例如
diskTags: "a:b,b:c",也可使用diskTags/a: b的格式指定。CSI組件需為v1.30.3及以上版本。encrypted雲端硬碟是否加密。預設為
false,不加密。performanceLevelESSD雲端硬碟效能層級,取值
PL0、PL1(預設)、PL2或PL3。通過雲盒使用時需設定為
PL0。volumeExpandAutoSnapshot【廢棄】自CSI 1.31.4版本起已廢棄。
provisionedIops使用ESSD AutoPL雲端硬碟時,配置雲端硬碟的預配置效能(IOPS)。
burstingEnabled使用ESSD AutoPL雲端硬碟時,是否開啟Burst(效能突發)。預設為
false,不開啟。multiAttach是否開啟雲端硬碟多重掛載功能。預設為
false,不開啟。volumeBindingMode雲端硬碟的繫結模式。可取值:
Immediate(預設):先建立雲端硬碟再建立Pod。WaitForFirstConsumer:延遲綁定,即先調度Pod,再根據Pod所在可用性區域建立雲端硬碟。多可用性區域情境下,建議使用
WaitForFirstConsumer,以最佳化因雲端硬碟和ECS節點不在同一可用性區域導致的掛載失敗。如需調度到虛擬節點,採用特定調度方式或添加了特定Annotation時,不支援使用
WaitForFirstConsumer類型的StorageClass,請參見掛載雲端硬碟的Pod調度至虛擬節點時,PVC一直處於Pending狀態怎麼辦?。
reclaimPolicy雲端硬碟回收策略。
Delete(預設):刪除PVC時,PV和雲端硬碟會一起刪除。Retain:刪除PVC時,PV和雲端硬碟資料不會被刪除,需手動刪除。對資料安全性要求高時,推薦使用
Retain,以免誤刪資料。
allowVolumeExpansion配置為
true時,允許線上擴容雲端硬碟儲存卷。allowedTopologies限制雲端硬碟只能在特定的拓撲域中建立。
key:拓撲域標籤。支援以下取值:topology.diskplugin.csi.alibabacloud.com/zone:阿里雲 CSI 外掛程式提供的專用拓撲key。alibabacloud.com/ecs-instance-id:使用彈性臨時盤時,支援指定節點。
values:包含可用性區域或節點 ID 的列表。
建立StorageClass。
kubectl create -f disk-sc.yaml查看StorageClass。
kubectl get sc輸出中,StorageClass已建立,處於
WaitForFirstConsumer繫結模式。NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE alicloud-disk-wait-for-first-consumer diskplugin.csi.alibabacloud.com Retain WaitForFirstConsumer true 10s
控制台
在ACK叢集列表頁面,單擊目的地組群名稱,在叢集詳情頁左側導覽列,選擇。
單擊建立,選擇儲存卷類型為雲端硬碟,完成參數配置,然後單擊建立。
參數
描述
參數
預設參數:
type。雲端硬碟類型,必填參數。可取值:
cloud_essd(預設值):ESSD雲端硬碟cloud_auto:ESSD AutoPL雲端硬碟cloud_essd_entry:ESSD Entry雲端硬碟cloud_ssd:SSD雲端硬碟cloud_efficiency:高效雲端硬碟elastic_ephemeral_disk_standard:標準版彈性臨時盤elastic_ephemeral_disk_premium:進階版彈性臨時盤cloud_regional_disk_auto:ESSD同城冗餘雲端硬碟
支援任意組合,例如
type: cloud_ssd,cloud_essd,cloud_auto。系統將按配置順序依次嘗試建立。最終建立的雲端硬碟類型受節點執行個體、所在可用性區域雲端硬碟支援情況等因素影響。
回收策略
雲端硬碟回收策略。
Delete(預設):刪除PVC時,PV和雲端硬碟會一起刪除。Retain:刪除PVC時,PV和雲端硬碟資料不會被刪除,需手動刪除。對資料安全性要求高時,推薦使用
Retain,以免誤刪資料。
繫結模式
雲端硬碟的繫結模式。可取值:
Immediate(預設):先建立雲端硬碟再建立Pod。WaitForFirstConsumer:延遲綁定,即先調度Pod,再根據Pod所在可用性區域建立雲端硬碟。多可用性區域情境下,建議使用
WaitForFirstConsumer,以最佳化因雲端硬碟和ECS節點不在同一可用性區域導致的掛載失敗。如需調度到虛擬節點,採用特定調度方式或添加了特定Annotation時,不支援使用
WaitForFirstConsumer類型的StorageClass,請參見掛載雲端硬碟的Pod調度至虛擬節點時,PVC一直處於Pending狀態怎麼辦?。
建立完成後,可在儲存類頁面查看新建立的StorageClass。
步驟二:建立應用並掛載雲端硬碟
以StatefulSet為例介紹如何掛載雲端硬碟儲存卷。
雲端硬碟為非共用儲存,未開啟多重掛載時一次只能掛載一個Pod。在多副本 Deployment 中共用PVC會導致新Pod無法掛載仍被舊Pod佔用的雲端硬碟而啟動失敗。推薦使用StatefulSet或單獨為Pod掛載雲端硬碟。
如仍需在Deployment中使用雲端硬碟,建議使用雲端硬碟作為臨時儲存卷。如需啟用多重掛載,請參見使用NVMe雲端硬碟多重掛載及Reservation。
建立
statefulset.yaml。以下樣本建立了包含2個Pod的StatefulSet,使用
volumeClaimTemplates來為每個 Pod 自動建立並綁定獨立的持久化儲存。apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: # 建議配置以下securityContext以最佳化掛載效能 securityContext: fsGroup: 1000 fsGroupChangePolicy: "OnRootMismatch" containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: # 將資料卷掛載到容器的/data目錄 # name需與volumeClaimTemplates中定義的metadata.name一致 - name: pvc-disk mountPath: /data # 定義PVC模板 volumeClaimTemplates: - metadata: name: pvc-disk spec: # 訪問模式 accessModes: [ "ReadWriteOnce" ] # 關聯此前建立的StorageClass storageClassName: "alicloud-disk-wait-for-first-consumer" resources: requests: # 申請的儲存容量,即雲端硬碟大小 storage: 20Gi重要在 Pod 中配置
securityContext.fsgroup會導致kubelet在掛載卷時遞迴修改檔案許可權(chmod/chown)。若檔案數量龐大,將顯著延長掛載時間。對於1.20及以上版本的叢集,建議將
fsGroupChangePolicy配置為OnRootMismatch,僅在首次掛載且卷根目錄許可權不匹配時才執行遞迴的許可權變更,以最佳化掛載效能。若效能仍不滿足要求或需更精細的許可權控制,建議使用initContainer在主應用程式容器啟動前自行執行許可權調整命令。建立StatefulSet。
kubectl create -f statefulset.yaml確認Pod處於Running狀態。
kubectl get pod -l app=nginx查看掛載路徑,確認已掛載雲端硬碟。
本樣本Pod名稱為
web-1,請按實際替換。kubectl exec web-1 -- df -h /data預期輸出:
Filesystem Size Used Avail Use% Mounted on /dev/vdb 20G 24K 20G 1% /data
步驟三:類比Pod故障,驗證持久化儲存
通過“寫入資料 -> 刪除 Pod -> 檢查資料”的流程,來驗證儲存在雲端硬碟上的資料在 Pod 重建後是否仍然存在。
在 Pod 中寫入測試資料。
以Pod
web-1為例,在其掛載的雲端硬碟路徑/data下建立一個test檔案。kubectl exec web-1 -- touch /data/test kubectl exec web-1 -- ls /data預期輸出:
lost+found test類比 Pod 故障,刪除 Pod。
kubectl delete pod web-1再次執行
kubectl get pod -l app=nginx,可以發現已自動建立一個同名的Podweb-1。驗證新 Pod 中的資料。
在新Pod
web-1中再次檢查/data目錄。kubectl exec web-1 -- ls /data預期輸出中,此前建立的 test 檔案依然存在,表明即使 Pod 被刪除重建,資料也實現了持久化儲存。
lost+found test
應用於生產環境
高可用性
雲端硬碟選型
需綜合評估其效能、計費以及節點的可用性區域和執行個體規格類型系列,確保Pod能被調度至相容的節點。
選擇雲端硬碟類型時,SSD雲端硬碟、高效雲端硬碟已逐步停止售賣。建議選用ESSD PL0雲端硬碟或ESSD Entry雲端硬碟替換高效雲端硬碟,選用ESSD AutoPL雲端硬碟替換SSD雲端硬碟。
構建跨可用性區域容災方案
應用程式層容災: 對於資料庫等關鍵業務,在多個可用性區域部署應用執行個體,並通過應用自身的資料同步機制實現高可用。
儲存層容災:選用支援多可用性區域容災的雲端硬碟類型,將資料即時同步寫入同一地區的不同可用性區域,實現跨可用性區域的故障恢複,請參見使用ESSD同城冗餘雲端硬碟。
資料安全與備份
效能與成本最佳化
啟用並行掛載
預設情況下,單個節點的雲端硬碟操作是串列的。可使用雲端硬碟並行掛載,加速Pod啟動。
啟用儲存卷線上擴容
在StorageClass中設定
allowVolumeExpansion: true,以便在未來儲存需求增長時,線上擴容雲端硬碟儲存卷。配置儲存監控與警示
基於容器儲存監控配置警示,及時發現儲存卷異常或效能瓶頸。
計費說明
通過StorageClass動態建立的雲端硬碟採用隨用隨付,請參見Block Storage計費、Block Storage價格。
常見問題
掛載雲端硬碟的Pod調度至虛擬節點時,PVC一直處於Pending狀態怎麼辦?
可能是使用了不支援虛擬節點調度情境的StorageClass。當通過特定標籤(Label)或註解(Annotation)將Pod調度到虛擬節點時,不支援使用volumeBindingMode: WaitForFirstConsumer模式的StorageClass。
原因:
WaitForFirstConsumer模式依賴kube-scheduler為Pod選擇一個物理節點,從而確定其可用性區域,然後再根據可用性區域建立雲端硬碟。但虛擬節點的部分調度機制不遵循此流程,導致CSI無法擷取可用性區域資訊,繼而無法建立PV,PVC便處於Pending狀態。如遇問題,請檢查Pod或其命名空間中是否包含以下任意一種配置:
Label:
alibabacloud.com/eci: "true":調度至ECI Pod。alibabacloud.com/acs: "true":調度至ACS Pod。
指定節點:
通過
spec.nodeName直接指定一個節點(節點名稱首碼為virtual-kubelet)。
Annotation:
k8s.aliyun.com/eci-vswitch:指定ECI Pod的交換器。k8s.aliyun.com/eci-fail-strategy: "fail-fast":ECI Pod的故障處理策略為快速失敗。
如何為單個Pod或單副本Deployment掛載雲端硬碟儲存卷?
對於不需要多副本伸縮和穩定網路標識的簡單應用,可手動建立PVC並將其掛載到Pod或Deployment,以實現持久化儲存。
鏈路為:選擇StorageClass -> 建立PVC -> 在應用中掛載PVC。
建立PVC,申請儲存資源。
kubectl
建立
disk-pvc.yaml。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: # 訪問模式 accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: # 申請的儲存容量,即雲端硬碟大小 storage: 20Gi # 關聯此前建立的StorageClass storageClassName: alicloud-disk-topology-alltype相關參數說明如下:
參數
說明
accessModes儲存卷的訪問模式。可取值:
ReadWriteOnce、ReadOnlyMany或ReadWriteMany。具體取決於StorageClass中的multiAttach配置以及PVC中的volumeMode配置。multiAttach表示是否開啟雲端硬碟多重掛載。預設為false,不開啟。multiAttach為false,volumeMode配置為任意值時,訪問模式僅支援ReadWriteOnce。multiAttach為true,volumeMode為Filesystem時,訪問模式僅支援ReadWriteOnce和ReadOnlyMany。multiAttach為true,volumeMode為Block時,三種訪問模式均支援。
重要此情境下,訪問模式通常為
ReadWriteOnce(RWO) ,即同一時間只能被一個Pod掛載。因此Deployment副本數不能大於1。如嘗試擴容,新Pod會因無法掛載已被佔用的雲端硬碟而一直處於Pending狀態。volumeMode儲存卷的模式。可取值:
Filesystem(預設):儲存卷會被格式化並掛載為目錄。Block:儲存卷以未格式化的塊裝置形式直接提供給 Pod。
storage申請的儲存容量大小。不同雲端硬碟類型的容量範圍不同。請確保
storage取值符合其引用的 StorageClass 所對應的雲端硬碟類型的容量限制,以免雲端硬碟建立失敗。storageClassName待綁定的StorageClass。
建立PVC。
kubectl create -f disk-pvc.yaml查看PVC。
kubectl get pvc輸出中,由於StorageClass使用
WaitForFirstConsumer模式,此時PVC處於Pending狀態,直到第一個使用它的 Pod 被成功調度。NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Pending alicloud-disk-wait-for-first-consumer <unset> 14s
控制台
在叢集管理頁左側導覽列,選擇。
在儲存聲明頁面,單擊建立,選擇儲存宣告類型為雲端硬碟,按照頁面提示完成參數的配置。
參數
描述
分配模式
選擇使用儲存類動態建立。
已有儲存類
預設建立或手動建立的StorageClass。
總量
申請的儲存容量大小。不同雲端硬碟類型的容量範圍不同。請確保
storage取值符合其引用的 StorageClass 所對應的雲端硬碟類型的容量限制,以免雲端硬碟建立失敗。訪問模式
僅支援ReadWriteOnce,表示卷只能被一個Pod以讀寫方式掛載。
建立完成後,可在儲存聲明頁面查看新建立的PVC。
在應用中掛載PVC。
建立
disk-deployment.yaml。部署Deployment。
kubectl create -f disk-deployment.yaml
驗證掛載結果。
確認Pod已經成功運行。
kubectl get pods -l app=nginx-single進入Pod內部,檢查
/data目錄是否已成功掛載雲端硬碟。# 擷取Pod名稱 POD_NAME=$(kubectl get pods -l app=nginx-single -o jsonpath='{.items[0].metadata.name}') # 執行df -h命令 kubectl exec $POD_NAME -- df -h /data輸出如下,表明20GiB的雲端硬碟已成功掛載。
Filesystem Size Used Avail Use% Mounted on /dev/vdb 20G 24K 20G 1% /data
相關文檔
使用雲端硬碟儲存卷時如遇問題,請參見雲端硬碟儲存卷FAQ。
雲端硬碟多可用性區域部署的配置最佳化建議,請參見雲端硬碟儲存卷的高可用配置建議。
如叢集仍在使用廢棄的Flexvolume組件,請遷移Flexvolume至CSI。
關於如何建立工作負載,請參見建立有狀態工作負載StatefulSet、建立無狀態工作負載Deployment。
如果不再使用某塊雲端硬碟且希望雲端硬碟停止計費時,可以釋放雲端硬碟。釋放後,雲端硬碟及儲存在雲端硬碟上的資料會被刪除、雲端硬碟停止計費。