全部產品
Search
文件中心

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

更新時間:Mar 29, 2025

雲端硬碟儲存卷適用於非共用資料,I/O和延遲要求較高的應用情境。對於已有雲端硬碟,您可以通過靜態儲存卷的方式掛載到Pod上,以此滿足持久化儲存需求。本文介紹如何使用雲端硬碟靜態儲存卷,並驗證雲端硬碟的持久化儲存。

使用情境

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

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

  • 高速寫日誌。

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

如果您已有雲端硬碟,可採用靜態儲存卷的方式為Pod掛載雲端硬碟。該方式需要手動建立PV(儲存卷)和PVC(儲存聲明),可以保證PV在容器啟動前已經就緒。更多資訊,請參見雲端硬碟儲存卷

前提條件

  • 叢集中已安裝CSI組件。

    說明
    • 您可以在叢集管理頁的左側導覽列選擇營運管理 > 組件管理,在儲存頁簽下確認csi-plugin和csi-provisioner組件的安裝情況。如需升級CSI組件來享受某些特定能力,請參見升級csi-plugin和csi-provisioner

    • 如果您的叢集目前使用Flexvolume組件,由於Flexvolume已廢棄,請先遷移到CSI組件。具體操作,請參見遷移Flexvolume至CSI

  • 待掛載的雲端硬碟滿足以下要求。

    • 雲端硬碟的計費方式為隨用隨付,狀態為待掛載

    • 雲端硬碟與ECS節點處於同一可用性區域,且雲端硬碟類型與ECS執行個體規格相匹配。

      重要

      雲端硬碟不支援跨可用性區域掛載,且某些類型的雲端硬碟不支援掛載到某些規格的ECS執行個體,因此需要確保待掛載雲端硬碟的Pod所調度到的ECS節點的可用性區域和規格能夠和已有雲端硬碟相匹配,否則雲端硬碟會掛載失敗。關於雲端硬碟類型和ECS執行個體規格的匹配關係,請參見執行個體規格類型系列

注意事項

  • 雲端硬碟為非共用儲存,未開啟多重掛載的雲端硬碟只能同時被一個Pod掛載。關於多重掛載更多資訊,請參見使用NVMe雲端硬碟多重掛載及Reservation

  • 雲端硬碟只能掛載到相同可用性區域的Pod上,不支援跨可用性區域掛載。

  • Pod重建時會重新掛載原有雲端硬碟,如果由於其他限制導致Pod無法調度到原可用性區域,則Pod會因為無法掛載雲端硬碟而一直處於Pending狀態。

  • 推薦使用StatefulSet掛載雲端硬碟或者單獨為Pod掛載雲端硬碟,不推薦使用Deployment。

    說明

    未開啟多重掛載時,一個雲端硬碟只能掛載到一個Pod上,為Deployment掛載雲端硬碟時,Replica必須配置為1,即無法為每個Pod配置獨立的儲存卷,並且不能保證掛載、卸載的優先順序。此外,由於Deployment的升級策略,重啟Pod時,新的Pod可能會一直無法掛載雲端硬碟。因此不推薦為Deployment掛載雲端硬碟。

  • 使用雲端硬碟儲存卷時,如果在應用的YAML中配置了securityContext.fsgroup,在掛載完成後,kubelet會執行chmodchown操作,導致掛載時間延長。

    說明

    配置了securityContext.fsgroup後,掛載雲端硬碟時會自動調整卷內檔案的所有者,根據檔案數量,這可能導致較長的準備時間。對於1.20及以上版本的Kubernetes叢集,您可以將fsGroupChangePolicy配置為OnRootMismatch,實現僅在初次開機容器時才會調整檔案的所有者,後續Pod升級或重建等情境下,掛載時間長度會恢複正常。若仍不能滿足需求,建議利用initContainer自行實現調整許可權相關操作。

掛載雲端硬碟靜態儲存卷(kubectl)

