全部產品
Search
文件中心

Container Service for Kubernetes:使用靜態儲存卷掛載雲端硬碟

更新時間:May 14, 2026

通過手動建立PV、PVC,可將雲端硬碟以靜態儲存卷的方式掛載到Pod上,以滿足持久化儲存需求,適用於對磁碟 I/O 效能和低延遲要求高、無資料共用需求的情境

雲端硬碟適用於以下儲存情境:

  • 對磁碟I/O要求高的應用,且沒有共用資料的需求,如MySQL、Redis等資料存放區服務。

  • 高速寫日誌。

  • 持久化儲存資料,不會因Pod生命週期的結束而消失。

流程指引

  1. 建立PV
    在叢集中“註冊”一個已有的雲端硬碟,聲明雲端硬碟的ID、容量、訪問模式、可用性區域親和性等,確保Pod能夠被調度到正確的節點。

  2. 建立PVC
    應用通過PVC來“申請”使用登入的儲存資源。PVC會與合格PV進行綁定。

  3. 在應用中掛載
    將已綁定的PVC掛載到應用Pod中,作為容器內的一個持久化目錄。

適用範圍

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

    CSI組件預設安裝,請確保未手動卸載。可在組件管理頁面查看安裝情況。建議升級CSI組件至最新版本。
  • 雲端硬碟為待掛載狀態,且滿足以下要求:

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

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

  • 虛擬節點限制:如需在虛擬節點上使用雲端硬碟,需遵循叢集和kube-scheduler版本要求。

    展開查看版本要求

    叢集版本

    kube-scheduler版本

    1.28及以上

    6.9.3及以上

    1.26

    6.8.7

    1.24

    6.4.7

    1.22

    6.4.5

  • 靈駿節點限制:如需在靈駿節點上使用雲端硬碟,需滿足以下要求。

    展開查看

步驟一:建立PV

建立 PV,將已有雲端硬碟聲明為叢集中的一個可用儲存資源。

kubectl

  1. 參見以下內容,建立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_entry

    • ESSD AutoPL雲端硬碟:cloud_auto

    • ESSD雲端硬碟:cloud_essd

    • SSD雲端硬碟: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)。

    persistentVolumeReclaimPolicy

    PV的回收策略,決定了綁定的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中的該配置項取值保持一致。

  2. 建立PV。

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

控制台

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

  2. 儲存卷頁面,單擊建立,選擇儲存卷類型雲端硬碟,按照頁面提示完成PV的配置。

    參數

    描述

    訪問模式

    僅支援ReadWriteOnce。

    雲端硬碟ID

    單擊選擇雲端硬碟,選擇與節點處於同一地區可用性區域下的待掛載的雲端硬碟。

    檔案系統類型

    選擇以何種資料類型將資料存放區到雲端硬碟上。支援檔案系統類型包括ext4、ext3、xfs、vfat。

步驟二:建立PVC

建立 PVC,綁定上一步建立的 PV。

kubectl

  1. 參見以下內容,建立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,可刪除此參數。

  2. 建立PVC。

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

控制台

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

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

    參數

    描述

    分配模式

    選擇已有儲存卷

    已有儲存卷

    選擇此前建立的PV。

    總量

    分配給Pod的儲存容量,不超過雲端硬碟容量上限。

步驟三:建立應用並掛載雲端硬碟

建立工作負載,並通過掛載 PVC 來使用雲端硬碟。

重要

雲端硬碟為非共用儲存,未開啟多重掛載時一次只能掛載一個Pod。在多副本 Deployment 中共用PVC會導致新Pod無法掛載仍被舊Pod佔用的雲端硬碟而啟動失敗。推薦使用StatefulSet或單獨為Pod掛載雲端硬碟。

如仍需在Deployment中使用雲端硬碟,建議使用雲端硬碟作為臨時儲存卷。如需啟用多重掛載,請參見使用NVMe雲端硬碟多重掛載及Reservation

kubectl

  1. 參見以下內容,建立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狀態。

  2. 建立StatefulSet並掛載雲端硬碟。

    kubectl create -f disk-test.yaml
  3. 查看 Pod 狀態,確認為 Running

    kubectl get pod -l app=nginx

    預期輸出:

    NAME          READY   STATUS    RESTARTS   AGE
    disk-test-0   1/1     Running   0          14s
  4. 查看掛載路徑,確認已掛載雲端硬碟。

    kubectl exec disk-test-0 -- df -h /data

    預期輸出:

    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vdb         20G   24K   20G   1% /data

