全部產品
Search
文件中心

Container Compute Service:動態掛載雲端硬碟儲存卷

更新時間:Dec 11, 2024

對於非共用資料,I/O和延遲要求較高的應用情境,可以選擇雲端硬碟作為持久化儲存卷。本文介紹如何為應用動態掛載雲端硬碟儲存卷,並驗證雲端硬碟的持久化儲存。

背景資訊

雲端硬碟是一種資料區塊層級的Block Storage產品,採用分布式多副本機制,具有低時延、高效能、持久性、高可靠等特點。適用於非共用資料,以及對I/O、延遲要求較高的應用情境。更多資訊,請參見儲存概述

說明

ACS僅支援動態掛載雲端硬碟儲存卷,暫不支援靜態掛載雲端硬碟儲存卷。

前提條件

ACS叢集中已安裝managed-csiprovisioner組件。

說明

您可以在ACS叢集管理頁的左側導覽列選擇營運管理 > 組件管理,在儲存頁簽下查看managed-csiprovisioner組件的安裝情況。

使用限制

  • 雲端硬碟為非共用儲存,一個雲端硬碟儲存卷只能掛載到一個Pod上。

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

注意事項

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

    說明

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

  • 動態掛載雲端硬碟時,自動建立的雲端硬碟採用隨用隨付。

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

    說明

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

動態掛載雲端硬碟儲存卷

通過kubectl命令

步驟一:建立StorageClass

預設情況下,ACS提供了名為alicloud-disk-topology-alltype的StorageClass,該StorageClass支援依次建立cloud_essd(ESSD雲端硬碟)、cloud_ssd(SSD雲端硬碟)和cloud_efficiency (高效雲端硬碟)類型的PV。如果預設提供的StorageClass無法滿足您的需求,您可以參考以下步驟手動建立新的StorageClass。

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

  2. 參考參數說明表修改以下YAML內容,並儲存為disk-sc.yaml。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-essd
    provisioner: diskplugin.csi.alibabacloud.com
    parameters:
      type: cloud_essd
      fstype: ext4
      performanceLevel: PL1
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true

    相關參數說明如下:

    參數

    說明

    type

    雲端硬碟類型。取值如下:

    • cloud_essd_entry:ESSD Entry雲端硬碟

    • cloud_auto:ESSD AutoPL雲端硬碟

    • cloud_essd(預設值):ESSD雲端硬碟

    • cloud_ssd:SSD雲端硬碟

    • cloud_efficiency:高效雲端硬碟

    支援任意組合上述參數,例如:type: cloud_efficiency, cloud_ssd, cloud_essd,此時將按照配置順序依次嘗試建立指定類型的雲端硬碟,直到建立成功。

    說明

    您可以結合雲端硬碟計費、效能等選擇合適的雲端硬碟類型。更多資訊,請參見Block Storage價格Block Storage效能

    fstype

    雲端硬碟的檔案系統類型。預設為ext4。支援ext3ext4xfs

    performanceLevel

    ESSD雲端硬碟的效能層級。預設為PL1。支援PL0PL1PL2PL3。更多資訊,請參見ESSD雲端硬碟

    provisioner

    驅動類型。此處配置為diskplugin.csi.alibabacloud.com,表示使用阿里雲雲端硬碟CSI外掛程式。

    reclaimPolicy

    雲端硬碟的回收策略,僅支援Delete,表示刪除PVC時,PV和雲端硬碟會一起刪除。

    volumeBindingMode

    雲端硬碟的繫結模式。僅支援WaitForFirstConsumer,表示延遲綁定,即先調度Pod,再根據Pod的可用性區域資訊建立雲端硬碟。

    allowVolumeExpansion

    是否自動擴容雲端硬碟。

  3. 建立StorageClass。

    kubectl create -f disk-sc.yaml
  4. 查看StorageClass。

    kubectl get sc

    預期返回:

    NAME                             PROVISIONER                       RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    alicloud-disk-essd               diskplugin.csi.alibabacloud.com   Delete          WaitForFirstConsumer   true                   78s
    alicloud-disk-topology-alltype   diskplugin.csi.alibabacloud.com   Delete          WaitForFirstConsumer   true                   23d
    ......

