全部產品
Search
文件中心

Container Service for Kubernetes:實現雲端硬碟動態預留持久化儲存卷資源

更新時間:Jul 27, 2024

除靜態儲存外,您也可以建立PVC並配置StorageClass來實現儲存資源的動態分配,讓系統為您自動預留持久化儲存卷。您可以更關注叢集應用的儲存需求,無需預先手動建立和配置儲存資源,降低底層基礎設施的複雜性。

使用限制

  • 雲端硬碟不支援跨可用性區域使用。

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

  • 雲端硬碟類型和ECS類型需要匹配才可以掛載,否則會導致Pod無法啟動。關於雲端硬碟類型和ECS類型的匹配關係,請參見執行個體規格類型系列

    重要

    當您將叢集中的ECS執行個體從隨用隨付轉換成訂用帳戶時,不能將雲端硬碟一起變成訂用帳戶,否則雲端硬碟將無法被掛載使用。您可以通過購買SCU的方式降低成本。關於SCU的更多資訊,請參見儲存容量單位包SCU概述

前提條件

重要
  • 如果您的叢集中包含CentOS 7.9鏡像(或其他運行小於4.9版本Linux核心)的宿主機,並且在叢集中使用了XFS檔案系統(fstype參數設定為xfs)的儲存卷,請勿將CSI組件升級到v1.24.7及以上的版本。因為舊版核心與新版本組件不相容。如果誤升級,掛載XFS檔案系統的儲存卷的Pod將可能無法啟動,對其他檔案系統無影響,請提交工單處理。

  • 如需將CSI組件升級至v1.26.4版本,您需要將CSI provisioner和CSI plugin同時升級至該版本。

使用說明

  • 在應用部署時,通過StorageClass自動建立PV購買雲端硬碟。如果您已經購買雲端硬碟,推薦使用雲端硬碟靜態儲存卷

  • 申請雲端硬碟的大小,不能超出雲端硬碟的單盤容量範圍。更多資訊,請參見儲存規格

  • 當Pod重建時,會重新掛載原雲端硬碟。若由於其他限制無法調度到原可用性區域,則Pod將會處於Pending狀態。

  • 動態建立的雲端硬碟為隨用隨付的雲端硬碟,關於雲端硬碟計費項目資訊,請參見Block Storage計費。關於雲端硬碟的價格資訊,請參見Elastic Compute Service產品詳情頁

您可以通過控制台建立StorageClass和PVC並建立應用,也可以通過kubectl完成此操作。

通過控制台使用雲端硬碟動態儲存裝置卷