控制台

  1. 在叢集管理頁左側導覽列,選擇工作負載 > 有狀態

  2. 有狀態頁面,單擊使用鏡像建立

  3. 有狀態頁面,單擊使用鏡像建立,按照頁面提示完成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。

  4. 查看應用部署情況。

    1. 有狀態頁面,單擊應用程式名稱。

    2. 容器組頁簽下,確認Pod已正常運行(狀態為Running)。

驗證資料持久化儲存

通過“寫入資料 -> 刪除 Pod -> 檢查資料”的流程,來驗證儲存在雲端硬碟上的資料在 Pod 重建後是否仍然存在。

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

    1. 查看掛載路徑,即查看雲端硬碟中的資料。

      kubectl exec disk-test-0 -- ls /data

      預期輸出:

      lost+found
    2. 在 Pod 中寫入測試資料。

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

      kubectl exec disk-test-0 -- touch /data/test
  2. 類比 Pod 故障,刪除 Pod。

    kubectl delete pod disk-test-0

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

  3. 驗證新 Pod 中的資料。

    在新Pod disk-test-0中再次檢查 /data 目錄。

    kubectl exec disk-test-0 -- ls /data

    預期輸出中,此前建立的 test 檔案依然存在,表明即使 Pod 被刪除重建,資料也實現了持久化儲存。

    lost+found  
    test

應用於生產環境

  • 高可用性

    • Pod調度策略

      在PV中正確配置nodeAffinitycsi.alibabacloud.com/volume-topology,確保Pod在重建後能夠成功調度並重新掛載雲端硬碟。

    • 雲端硬碟選型

      需綜合評估其效能計費以及節點的可用性區域和執行個體規格類型系列,確保Pod能被調度至相容的節點。

      選擇雲端硬碟類型時,SSD雲端硬碟、高效雲端硬碟已逐步停止售賣。建議選用ESSD PL0雲端硬碟或ESSD Entry雲端硬碟替換高效雲端硬碟,選用ESSD AutoPL雲端硬碟替換SSD雲端硬碟。

    • 構建跨可用性區域容災方案

      • 應用程式層容災: 對於資料庫等關鍵業務,在多個可用性區域部署應用執行個體,並通過應用自身的資料同步機制實現高可用。

      • 儲存層容災:選用支援多可用性區域容災的雲端硬碟類型,將資料即時同步寫入同一地區的不同可用性區域,實現跨可用性區域的故障恢複,請參見使用ESSD同城冗餘雲端硬碟

  • 資料安全:

    • 常態化備份:通過自動快照為雲端硬碟建立自動快照,以便資料備份和恢複。

  • 效能與成本最佳化

    • 啟用並行掛載

      預設情況下,單個節點的雲端硬碟操作是串列的。可使用雲端硬碟並行掛載,加速Pod啟動。

    • 配置儲存監控與警示

      基於容器儲存監控配置警示,及時發現儲存卷異常或效能瓶頸。

資源釋放指引

為避免產生預期外的費用並確保資料安全,請遵循以下流程釋放無需使用的資源。

  1. 刪除工作負載

    • 操作:刪除所有使用相關PVC的應用,例如Deployment、StatefulSet等。此操作將停止啟動並執行Pod並卸載儲存卷。

      命令樣本:kubectl delete deployment <your-deployment-name>

  2. 刪除PVC

    • 操作:刪除應用關聯的PVC。刪除後,其綁定PV的後續行為取決於該PV的persistentVolumeReclaimPolicy

    • 回收策略說明:

      • Retain:刪除PVC後,其綁定的PV狀態會變為Released,但PV對象和後端的雲端硬碟會被完整保留。如確認雲端硬碟及其上的所有資料無需使用,請參見釋放雲端硬碟刪除。此操作無法復原,請務必謹慎操作。

      • Delete:刪除PVC後,PV對象和後端的雲端硬碟會被刪除。雲端硬碟上的資料將永久丟失且無法恢複,請謹慎使用。

        為防止資料意外丟失,可在執行刪除前為雲端硬碟建立自動快照策略進行備份。
    • 命令樣本:kubectl delete pvc <your-pvc-name>

  3. 刪除PV對象:此操作僅移除叢集內的資源定義,不會刪除後端的雲端硬碟實體。

    • 操作:手動刪除處於Released狀態的PV。

    • 命令樣本:kubectl delete pv <your-pv-name>

相關文檔