隨著業務發展和應用資料增長,當雲端硬碟使用空間不足時,您可以通過定義一種或多種擴容策略,在儲存卷的使用率高於某個閾值時自動擴容卷。本文介紹如何?雲端硬碟儲存卷的自動擴容。
前提條件
已在叢集中安裝storage-operator組件,且組件版本不低於v1.18.8.28-18cca7b-aliyun。更多資訊,請參見storage-operator。
注意事項
支援在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\"}"}}'
步驟二:配置雲端硬碟自動擴容策略
在StorageClass儲存類中配置雲端硬碟自動擴容策略。
推薦您使用ACK叢集中預設建立的alicloud-disk-topology-alltype類型的StorageClass,該StorageClass能自適應為您選擇雲端硬碟類型,避免因執行個體規格限制、或所在可用性區域雲端硬碟餘額不足導致雲端硬碟無法建立,增強可用性。
若您的叢集版本較低不支援該類型的StorageClass,您可以通過以下方式手動建立。
使用以下內容,建立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
執行以下命令,建立StorageClass。
kubectl create -f storageclass.yaml
通過CRD(Custom Resource Definitions)建立自動擴容策略。
使用以下內容,建立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。本樣本為default及mysql。
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。
執行以下命令,建立自動擴容策略。
kubectl create -f StorageAutoScalerPolicy.yaml
建立工作負載StatefulSet。
使用以下內容,建立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****
執行以下命令,建立工作負載。
kubectl create -f StatefulSet.yaml
步驟三:驗證雲端硬碟的自動擴容
向掛載目錄寫入資料,使雲端硬碟容量使用率高於80%。
執行以下命令,向掛載目錄寫入資料。
dd if=<資料路徑> of=<掛載路徑>
執行以下命令,查看雲端硬碟容量詳情。
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
執行以下命令,查看擴容事件。
當雲端硬碟容量使用率高於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.
執行以下命令,查看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。根據步驟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.
由於action1的limit為100 GiB,從預期輸出可得,此次只能將雲端硬碟從75 GiB擴容到100 GiB。
根據步驟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.
由於action1的limit為100 GiB,不滿足擴容條件。從預期輸出可得,使用action2策略將雲端硬碟從100 GiB擴容到150 GiB。
根據步驟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。
根據步驟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"
由於action2的limit為300 GiB,從預期輸出可得,此次只能將雲端硬碟從225 GiB擴容到300 GiB。
當雲端硬碟容量再次高於80%時,不再觸發擴容。
相關文檔
如在使用雲端硬碟儲存卷的過程中遇到相關問題,請參見雲端硬碟儲存卷FAQ。