通過手動建立PV、PVC,可將雲端硬碟以靜態儲存卷的方式掛載到Pod上,以滿足持久化儲存需求,適用於對磁碟 I/O 效能和低延遲要求高、無資料共用需求的情境
雲端硬碟適用於以下儲存情境:
對磁碟I/O要求高的應用,且沒有共用資料的需求,如MySQL、Redis等資料存放區服務。
高速寫日誌。
持久化儲存資料,不會因Pod生命週期的結束而消失。
流程指引
|
適用範圍
CSI組件限制:已安裝csi-plugin組件和csi-provisioner組件。
CSI組件預設安裝,請確保未手動卸載。可在頁面查看安裝情況。建議升級CSI組件至最新版本。
雲端硬碟為待掛載狀態,且滿足以下要求:
可用性區域限制:除ESSD同城冗餘雲端硬碟外,其他雲端硬碟類型無法跨可用性區域掛載,只能掛載到同一可用性區域下的Pod。
執行個體規格類型系列限制:部分雲端硬碟類型僅支援掛載到特定的執行個體規格類型系列。
虛擬節點限制:如需在虛擬節點上使用雲端硬碟,需遵循叢集和kube-scheduler版本要求。
靈駿節點限制:如需在靈駿節點上使用雲端硬碟,需滿足以下要求。
步驟一:建立PV
建立 PV,將已有雲端硬碟聲明為叢集中的一個可用儲存資源。
kubectl
參見以下內容,建立disk-pv.yaml。
需提前擷取雲端硬碟ID、雲端硬碟大小、可用性區域ID、雲端硬碟類型等資訊,將YAML中的變數替換為實際值。
apiVersion: v1 kind: PersistentVolume metadata: # 已有雲端硬碟ID,如d-uf628m33r5rsbi****** name: "<YOUR-DISK-ID>" annotations: # 推薦配置,以確保Pod調度到支援該雲端硬碟類型的節點上 # <YOUR-DISK-CATEGORY>為已有雲端硬碟的類型,支援cloud_essd_entry、cloud_auto、cloud_essd、cloud_ssd、cloud_efficiency、cloud_regional_disk_auto csi.alibabacloud.com/volume-topology: '{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node.csi.alibabacloud.com/disktype.<YOUR-DISK-CATEGORY>","operator":"In","values":["available"]}]}]}' spec: capacity: # 已有雲端硬碟大小,如 20Gi storage: "<YOUR-DISK-SIZE>" claimRef: apiVersion: v1 kind: PersistentVolumeClaim namespace: default name: disk-pvc accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain csi: driver: diskplugin.csi.alibabacloud.com # 已有雲端硬碟ID,如d-uf628m33r5rsbi****** volumeHandle: "<YOUR-DISK-ID>" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.diskplugin.csi.alibabacloud.com/zone operator: In values: # 已有雲端硬碟所在的可用性區域,例如cn-shanghai-f - "<YOUR-DISK-ZONE-ID>" storageClassName: alicloud-disk-topology-alltype volumeMode: Filesystem相關參數說明如下:
參數
說明
csi.alibabacloud.com/volume-topology此Annotation用於為雲端硬碟設定節點親和性,確保使用該雲端硬碟的 Pod能夠被調度到支援對應雲端硬碟類型的節點上,避免因節點不匹配導致掛載失敗。
為確保調度準確性,建議配置雲端硬碟類型。支援的類型如下:
ESSD Entry雲端硬碟:
cloud_essd_entryESSD AutoPL雲端硬碟:
cloud_autoESSD雲端硬碟:
cloud_essdSSD雲端硬碟:
cloud_ssd高效雲端硬碟:
cloud_efficiency同城冗餘雲端硬碟:
cloud_regional_disk_auto(還需參見nodeaffinity參數說明調整配置)
claimRef指定PV所能綁定的PVC。如果希望PV可被任意PVC綁定,請刪除該配置。
accessModes訪問模式。取決於是否啟用雲端硬碟多重掛載功能。
未啟用多重掛載:僅支援
ReadWriteOnce(RWO),該雲端硬碟一次只能被一個節點以讀寫方式掛載。已啟用多重掛載:
將其作為標準檔案系統使用(即已格式化):支援
ReadWriteOnce(RWO)和ReadOnlyMany(ROX)。為防止檔案系統(如ext4)在多節點並發寫入時資料損毀,不支援
ReadWriteMany(RWX)模式。將其作為裸裝置使用(即未格式化):支援
ReadWriteOnce(RWO)、ReadOnlyMany(ROX)和ReadWriteMany(RWX)。
persistentVolumeReclaimPolicyPV的回收策略,決定了綁定的PVC被刪除後,PV及後端雲端硬碟的生命週期。
Delete:刪除PVC時,PV和雲端硬碟會一起刪除。請謹慎配置。為防止資料意外丟失,可在執行刪除前為雲端硬碟建立自動快照策略進行備份。
Retain:刪除PVC時,PV和雲端硬碟不會被刪除,需手動釋放。
driver使用阿里雲雲端硬碟時,固定為
diskplugin.csi.alibabacloud.com。nodeAffinity節點親和性配置。除ESSD同城冗餘雲端硬碟外,其他雲端硬碟類型無法跨可用性區域掛載,只能掛載到同一可用性區域下的Pod。該配置可確保Pod調度到雲端硬碟所在可用性區域對應的ECS節點。
對於同城冗餘雲端硬碟,請將其改為以下內容,以允許雲端硬碟掛載到該地區中的任意可用性區域。
其中
<YOUR-DISK-REGION-ID>為雲端硬碟所在地區,例如cn-shanghai。nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/region operator: In values: - "<YOUR-DISK-REGION-ID>"storageClassName該配置對靜態卷無意義,無需預先建立對應的StorageClass,但需確保PV和PVC中的該配置項取值保持一致。
建立PV。
kubectl create -f disk-pv.yaml查看PV狀態,確認為
Available。kubectl get pv預期返回:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE d-uf628m33r5rsbi****** 20Gi RWO Retain Available default/disk-pvc alicloud-disk-topology-alltype <unset> 1m36s
控制台
-
在ACK叢集列表頁面,單擊目的地組群名稱,在叢集詳情頁左側導覽列,選擇。
在儲存卷頁面,單擊建立,選擇儲存卷類型為雲端硬碟,按照頁面提示完成PV的配置。
參數
描述
訪問模式
僅支援ReadWriteOnce。
雲端硬碟ID
單擊選擇雲端硬碟,選擇與節點處於同一地區可用性區域下的待掛載的雲端硬碟。
檔案系統類型
選擇以何種資料類型將資料存放區到雲端硬碟上。支援檔案系統類型包括ext4、ext3、xfs、vfat。
步驟二:建立PVC
建立 PVC,綁定上一步建立的 PV。
kubectl
參見以下內容,建立disk-pvc.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOnce resources: requests: # 申請的儲存容量,需與PV容量保持一致 storage: "<YOUR-DISK-SIZE>" # 與PV中定義的 storageClassName 保持一致 storageClassName: alicloud-disk-topology-alltype # 指定待綁定的 PV volumeName: "<YOUR-DISK-ID>"相關參數說明如下:
參數
說明
accessModes訪問模式,需與PV的配置保持一致。
storage分配給Pod的儲存容量,需與PV容量保持一致。
storageClassName該配置對靜態卷無意義,無需預先建立對應的StorageClass,但需確保PV和PVC中的該配置項取值保持一致。
volumeName指定待綁定的PV。如期望PVC可綁定任意PV,可刪除此參數。
建立PVC。
kubectl create -f disk-pvc.yaml查看PVC狀態,確認為
Bound。kubectl get pvc預期返回如下,可以看到PVC已關聯雲端硬碟PV。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Bound d-bp1ff1mn65jk8s****** 20Gi RWO alicloud-disk-topology-alltype <unset> 6s
控制台
在叢集管理頁左側導覽列,選擇。
在儲存聲明頁面,單擊建立,選擇儲存宣告類型為雲端硬碟,按照頁面提示完成PVC的建立。
參數
描述
分配模式
選擇已有儲存卷。
已有儲存卷
選擇此前建立的PV。
總量
分配給Pod的儲存容量,不超過雲端硬碟容量上限。
步驟三:建立應用並掛載雲端硬碟
建立工作負載,並通過掛載 PVC 來使用雲端硬碟。
雲端硬碟為非共用儲存,未開啟多重掛載時一次只能掛載一個Pod。在多副本 Deployment 中共用PVC會導致新Pod無法掛載仍被舊Pod佔用的雲端硬碟而啟動失敗。推薦使用StatefulSet或單獨為Pod掛載雲端硬碟。
如仍需在Deployment中使用雲端硬碟,建議使用雲端硬碟作為臨時儲存卷。如需啟用多重掛載,請參見使用NVMe雲端硬碟多重掛載及Reservation。
kubectl
參見以下內容,建立disk-test.yaml。
以下樣本建立了一個副本數為1的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: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: pvc-disk mountPath: /data volumes: - name: pvc-disk persistentVolumeClaim: claimName: disk-pvc重要在 Pod 中配置
securityContext.fsgroup會導致kubelet在掛載卷時遞迴修改檔案許可權(chmod/chown)。若檔案數量龐大,將顯著延長掛載時間。對於1.20及以上版本的叢集,建議將
fsGroupChangePolicy配置為OnRootMismatch,僅在首次掛載且卷根目錄許可權不匹配時才執行遞迴的許可權變更,以最佳化掛載效能。若效能仍不滿足要求或需更精細的許可權控制,建議使用initContainer在主應用程式容器啟動前自行執行許可權調整命令。Pod重建時會重新掛載原有雲端硬碟。如果由於其他限制導致Pod無法調度到原可用性區域,Pod會因無法掛載雲端硬碟而一直處於Pending狀態。
建立StatefulSet並掛載雲端硬碟。
kubectl create -f disk-test.yaml查看 Pod 狀態,確認為
Running。kubectl get pod -l app=nginx預期輸出:
NAME READY STATUS RESTARTS AGE disk-test-0 1/1 Running 0 14s查看掛載路徑,確認已掛載雲端硬碟。
kubectl exec disk-test-0 -- df -h /data預期輸出:
Filesystem Size Used Avail Use% Mounted on /dev/vdb 20G 24K 20G 1% /data
控制台
在叢集管理頁左側導覽列,選擇。
在有狀態頁面,單擊使用鏡像建立。
在有狀態頁面,單擊使用鏡像建立,按照頁面提示完成StatefulSet的參數配置。
主要配置項如下,詳細配置項說明請參見建立有狀態工作負載StatefulSet。
配置頁
參數
描述
應用基本資料
副本數量
配置StatefulSet的副本數量。
容器配置
鏡像名稱
輸入用於部署應用的鏡像地址,如
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6。所需資源
設定所需的vCPU、記憶體和臨時儲存資源。
本樣本配置CPU為0.25 Core,記憶體為512 MiB。
數據卷
單擊增加雲端儲存聲明(PersistentVolumeClaim),然後完成參數配置。
掛載源:選擇此前建立的PVC。
容器路徑:輸入雲端硬碟要掛載到的容器路徑,如/data。
查看應用部署情況。
在有狀態頁面,單擊應用程式名稱。
在容器組頁簽下,確認Pod已正常運行(狀態為Running)。
驗證資料持久化儲存
通過“寫入資料 -> 刪除 Pod -> 檢查資料”的流程,來驗證儲存在雲端硬碟上的資料在 Pod 重建後是否仍然存在。
在 Pod 中寫入測試資料。
查看掛載路徑,即查看雲端硬碟中的資料。
kubectl exec disk-test-0 -- ls /data預期輸出:
lost+found在 Pod 中寫入測試資料。
以Pod
disk-test-0為例,在其掛載的雲端硬碟路徑/data下建立一個test檔案。kubectl exec disk-test-0 -- touch /data/test
類比 Pod 故障,刪除 Pod。
kubectl delete pod disk-test-0再次執行
kubectl get pod -l app=nginx,可以發現已自動建立一個同名的Pod。驗證新 Pod 中的資料。
在新Pod
disk-test-0中再次檢查/data目錄。kubectl exec disk-test-0 -- ls /data預期輸出中,此前建立的 test 檔案依然存在,表明即使 Pod 被刪除重建,資料也實現了持久化儲存。
lost+found test
應用於生產環境
高可用性
Pod調度策略
在PV中正確配置
nodeAffinity和csi.alibabacloud.com/volume-topology,確保Pod在重建後能夠成功調度並重新掛載雲端硬碟。雲端硬碟選型
需綜合評估其效能、計費以及節點的可用性區域和執行個體規格類型系列,確保Pod能被調度至相容的節點。
選擇雲端硬碟類型時,SSD雲端硬碟、高效雲端硬碟已逐步停止售賣。建議選用ESSD PL0雲端硬碟或ESSD Entry雲端硬碟替換高效雲端硬碟,選用ESSD AutoPL雲端硬碟替換SSD雲端硬碟。
構建跨可用性區域容災方案
應用程式層容災: 對於資料庫等關鍵業務,在多個可用性區域部署應用執行個體,並通過應用自身的資料同步機制實現高可用。
儲存層容災:選用支援多可用性區域容災的雲端硬碟類型,將資料即時同步寫入同一地區的不同可用性區域,實現跨可用性區域的故障恢複,請參見使用ESSD同城冗餘雲端硬碟。
資料安全:
常態化備份:通過自動快照為雲端硬碟建立自動快照,以便資料備份和恢複。
效能與成本最佳化
啟用並行掛載
預設情況下,單個節點的雲端硬碟操作是串列的。可使用雲端硬碟並行掛載,加速Pod啟動。
配置儲存監控與警示
基於容器儲存監控配置警示,及時發現儲存卷異常或效能瓶頸。
資源釋放指引
為避免產生預期外的費用並確保資料安全,請遵循以下流程釋放無需使用的資源。
刪除工作負載
操作:刪除所有使用相關PVC的應用,例如Deployment、StatefulSet等。此操作將停止啟動並執行Pod並卸載儲存卷。
命令樣本:
kubectl delete deployment <your-deployment-name>
刪除PVC
操作:刪除應用關聯的PVC。刪除後,其綁定PV的後續行為取決於該PV的
persistentVolumeReclaimPolicy。回收策略說明:
命令樣本:
kubectl delete pvc <your-pvc-name>
刪除PV對象:此操作僅移除叢集內的資源定義,不會刪除後端的雲端硬碟實體。
操作:手動刪除處於
Released狀態的PV。命令樣本:
kubectl delete pv <your-pv-name>
相關文檔
雲端硬碟多可用性區域部署的配置最佳化建議,請參見雲端硬碟儲存卷的高可用配置建議。
雲端硬碟容量不足或磁碟已滿,請參見擴容雲端硬碟儲存卷進行擴容。
如果不再使用某塊雲端硬碟且希望雲端硬碟停止計費時,可釋放雲端硬碟。釋放後,雲端硬碟及儲存在雲端硬碟上的資料會被刪除、雲端硬碟停止計費。
使用雲端硬碟儲存卷時如遇問題,請參見雲端硬碟儲存卷FAQ。
如叢集仍在使用廢棄的FlexVolume組件,請遷移FlexVolume至CSI。