步驟一:建立StorageClass

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

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

  3. 儲存類頁面,單擊右上方的建立

  4. 建立對話方塊,配置儲存類StorageClass的相關參數。

    主要配置項說明如下。

    配置項

    說明

    名稱

    StorageClass的名稱。

    儲存卷類型

    可選擇雲端硬碟NAS。本樣本選擇雲端硬碟

    參數

    雲端硬碟類型。預設參數為type,其值為cloud_essd,支援設定的參數值如下:

    • 高效雲端硬碟cloud_efficiency

    • ESSD AutoPLcloud_auto

    • SSD雲端硬碟cloud_ssd

    • ESSD雲端硬碟cloud_essd

    • ESSD Entrycloud_essd_entry

    以上參數可任意組合。例如type: cloud_efficiency, cloud_ssd, cloud_essd,此配置方式會支援對指定類型的雲端硬碟依次建立,直到建立成功。

    說明

    不同ECS機型支援的雲端硬碟類型不同。更多資訊,請參見Block StorageFAQ

    單擊添加,可設定自訂參數。支援自訂參數如下:

    • resourceGroupId:可選,定義雲端硬碟的資源群組。預設為""

    • regionId:可選,自動建立雲端硬碟所在的地區,與叢集的地區相同。

    • zoneId:可選,自動建立雲端硬碟所在的地區。

      • 單可用性區域叢集,與叢集所在地區相同。

      • 多可用性區域叢集,zoneId可同時配置多個,例如cn-beijing-a, cn-beijing-b

    • fstype:可選,自動建立雲端硬碟所使用的檔案系統,取值ext4xfs,預設為ext4

    • mkfsOptions:可選,雲端硬碟格式化所用的參數。例如mkfsOptions: "-O project,quota"

    • diskTags:可選,自訂雲端硬碟標籤。例如diskTags: "a:b,b:c"。也可以使用diskTags/a: b 的格式指定(v1.30.3起)。

    • encrypted:可選,表示建立的雲端硬碟是否加密。預設為false,建立的雲端硬碟不加密。

    • performanceLevel:可選,ESSD雲端硬碟的效能層級,取值PL0PL1PL2PL3。預設值為PL1。更多資訊,請參見容量範圍與效能層級的關係

    • volumeExpandAutoSnapshot:可選,雲端硬碟擴容時通過極速快照實現自動資料備份,保證資料安全,預設為closed

      • forced:自動快照建立失敗時放棄雲端硬碟擴容。

      • besteffort:自動快照建立失敗時報event warning,繼續進行雲端硬碟擴容。

      • closed:不使用自動快照功能。

      如果資料安全性要求高,推薦使用forced方式避免擴容失敗時的資料丟失。

      說明

      僅支援對ESSD雲端硬碟進行擴容。擴容正常時,自動快照將自動刪除;擴容失敗時,自動快照將保留24小時。

    • provisionedIops:可選,雲端硬碟的預配置效能(IOPS)。

      可能值:0~min{50,000, 1000×容量-基準效能}。

      基準效能=min{1,800+50×容量, 50000}。

      說明

      該參數僅支援ESSD AutoPL雲端硬碟。更多資訊,請參見ESSD AutoPL雲端硬碟規格

    • burstingEnabled:可選,是否開啟Burst(效能突發)。預設為false。

      • true:開啟。

      • false:不開啟。

      說明

      該參數僅支援ESSD AutoPL雲端硬碟。更多資訊,請參見ESSD AutoPL雲端硬碟規格

    • multiAttach:可選,設定為true以開啟多執行個體掛載,請參見雲端硬碟多重掛載功能

    回收策略

    雲端硬碟的回收策略,預設為Delete

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

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

    如果資料安全性要求高,推薦使用Retain方式,以免誤刪資料。

    繫結模式

    雲端硬碟的繫結模式。預設為Immediate

    • Immediate:表示先建立雲端硬碟再調度Pod。

    • WaitForFirstConsumer:延遲綁定,即調度器先調度Pod,並根據Pod的可用性區域資訊建立雲端硬碟。

  5. 參數配置完成後,單擊建立

    建立成功後,您可在儲存類列表查看建立的StorageClass。

步驟二:建立PVC

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

  2. 儲存聲明頁面,單擊右上方的建立

  3. 建立儲存聲明對話方塊,配置PVC參數。

    配置項

    說明

    儲存宣告類型

    支援雲端硬碟、NAS、OSS三種雲端儲存類型。本樣本選擇雲端硬碟。

    名稱

    建立的儲存聲明名稱在命名空間內必須唯一。

    分配模式

    本樣本選擇使用儲存類動態建立,即支援通過StorageClass動態建立PV。

    已有儲存類

    選擇已有的StorageClass,用於動態建立PV。

    總量

    所建立儲存卷的容量。

    訪問模式

    僅能使用ReadWriteOnce。更多選項請參見通過kubectl命令列使用雲端硬碟動態儲存裝置卷

  4. 單擊建立

    建立成功後,在儲存聲明列表中可看到建立的儲存聲明,並且已綁定相應的儲存卷。

步驟三:建立應用

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

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

  3. 配置建立應用的參數資訊。

    以下主要為您介紹資料卷的配置。關於其他參數的描述,請參見建立有狀態工作負載StatefulSet

  4. ACK資料卷支援配置本機存放區和雲端儲存,本樣本需要配置雲端儲存類型。配置了一個雲端硬碟類型的資料卷,將該雲端硬碟掛載到容器的/tmp路徑下,在該路徑下產生的容器資料會儲存到雲端硬碟中。資料卷

  5. 所有的資訊都配置完成後,單擊建立

    建立成功後,您就可以正常使用資料卷。

通過kubectl命令列使用雲端硬碟動態儲存裝置卷

步驟一:建立StorageClass

在多可用性區域叢集情境下,您可以根據不同的情境通過以下兩種方式建立StorageClass。

