随着业务发展和应用数据增长,当云盘使用空间不足时,您可以通过定义一种或多种扩容策略,在存储卷的使用率高于某个阈值时自动扩容卷。本文介绍如何实现云盘存储卷的自动扩容。
前提条件
已在集群中安装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。