步驟一:建立PV

  1. 串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集在CloudShell上通過kubectl管理Kubernetes叢集

  2. 修改以下YAML內容,並儲存為disk-pv.yaml。

    請替換YAML中的如下內容:

    • <YOUR-DISK-ID>:已有雲端硬碟ID,例如d-uf628m33r5rsbi******

    • <YOUR-DISK-SIZE>:已有雲端硬碟的大小,例如20Gi

    • <YOUR-DISK-ZONE-ID>:已有雲端硬碟所在的可用性區域,例如cn-shanghai-f

    • <YOUR-DISK-CATEGORY>:已有雲端硬碟的類型,例如cloud_essd

      各類型雲端硬碟的取值如下:

      • ESSD Entry雲端硬碟:cloud_essd_entry

      • ESSD AutoPL雲端硬碟:cloud_auto

      • ESSD雲端硬碟:cloud_essd

      • SSD雲端硬碟:cloud_ssd

      • 高效雲端硬碟:cloud_efficiency

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: "<YOUR-DISK-ID>"
      annotations:
        csi.alibabacloud.com/volume-topology: '{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node.csi.alibabacloud.com/disktype.<YOUR-DISK-CATEGORY>","operator":"In","values":["available"]}]}]}'
    spec:
      capacity:
        storage: "<YOUR-DISK-SIZE>"
      claimRef:
        apiVersion: v1
        kind: PersistentVolumeClaim
        namespace: default
        name: disk-pvc
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: diskplugin.csi.alibabacloud.com
        volumeHandle: "<YOUR-DISK-ID>"
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.diskplugin.csi.alibabacloud.com/zone
              operator: In
              values:
              - "<YOUR-DISK-ZONE-ID>"
      storageClassName: alicloud-disk-topology-alltype
      volumeMode: Filesystem

    相關參數說明如下:

    參數

    說明

    csi.alibabacloud.com/volume-topology

    註解。用於配置成功掛載該雲端硬碟所需的額外節點約束。推薦填寫雲端硬碟類型,以確保Pod調度到支援該類型雲端硬碟的ECS節點。

    claimRef

    指定PV所能綁定的PVC。如果希望PV可被任意PVC綁定,請刪除該配置。

    accessModes

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

    persistentVolumeReclaimPolicy

    PV的回收策略。

    • Delete:刪除PVC時,PV和雲端硬碟會一起刪除。

    • Retain:刪除PVC時,PV和雲端硬碟不會被刪除,需要您手動刪除。

    driver

    取值為diskplugin.csi.alibabacloud.com,表示使用阿里雲雲端硬碟CSI外掛程式。

    nodeAffinity

    節點親和性配置。由於雲端硬碟不支援跨可用性區域掛載,通過該配置可以保證Pod調度到雲端硬碟所在可用性區域對應的ECS節點。

    storageClassName

    該配置對靜態卷無意義,無需預先建立對應的StorageClass,但需要確保PV和PVC中的該配置項取值保持一致。

  3. 建立PV。

    kubectl create -f disk-pv.yaml
  4. 查看PV。

    kubectl get pv

    預期返回:

    NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM              STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
    d-uf628m33r5rsbi******   20Gi       RWO            Retain           Available   default/disk-pvc   disk           <unset>                          1m36s

步驟二:建立PVC

  1. 將以下YAML內容儲存為disk-pvc.yaml。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: disk-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: "<YOUR-DISK-SIZE>"
      storageClassName: alicloud-disk-topology-alltype
      volumeName: "<YOUR-DISK-ID>"

    相關參數說明如下:

    參數

    說明

    accessModes

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

    storage

    分配給Pod的儲存容量。設定的值不能超過雲端硬碟本身容量。

    storageClassName

    該配置對靜態卷無意義,無需預先建立對應的StorageClass,但需要確保PV和PVC中的該配置項取值保持一致。

    volumeName

    指定PVC所能綁定的PV。如果希望PVC可綁定任意PV,請刪除該參數。

  2. 建立PVC。

    kubectl create -f disk-pvc.yaml
  3. 查看PVC。

    kubectl get pvc

    預期返回如下,可以看到PVC已關聯雲端硬碟PV。

    NAME       STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    disk-pvc   Bound    d-uf628m33r5rsbi******   20Gi       RWO            disk           <unset>                 64s

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

  1. 使用以下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: 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
  2. 建立StatefulSet並掛載雲端硬碟。

    kubectl create -f disk-test.yaml
  3. 查看StatefulSet中Pod的部署情況。

    kubectl get pod -l app=nginx

    預期返回如下,樣本使用的StatefulSet副本數為1,因此建立了一個Pod。

    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

