全部產品
Search
文件中心

Container Service for Kubernetes:自動擴容雲端硬碟儲存卷

更新時間:Aug 09, 2024

隨著業務發展和應用資料增長,當雲端硬碟使用空間不足時,您可以通過定義一種或多種擴容策略,在儲存卷的使用率高於某個閾值時自動擴容卷。本文介紹如何?雲端硬碟儲存卷的自動擴容。

前提條件

注意事項

  • 支援在Kubernetes 1.16及以上版本的叢集中使用,僅支援雲端硬碟擴容,不支援縮容。

  • 只有處於掛載狀態的雲端硬碟才支援擴容。

  • 依賴雲端硬碟的Resize能力。更多資訊,請參見ResizeDisk

  • 觸發擴容的最大時間間隔為2 min,雲端硬碟擴容時間為1 min,請勿在3 min內將雲端硬碟寫滿。

  • 雲端硬碟最大容量為2000 GiB。

步驟一:開啟自動擴容

storage-operator組件中預設的storage-auto-expander負責自動擴容儲存資源。您需要執行以下命令,修改storage-operator的ConfigMap檔案,以開啟自動擴容功能。

kubectl patch configmap/storage-operator \
  -n kube-system \
  --type merge \
  -p '{"data":{"storage-auto-expander":"{\"imageRep\":\"acs/storage-auto-expander\",\"imageTag\":\"\",\"install\":\"true\",\"template\":\"/acs/templates/storage-auto-expander/install.yaml\",\"type\":\"deployment\"}"}}'

步驟二:配置雲端硬碟自動擴容策略

  1. 在StorageClass儲存類中配置雲端硬碟自動擴容策略。

    推薦您使用ACK叢集中預設建立的alicloud-disk-topology-alltype類型的StorageClass,該StorageClass能自適應為您選擇雲端硬碟類型,避免因執行個體規格限制、或所在可用性區域雲端硬碟餘額不足導致雲端硬碟無法建立,增強可用性。

    若您的叢集版本較低不支援該類型的StorageClass,您可以通過以下方式手動建立。

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

      allowVolumeExpansion: true
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: alicloud-disk-topology-alltype
      parameters:
        type: cloud_essd,cloud_ssd,cloud_efficiency
      provisioner: diskplugin.csi.alibabacloud.com
      reclaimPolicy: Delete
      volumeBindingMode: WaitForFirstConsumer
    2. 執行以下命令,建立StorageClass。

      kubectl create -f storageclass.yaml
  2. 通過CRD(Custom Resource Definitions)建立自動擴容策略。

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

      apiVersion: storage.alibabacloud.com/v1alpha1
      kind: StorageAutoScalerPolicy
      metadata:
        name: hybrid-expand-policy
      spec:
        pvcSelector:
          matchLabels:
            app: mysql
        namespaces:
          - default
          - mysql
        conditions:
          - name: condition1
            key: volume-capacity-used-percentage
            operator: Gt
            values:
              - "80"
        actions:
          - name: action1
            type: volume-expand
            params:
              scale: 50Gi
              limits: 100Gi
          - name: action2
            type: volume-expand
            params:
              scale: 50%
              limits: 300Gi

      參數

      說明

      pvcSelector

      目標PVC,通過Label-Selector方式。本樣本為mysql

      namespaces

      目標PVC所在的命名空間,多個命名空間時為或邏輯。若不配置,預設為default。本樣本為defaultmysql

      conditions

      觸發規則的條件,多個condition時為與邏輯。每個condition包含以下參數:

      • key:定義一個Metric的類型。

      • volume-capacity-used-percentage:表示容量使用百分比。

      • operator:定義規則,包含Gt(大於)、Lt(小於)、Eq(等於)或Ne(不等於),不限制英文字母大小寫。

      • values:規則的具體數值。

      本樣本表示當PVC容量的使用率高於80%時會觸發action

      actions

      滿足上述conditions時執行的操作,可以是多個操作。包含以下參數:

      • type:表示行為方式,目前只支援擴容。

      • scale:表示擴容的大小,單位為GiB,或可使用百分比。

      • limits:表示PVC在此action中的最大限制。

      actions中存在多個action時,則從首個action開始匹配,執行首個滿足條件的action,其餘action跳過不執行。例如,本樣本中的action1如果滿足條件,則執行action1,不會執行action2

      • 本樣本的action1表示雲端硬碟容量在100 GiB內以50 GiB為單位擴容,最大擴容到100 GiB。

      • 本樣本的action2表示當雲端硬碟容量大於100 GiB小於300 GiB時,以當前容量的50%擴容,即每次擴容後的總容量為擴容前容量的150%,最大擴容到300 GiB。

    2. 執行以下命令,建立自動擴容策略。

      kubectl create -f StorageAutoScalerPolicy.yaml
  3. 建立工作負載StatefulSet。

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

       apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: mysql
      spec:
        selector:
          matchLabels:
            app: mysql
        serviceName: mysql
        replicas: 3
        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
        volumeClaimTemplates:
          - metadata:
              name: pvc-disk
              labels:
                app: mysql
            spec:
              accessModes: [ "ReadWriteOnce" ]
              storageClassName: "alicloud-disk-topology-alltype"
              resources:
                requests:
                  storage: 25Gi
      ---
      apiVersion: v1
      kind: Secret
      metadata:
        name: mysql-pass
      type: Opaque
      data:
        username: dGVz****             
        password: dGVzdDEt****     
    2. 執行以下命令,建立工作負載。

      kubectl create -f StatefulSet.yaml

