全部產品
Search
文件中心

Container Service for Kubernetes:通過動態儲存裝置卷使用雲端硬碟進行持久化儲存

更新時間:Dec 06, 2025

基於動態儲存裝置卷機制,可為每個應用副本自動建立並掛載一個獨立的雲端硬碟,適用於資料庫、中介軟體等等對 I/O 和延遲要求較高的情境,同時能夠簡化儲存的生命週期管理。

工作原理

在StatefulSet中使用雲端硬碟動態儲存裝置卷的流程如下:

  1. 定義模板
    建立或使用預設 StorageClass,作為動態建立雲端硬碟的模板,規定其類型、效能、回收策略等關鍵參數。

  2. 在應用中聲明儲存需求

    在StatefulSet中定義 volumeClaimTemplates,並引用 StorageClass,聲明Pod待使用的PVC的規格,如儲存容量、訪問模式等。

  3. 自動化建立並掛載儲存卷
    StatefulSet 建立 Pod 時,系統會基於模板自動為其產生一個唯一的 PVC。CSI組件會根據 StorageClass 的規則建立 PV 並與 PVC 綁定,最終將該雲端硬碟掛載到 Pod 中。

適用範圍

  • 可用性區域限制:除ESSD同城冗餘雲端硬碟外,其他雲端硬碟類型無法跨可用性區域掛載,只能掛載到同一可用性區域下的Pod。

  • 執行個體規格類型系列限制:部分雲端硬碟類型僅支援掛載到特定的執行個體規格類型系列

  • CSI組件限制:已安裝csi-plugin組件和csi-provisioner組件。

    CSI組件預設安裝,請確保未手動卸載。可在組件管理頁面查看安裝情況。建議升級CSI組件至最新版本。
  • 虛擬節點限制:如需在虛擬節點上使用雲端硬碟,需遵循叢集和kube-scheduler版本要求。

    展開查看版本要求

    叢集版本

    kube-scheduler版本

    1.28及以上

    6.9.3及以上

    1.26

    6.8.7

    1.24

    6.4.7

    1.22

    6.4.5

步驟一:選擇StorageClass

為便於使用,ACK提供多種預設StorageClass。由於StorageClass建立後無法修改,若預設配置不滿足需求,可通過手動建立StorageClass建立。

使用預設StorageClass

可從以下預設StorageClass中選擇一個,在應用的storageClassName欄位中引用其名稱即可。

StorageClass名稱

動態建立的雲端硬碟類型

alicloud-disk-topology-alltype(推薦)

預設先調度Pod再建立雲端硬碟,避免因可用性區域不匹配導致掛載失敗(volumeBindingMode: WaitForFirstConsumer)。Pod調度到的節點可用性區域和執行個體規格,會結合雲端硬碟庫存情況,按ESSD、SSD、高效雲端硬碟的順序嘗試建立。預設優先建立ESSD PL1,容量大小最低為20 GiB。

alicloud-disk-essd

ESSD雲端硬碟,預設為PL1效能層級,雲端硬碟容量大小最低為20 GiB。

重要

雲盒內的ESSD雲端硬碟僅支援PL0層級,需手動建立StorageClass並指定performanceLevelPL0

alicloud-disk-ssd

SSD雲端硬碟,雲端硬碟容量大小最低為20 GiB。

alicloud-disk-efficiency

高效雲端硬碟,雲端硬碟容量大小最低為20 GiB。

可通過kubectl describe sc <storageclass-name>查看StorageClass詳細配置。

手動建立StorageClass

kubectl

  1. 建立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

    parameters

    type

    雲端硬碟類型,必填參數。可取值:

    支援任意組合,例如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,不加密。

    performanceLevel

    ESSD雲端硬碟效能層級,取值PL0PL1(預設)、PL2PL3

    通過雲盒使用時需設定為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 的列表。

  2. 建立StorageClass。

    kubectl create -f disk-sc.yaml
  3. 查看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