掛載雲端硬碟靜態儲存卷(控制台)

步驟一:建立儲存卷(PV)

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面左側頂部,選擇目的地組群所在的資源群組和地區,單擊目的地組群名稱,然後在左側導覽列,選擇儲存 > 儲存卷

  3. 儲存卷頁面,單擊建立

  4. 在彈出的對話方塊中,完成參數配置,然後單擊建立

    參數

    描述

    樣本

    儲存卷類型

    選擇雲端硬碟

    雲端硬碟

    訪問模式

    僅支援ReadWriteOnce

    ReadWriteOnce

    雲端硬碟ID

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

    d-uf628m33r5rsbi******

    檔案系統類型

    選擇以何種資料類型將資料存放區到雲端硬碟上,支援的類型包括ext4ext3xfsvfat。預設為ext4

    ext4

    建立完成後,在儲存卷頁面可以看到新建立的PV。

步驟二:建立儲存聲明(PVC)

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

  2. 儲存聲明頁面,單擊建立

  3. 在彈出的對話方塊中,完成參數配置,然後單擊建立

    參數

    描述

    樣本

    儲存宣告類型

    選擇雲端硬碟

    雲端硬碟

    名稱

    PVC名稱,自訂輸入。格式要求請參考介面提示。

    diks-pvc

    分配模式

    選擇已有儲存卷

    已有儲存卷

    已有儲存卷

    選擇步驟一建立的儲存卷。

    d-uf690053kttkprgx****, 20Gi

    總量

    分配給Pod的儲存容量。設定的值不能超過雲端硬碟本身容量。

    20Gi

    建立完成後,在儲存聲明頁面可以看到新建立的PVC,該PVC已綁定PV(即雲端硬碟儲存卷)。

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

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

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

  3. 完成StatefulSet的參數配置,單擊建立

    需要注意的參數如下,其他參數按需設定。更多資訊,請參見建立有狀態工作負載StatefulSet

    配置頁

    參數

    描述

    樣本

    應用基本資料

    應用程式名稱

    StatefulSet名稱,自訂輸入。格式要求請參考介面提示。

    disk-test

    副本數量

    配置StatefulSet的副本數量。

    1

    容器配置

    鏡像名稱

    輸入用於部署應用的鏡像地址。

    anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

    所需資源

    設定所需的vCPU、記憶體和臨時儲存資源。

    • CPU:0.25 Core

    • 記憶體:512 MiB

    • Ephemeral-Storage:不設定

    資料卷

    單擊增加雲端儲存聲明,然後完成參數配置。

    • 掛載源:選擇步驟二建立的PVC。

    • 容器路徑:輸入雲端硬碟要掛載到的容器路徑。

    • 掛載源:disk-pvc

    • 容器路徑:/data

  4. 查看應用部署情況。

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

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

驗證雲端硬碟的持久化儲存(kubectl)

按照上文樣本建立的StatefulSet中含有1個Pod,該Pod掛載了一個雲端硬碟。當該Pod被刪除時,自動建立的新Pod將重新掛載之前的雲端硬碟,雲端硬碟中的資料仍然保留。您可以通過以下方式驗證雲端硬碟的持久化儲存。

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

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

    預期返回:

    lost+found
  2. 在雲端硬碟中寫入檔案。

    kubectl exec disk-test-0 -- touch /data/test
  3. 刪除Pod。

    kubectl delete pod disk-test-0
    說明

    刪除StatefulSet中的Pod後,系統會自動建立一個新的Pod。

  4. 查看新建立的Pod。

    kubectl get pod -l app=nginx

    預期返回如下,由於StatefulSet的命名特性,新建立的Pod和之前的Pod名稱一致。

    NAME          READY   STATUS    RESTARTS   AGE
    disk-test-0   1/1     Running   0          27s
  5. 確認新建立的Pod已重新掛載雲端硬碟,雲端硬碟中的資料仍然存在。

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

    預期返回如下,可以看到雲端硬碟中存在之前寫入的test檔案。

    lost+found  
    test

相關文檔