步驟三:驗證雲端硬碟的自動擴容

  1. 向掛載目錄寫入資料,使雲端硬碟容量使用率高於80%。

    1. 執行以下命令,向掛載目錄寫入資料。

      dd if=<資料路徑> of=<掛載路徑>
    2. 執行以下命令,查看雲端硬碟容量詳情。

      df -h | grep d-****1

      預期輸出:

      Filesystem    Size   Used   Avail   Use%    Mounted on
      /dev/vde      25G    24G    1.5G    95%     /var/lib/kubelet/plugins/kubernetes.io/csi/pv/d-****1/globalmount
  2. 執行以下命令,查看擴容事件。

    當雲端硬碟容量使用率高於80%時會觸發擴容,此時action1滿足條件,則使用action1作為擴容策略。

    kubectl get events

    預期輸出:

    101s     Warning     StartExpand                persistentvolumeclaim/pvc-disk-mysql-1     Start to expand of pvc pvc-disk-mysql-1 from 25Gi to 75Gi, usedCapacityPercentage:94%, freeSize:1472MB.
    101s     Warning     ExternalExpanding          persistentvolumeclaim/pvc-disk-mysql-1     Ignoring the PVC: did't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
    101s     Normal      Resizing                   persistentvolumeclaim/pvc-disk-mysql-1     External resizer is resizing volume d-****1
    97s      Normal      FileSystemResizeRequired   persistentvolumeclaim/pvc-disk-mysql-1     Require file system resize of volume on node
    96s      Warning     SkipExpand                 persistentvolumeclaim/pvc-disk-mysql-1     Pvc pvc-disk-mysql-1 is expanding status from 25Gi to 75Gi, this action action2 will skip.
  3. 執行以下命令,查看PVC的容量。

    kubectl get pvc

    預期輸出:

    NAME               STATUS     VOLUME     CAPACITY     ACCESS MODES     STORAGECLASS                      AGE
    pvc-disk-mysql-0   Bound      d-****0    25Gi         RWO              alicloud-disk-topology-alltype    22m
    pvc-disk-mysql-1   Bound      d-****1    75Gi         RWO              alicloud-disk-topology-alltype    21m
    pvc-disk-mysql-2   Bound      d-****2    25Gi         RWO              alicloud-disk-topology-alltype    21m

    從預期輸出可得,雲端硬碟d-****1已擴容到75 GiB。

  4. 根據步驟1,再次使雲端硬碟容量使用率高於80%,進行第二次擴容。

    執行以下命令,查看擴容事件。

    kubectl get events

    預期輸出:

    7m22s    Warning     StartExpand                persistentvolumeclaim/pvc-disk-mysql-1     Start to expand of pvc pvc-disk-mysql-1 from 100Gi to 150Gi, usedCapacityPercentage:95%, freeSize:3732MB.
    5m2s     Warning     ExternalExpanding          persistentvolumeclaim/pvc-disk-mysql-1     Ignoring the PVC: did't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
    2m4s     Normal      Resizing                   persistentvolumeclaim/pvc-disk-mysql-1     External resizer is resizing volume d-****1
    3m4s     Normal      FileSystemResizeRequired   persistentvolumeclaim/pvc-disk-mysql-1     Require file system resize of volume on node
    5m59s    Warning     SkipExpand                 persistentvolumeclaim/pvc-disk-mysql-1     Pvc pvc-disk-mysql-1 is expanding status from 100Gi to 150Gi, this action action1 will skip.

    由於action1limit為100 GiB,從預期輸出可得,此次只能將雲端硬碟從75 GiB擴容到100 GiB。

  5. 根據步驟1,再次使雲端硬碟容量使用率高於80%,進行第三次擴容。

    執行以下命令,查看擴容事件。

    kubectl get events

    預期輸出:

    7m22s    Warning     StartExpand                persistentvolumeclaim/pvc-disk-mysql-1     Start to expand of pvc pvc-disk-mysql-1 from 100Gi to 150Gi, usedCapacityPercentage:95%, freeSize:3732MB.
    5m2s     Warning     ExternalExpanding          persistentvolumeclaim/pvc-disk-mysql-1     Ignoring the PVC: did't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
    2m4s     Normal      Resizing                   persistentvolumeclaim/pvc-disk-mysql-1     External resizer is resizing volume d-****1
    3m4s     Normal      FileSystemResizeRequired   persistentvolumeclaim/pvc-disk-mysql-1     Require file system resize of volume on node
    5m59s    Warning     SkipExpand                 persistentvolumeclaim/pvc-disk-mysql-1     Pvc pvc-disk-mysql-1 is expanding status from 100Gi to 150Gi, this action action1 will skip.

    由於action1limit為100 GiB,不滿足擴容條件。從預期輸出可得,使用action2策略將雲端硬碟從100 GiB擴容到150 GiB。

  6. 根據步驟1,再次使雲端硬碟容量使用率高於80%,進行第四次擴容。

    執行以下命令,查看擴容事件。

    kubectl get events

    預期輸出:

    0s     Warning     StartExpand                persistentvolumeclaim/pvc-disk-mysql-1     Start to expand of pvc pvc-disk-mysql-1 from 150Gi to 225Gi, usedCapacityPercentage:94%, freeSize:7637MB.
    0s     Warning     ExternalExpanding          persistentvolumeclaim/pvc-disk-mysql-1     Ignoring the PVC: did't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
    0s     Normal      Resizing                   persistentvolumeclaim/pvc-disk-mysql-1     External resizer is resizing volume d-****1
    0s     Normal      FileSystemResizeRequired   persistentvolumeclaim/pvc-disk-mysql-1     Require file system resize of volume on node
    0s     Warning     SkipExpand                 persistentvolumeclaim/pvc-disk-mysql-1     Pvc pvc-disk-mysql-1 is expanding status from 150Gi to 225Gi, this action action1 will skip.

    從預期輸出可得,使用action2策略將雲端硬碟從150 GiB擴容到225 GiB。

  7. 根據步驟1,再次使雲端硬碟容量使用率高於80%,進行第五次擴容。

    執行以下命令,查看擴容事件。

    kubectl get events

    預期輸出:

    0s     Warning     StartExpand                 persistentvolumeclaim/pvc-disk-mysql-1     Start to expand of pvc pvc-disk-mysql-1 from 225Gi to 300Gi, usedCapacityPercentage:94%, freeSize:7637MB.
    0s     Warning     ExternalExpanding           persistentvolumeclaim/pvc-disk-mysql-1     Ignoring the PVC: did't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
    0s     Normal      Resizing                    persistentvolumeclaim/pvc-disk-mysql-1     External resizer is resizing volume d-****1
    0s     Normal      FileSystemResizeRequired    persistentvolumeclaim/pvc-disk-mysql-1     Require file system resize of volume on node
    0s     Warning     FileSystemResizeSuccessful  persistentvolumeclaim/pvc-disk-mysql-1     MountVolume.NodeExpandVolume succeeded for volume "d-****1"

    由於action2limit為300 GiB,從預期輸出可得,此次只能將雲端硬碟從225 GiB擴容到300 GiB。

    當雲端硬碟容量再次高於80%時,不再觸發擴容。

相關文檔

如在使用雲端硬碟儲存卷的過程中遇到相關問題,請參見雲端硬碟儲存卷FAQ