步驟二:建立PVC

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

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: disk-pvc
    spec:
      accessModes:
      - ReadWriteOncePod
      volumeMode: Filesystem
      resources:
        requests:
          storage: 20Gi
      storageClassName: alicloud-disk-essd

    相關參數說明如下:

    參數

    說明

    accessModes

    訪問模式。目前僅支援ReadWriteOncePod。

    volumeMode

    儲存卷的模式。取值範圍:

    • Filesystem(預設):檔案系統

    • Block:塊

    storage

    分配給Pod的儲存容量,即要建立的雲端硬碟容量大小。

    storageClassName

    要綁定的StorageClass名稱。

  2. 建立PVC。

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

    kubectl get pvc

    預期返回如下,可以看到由於volumeBindingModeWaitForFirstConsumer,此時PVC還未綁定PV。

    NAME       STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS         VOLUMEATTRIBUTESCLASS   AGE
    disk-pvc   Pending                                      alicloud-disk-essd   <unset>                 7s

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

  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: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
            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
    重要

    建立StatefulSet時,系統將根據PVC和StorageClass的配置自動建立一塊隨用隨付的雲端硬碟,以及對應的PV。

  3. 查看StatefulSet中Pod的部署情況。

    kubectl get pod | grep disk-test

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

    disk-test-0   1/1     Running   0          52s
  4. 查看PVC。

    kubectl get pvc

    預期返回如下,可以看到此時PVC已綁定自動建立的雲端硬碟類型的PV。

    NAME       STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS         VOLUMEATTRIBUTESCLASS   AGE
    disk-pvc   Bound    d-uf698s3h14isyj6b****   20Gi       RWOP           alicloud-disk-essd   <unset>                 111s
  5. 查看掛載路徑,確認已掛載雲端硬碟。

    kubectl exec disk-test-0 -- df | grep data

    預期返回:

    /dev/vdb        20466256      24  20449848   1% /data

通過控制台

步驟一:建立儲存類(StorageClass)

預設情況下,ACS提供了名為alicloud-disk-topology-alltype的StorageClass,該StorageClass支援依次建立cloud_essd(ESSD雲端硬碟)、cloud_ssd(SSD雲端硬碟)和cloud_efficiency (高效雲端硬碟)類型的PV。如果預設提供的StorageClass無法滿足您的需求,您可以參考以下步驟手動建立新的StorageClass。

  1. 登入容器計算服務控制台

  2. 叢集頁面,單擊目的地組群ID,進入該叢集的管理頁面。

  3. 在叢集管理頁面的左側導覽列,選擇儲存 > 儲存類

  4. 建立儲存類。

    1. 儲存類頁面,單擊建立

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

      參數

      說明

      樣本

      名稱

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

      alicloud-disk-essd

      儲存卷類型

      選擇雲端硬碟

      雲端硬碟

      參數

      預設參數為type,表示雲端硬碟類型。取值如下:

      • cloud_essd_entry:ESSD Entry雲端硬碟

      • cloud_auto:ESSD AutoPL雲端硬碟

      • cloud_essd(預設值):ESSD雲端硬碟

      • cloud_ssd:SSD雲端硬碟

      • cloud_efficiency:高效雲端硬碟

      支援任意組合上述參數,例如:type: cloud_efficiency, cloud_ssd, cloud_essd,此時將按照配置順序依次嘗試建立指定類型的雲端硬碟,直到建立成功。

      說明

      您可以結合雲端硬碟計費、效能等選擇合適的雲端硬碟類型。更多資訊,請參見Block Storage價格Block Storage效能

      可添加以下參數:

      • fstype

        雲端硬碟的檔案系統類型。預設為ext4。支援ext3ext4xfs

      • performanceLevel

        ESSD雲端硬碟的效能層級。預設為PL1。支援PL0PL1PL2PL3。更多資訊,請參見ESSD雲端硬碟

      type:cloud_essd

      回收策略

      雲端硬碟的回收策略,僅支援Delete,表示刪除PVC時,PV和雲端硬碟會一起刪除。

      Delete

      繫結模式

      雲端硬碟的繫結模式。僅支援WaitForFirstConsumer,表示延遲綁定,即先調度Pod,再根據Pod的可用性區域資訊建立雲端硬碟。

      WaitForFirstConsumer

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

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

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

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

    參數

    說明

    樣本

    儲存宣告類型

    選擇雲端硬碟

    雲端硬碟

    名稱

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

    disk-pvc

    分配模式

    預設已選擇使用儲存類動態建立

    使用儲存類動態建立

    已有儲存類

    選擇要綁定的StorageClass。

    alicloud-disk-essd

    總量

    分配給Pod的儲存容量,即要建立的雲端硬碟容量大小。

    20Gi

    訪問模式

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

    ReadWriteOnce

    建立完成後,在儲存聲明頁面可以看到新建立的PVC,由於StorageClass中繫結模式為WaitForFirstConsumer,此時PVC還未綁定PV,狀態為Pending。

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

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

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

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

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

    配置頁

    參數

    說明

    樣本

    應用基本資料

    應用程式名稱

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

    disk-test

    副本數量

    配置StatefulSet的副本數量。

    1

    容器配置

    鏡像名稱

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

    registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest

    所需資源

    設定所需的vCPU和記憶體資源。

    0.25 vCPU,0.5 GiB

    資料卷

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

    • 掛載源:選擇之前建立的PVC。

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

    • 掛載源:disk-pvc

    • 容器路徑:/data

  4. 查看應用部署情況。

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

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

  5. 查看儲存卷和儲存聲明。

    • 儲存卷頁面,可以看到已自動建立了一個PV,該PV的名稱對應雲端硬碟ID。

    • 儲存聲明頁面,可以看到PVC已綁定PV,狀態為Bound。

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

按照上文樣本建立的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

    預期返回如下,由於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