使用Topology(延遲綁定)的方式

延遲綁定可以最佳化ECS和雲端硬碟不在一個可用性區域的問題。下文以部署名為storage-class-csi-wffc.yaml檔案為例,建立StorageClass。

  1. 使用以下內容,建立storage-class-csi-wffc.yaml檔案。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-wait-for-first-consumer
    provisioner: diskplugin.csi.alibabacloud.com
    parameters:
      type: cloud_auto,cloud_essd,cloud_ssd # 使用該配置,按優先順序自適應選擇雲端硬碟類型,最終建立的雲端硬碟類型受節點執行個體、所在可用性區域雲端硬碟支援情況等因素影響。
      fstype: ext4
      diskTags: "a:b,b:c"
      encrypted: "false"
      performanceLevel: PL1
      volumeExpandAutoSnapshot: "forced" # 該設定僅在建立的雲端硬碟類型為cloud_essd時生效。
      provisionedIops: "40000"
      burstingEnabled: "false"
    volumeBindingMode: WaitForFirstConsumer
    reclaimPolicy: Retain
    allowVolumeExpansion: true

    參數

    說明

    metadata

    name

    StorageClass的名稱。名稱必須以小寫字母開頭,只能包含小寫字母、數字、小數點(.)和短劃線(-)。

    provisioner

    配置為diskplugin.csi.alibabacloud.com。表示使用阿里雲雲端硬碟Provisioner外掛程式建立StorageClass。

    parameters

    參見上文參數列表

    volumeBindingMode

    雲端硬碟的繫結模式。預設為Immediate,支援WaitForFirstConsumer

    • Immediate:表示先建立雲端硬碟再建立Pod。

    • WaitForFirstConsumer:延遲綁定,即調度器先調度Pod,並根據Pod的可用性區域資訊建立雲端硬碟。

    reclaimPolicy

    雲端硬碟的回收策略,預設為Delete,支援Retain

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

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

    如果資料安全性要求高,推薦使用Retain方式以免誤刪資料。

    allowVolumeExpansion

    配置為true時,可以實現雲端硬碟的自動擴容。

  2. 執行以下命令,建立StorageClass。

    kubectl apply -f storage-class-wffc.yaml
  3. 查看建立的StorageClass。

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

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

先建立雲端硬碟再建立Pod的方式

  1. 使用以下內容,建立storage-class-immediate.yaml檔案。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-immediate
    provisioner: diskplugin.csi.alibabacloud.com
    parameters:
      type: cloud_essd,cloud_ssd,cloud_efficiency #使用該配置,按優先順序自適應選擇雲端硬碟類型,最終建立的雲端硬碟類型受節點執行個體、所在可用性區域雲端硬碟支援情況等因素影響
      regionId: cn-beijing
      zoneId: cn-beijing-b
      encrypted: "false"
    reclaimPolicy: Retain
    allowVolumeExpansion: true
    volumeBindingMode: Immediate

    參數

    說明

    metadata

    name

    StorageClass的名稱。名稱必須以小寫字母開頭,只能包含小寫字母、數字、小數點(.)和短劃線(-)。

    provisioner

    配置為diskplugin.csi.alibabacloud.com。表示使用阿里雲雲端硬碟Provisioner外掛程式建立StorageClass。

    parameters

    參見上文參數列表

    reclaimPolicy

    雲端硬碟的回收策略,預設為Delete,支援Retain

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

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

    如果資料安全性要求高,推薦使用Retain方式,以免誤刪資料。

    allowVolumeExpansion

    配置為true時,可以實現雲端硬碟的自動擴容。

    volumeBindingMode

    雲端硬碟的繫結模式。預設為Immediate,支援WaitForFirstConsumer

    • Immediate:表示先建立雲端硬碟再調度Pod。

    • WaitForFirstConsumer:延遲綁定,即調度器先調度Pod,並根據Pod的可用性區域資訊建立雲端硬碟。

  2. 執行以下命令,建立StorageClass。

    kubectl apply -f storage-class-immediate.yaml
  3. 查看建立的StorageClass。

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

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