控制台

  1. ACK叢集列表頁面,單擊目的地組群名稱,在叢集詳情頁左側導覽列,選擇儲存 > 儲存類

  2. 單擊建立,選擇儲存卷類型為雲端硬碟,完成參數配置,然後單擊建立

    參數

    描述

    參數

    • 預設參數:type

      雲端硬碟類型,必填參數。可取值:

      支援任意組合,例如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雲端硬碟效能層級,取值PL0PL1(預設)、PL2PL3

        通過雲盒使用時需設定為PL0
      • provisionedIops使用ESSD AutoPL雲端硬碟時,配置雲端硬碟的預配置效能(IOPS)

      • burstingEnabled使用ESSD AutoPL雲端硬碟時,是否開啟Burst(效能突發)。預設為false,不開啟。

      • multiAttach是否開啟雲端硬碟多重掛載功能。預設為false,不開啟。

    回收策略

    雲端硬碟回收策略。

    • 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

  1. 建立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在主應用程式容器啟動前自行執行許可權調整命令。

  2. 建立StatefulSet。

    kubectl create -f statefulset.yaml
  3. 確認Pod處於Running狀態。

    kubectl get pod -l app=nginx
  4. 查看掛載路徑,確認已掛載雲端硬碟。

    本樣本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 重建後是否仍然存在。

  1. 在 Pod 中寫入測試資料。

    以Pod web-1為例,在其掛載的雲端硬碟路徑 /data下建立一個test檔案。

    kubectl exec web-1 -- touch /data/test
    kubectl exec web-1 -- ls /data

    預期輸出:

    lost+found
    test
  2. 類比 Pod 故障,刪除 Pod。

    kubectl delete pod web-1

    再次執行kubectl get pod -l app=nginx,可以發現已自動建立一個同名的Pod web-1

  3. 驗證新 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同城冗餘雲端硬碟

  • 資料安全與備份

    • 防止意外刪除資料:

      為防止資料丟失,建議將StorageClass的reclaimPolicy設定為Retain,PVC刪除後,後端的雲端硬碟不會被刪除,便於資料恢複。

    • 常態化備份

      動態磁碟區簡化了資源供給,但不能替代資料備份。對於核心業務,使用備份中心進行資料的備份和恢複。

    • 啟用靜態加密:對於資料敏感型應用,在StorageClass中配置encrypted: "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。

  1. 準備StorageClass

  2. 建立PVC,申請儲存資源。

    kubectl

    1. 建立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

      儲存卷的訪問模式。可取值:ReadWriteOnceReadOnlyManyReadWriteMany。具體取決於StorageClass中的multiAttach配置以及PVC中的volumeMode配置。

      multiAttach表示是否開啟雲端硬碟多重掛載。預設為false,不開啟。
      • multiAttachfalsevolumeMode配置為任意值時,訪問模式僅支援ReadWriteOnce

      • multiAttachtruevolumeModeFilesystem時,訪問模式僅支援ReadWriteOnceReadOnlyMany

      • multiAttachtruevolumeModeBlock時,三種訪問模式均支援。

      重要

      此情境下,訪問模式通常為ReadWriteOnce (RWO) ,即同一時間只能被一個Pod掛載。因此Deployment副本數不能大於1。如嘗試擴容,新Pod會因無法掛載已被佔用的雲端硬碟而一直處於Pending狀態。

      volumeMode

      儲存卷的模式。可取值:

      • Filesystem(預設):儲存卷會被格式化並掛載為目錄。

      • Block:儲存卷以未格式化的塊裝置形式直接提供給 Pod。

      storage

      申請的儲存容量大小。不同雲端硬碟類型的容量範圍不同。請確保storage取值符合其引用的 StorageClass 所對應的雲端硬碟類型的容量限制,以免雲端硬碟建立失敗。

      storageClassName

      待綁定的StorageClass。

    2. 建立PVC。

      kubectl create -f disk-pvc.yaml
    3. 查看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

    控制台

    1. 在叢集管理頁左側導覽列,選擇儲存 > 儲存聲明

    2. 儲存聲明頁面,單擊建立,選擇儲存宣告類型雲端硬碟,按照頁面提示完成參數的配置。

      參數

      描述

      分配模式

      選擇使用儲存類動態建立

      已有儲存類

      預設建立或手動建立的StorageClass。

      總量

      申請的儲存容量大小。不同雲端硬碟類型的容量範圍不同。請確保storage取值符合其引用的 StorageClass 所對應的雲端硬碟類型的容量限制,以免雲端硬碟建立失敗。

      訪問模式

      僅支援ReadWriteOnce,表示卷只能被一個Pod以讀寫方式掛載。

      建立完成後,可在儲存聲明頁面查看新建立的PVC。

  3. 在應用中掛載PVC。

    1. 建立disk-deployment.yaml

      展開查看樣本YAML

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: single-pod-app
      spec:
        # 確保副本數為1
        replicas: 1
        selector:
          matchLabels:
            app: nginx-single
        template:
          metadata:
            labels:
              app: nginx-single
          spec:
            containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              ports:
              - containerPort: 80
              # 在容器內定義掛載點
              volumeMounts:
              - name: my-persistent-storage  # 必須與下面volumes中定義的name一致
                mountPath: /data  # 掛載到容器內的/data目錄
            # 在Pod層級聲明並引用PVC
            volumes:
            - name: my-persistent-storage # 供容器引用的卷
              persistentVolumeClaim:
                claimName: disk-pvc # 引用此前建立的PVC
    2. 部署Deployment。

      kubectl create -f disk-deployment.yaml
  4. 驗證掛載結果。

    1. 確認Pod已經成功運行。

      kubectl get pods -l app=nginx-single
    2. 進入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

相關文檔