步驟二:建立PVC

  1. 使用以下內容,建立pvc-disk.yaml檔案。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: disk-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      volumeMode: Filesystem
      resources:
        requests:
          storage: 25Gi
      storageClassName: alicloud-disk-wait-for-first-consumer 

    參數

    說明

    name

    PVC的名稱。

    accessModes

    配置訪問模式。

    volumeMode

    可選,掛載雲端硬碟的格式,為FilesystemBlock。 預設為檔案系統掛載。

    storageClassName

    StorageClass的名稱,用於綁定StorageClass。

    storage

    申請的雲端硬碟大小,最小為20 GiB。

    其中,可用的訪問模式取決於StorageClass中的multiAttach參數以及PVC中的volumeMode,如下表:

    參數設定

    可用訪問模式

    multiAttach

    volumeMode

    ReadWriteOnce

    ReadOnlyMany

    ReadWriteMany

    image.png

    任意

    image.png

    image.png

    image.png

    image.png

    Filesystem

    image.png

    image.png

    image.png

    image.png

    Block

    image.png

    image.png

    image.png

    當使用雲端硬碟多掛載功能時,請參見使用NVMe雲端硬碟多重掛載及Reservation

  2. 執行以下命令,建立PVC。

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

    在叢集管理頁左側導覽列,選擇儲存 > 儲存聲明。在儲存聲明頁面可以看到建立的PVC。

步驟三:建立應用

  1. 使用以下內容,建立mysql.yaml檔案。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      selector:
        matchLabels:
          app: mysql
      serviceName: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: mysql:5.7
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            ports:
            - containerPort: 80
              name: mysql
            volumeMounts:
            - name: pvc-disk
              mountPath: /data
          volumes:
            - name: pvc-disk
              persistentVolumeClaim:
                claimName: disk-pvc
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysql-pass
    type: Opaque
    data:
      username: dGVz****             
      password: dGVzdDEt****     

    參數

    說明

    mountPath

    雲端硬碟掛載的位置。

    claimName

    PVC的名稱,用於綁定PVC。

  2. 執行以下命令,建立應用並掛載PVC。

    kubectl create -f mysql.yaml
  3. 查看已建立的應用。

    在叢集管理頁左側導覽列,選擇工作負載 > 有狀態。您可以在有狀態頁面看到已建立的應用。

驗證動態雲端硬碟的持久化儲存

當某個Pod被刪除時,重新部署的Pod將保留之前Pod在儲存卷中寫入的所有資料。您可以通過以下樣本驗證動態雲端硬碟的持久化儲存特性。

  1. 查看MySQL應用所在的Pod和雲端硬碟檔案。

    1. 執行以下命令,查看MySQL應用所在Pod的名稱。

      kubectl get pod | grep mysql

      預期輸出:

      nginx-dynamic-1****   1/1     Running     0          3m
    2. 執行以下命令,查看/data路徑下是否掛載了新的雲端硬碟。

      kubectl exec nginx-dynamic-1**** -- df | grep data

      預期輸出:

      /dev/vdh        20511312    45080  20449848   1% /data
    3. 執行以下命令,查看/data路徑下的檔案。

      kubectl exec nginx-dynamic-1**** -- ls /data

      預期輸出:

      lost+found
  2. 在雲端硬碟裡建立檔案。

    1. 執行以下命令,在/data路徑下建立檔案mysql

      kubectl exec nginx-dynamic-1**** -- touch /data/mysql
    2. 執行以下命令,查看/data路徑下的檔案。

      kubectl exec nginx-dynamic-1**** -- ls /data

      預期輸出:

      mysql
      lost+found
  3. 執行以下命令,刪除名為nginx-dynamic-1****的Pod。

    kubectl delete pod ngibnx-dynamic-1****

    預期輸出:

    pod "nginbx-dynamic-1****" deleted
  4. 驗證刪除Pod後,雲端硬碟中建立的檔案是否仍然存在。

    1. 執行以下命令,查看重建的Pod名稱。

      kubectl get pod 

      預期輸出:

      NAME                       READY   STATUS      RESTARTS   AGE
      nginx-dynamic-2**b**        1/1     Running     0          2m
    2. 執行以下命令,查看/data路徑下的檔案。

      kubectl exec nginx-dynamic-2**** -- ls /data

      預期輸出:

      mysql
      lost+found

      mysql檔案仍然存在,說明動態雲端硬碟的資料可以持久儲存。

相關文檔