You need to enable JavaScript to run this app.
导航
动态扩容云盘数据卷
最近更新时间:2023.10.09 15:37:47首次发布时间:2023.04.03 14:09:10

容器服务支持在线扩容 PV 以及对应的云盘文件系统,当待扩容的云盘文件系统未被挂载时,支持重启 Pod 的情况下在线扩容;当待扩容的云盘文件系统已经挂载到节点时,支持不重启 Pod 的情况下在线扩容。本文针对云盘动态存储卷场景,为您介绍扩容云盘的详细操作。

前提条件

  • 已创建 v1.20.15-vke.11 及以上版本的容器服务集群,且将 csi-ebs 组件升级为最新版本。
  • 已经使用云盘动态存储卷,其中 StorageClass 中设置 allowVolumeExpansion:true。详细介绍参见:使用云盘动态存储卷
  • 为了避免扩容失败导致数据丢失,建议在扩容前备份数据,详细介绍参见:使用云盘快照

操作步骤

方式一(推荐):重启 Pod 实现离线扩容

待扩容的云盘文件系统未被挂载,能够避免扩容出错和文件系统扩容错误的问题,为了确保文件系统的稳定性,推荐使用该方式进行扩容

  1. 执行 kubectl exec [pod_name] df [数据卷挂载路径] 命令,查看扩容前文件系统状态;执行 kubectl get pv [pv_name] 命令,查看 PV 状态。示例如下(PV 和文件系统大小均为 20 GiB):
$ kubectl exec deployment-nginx-mlt-7db45f9b6-5jckg df /usr/share/nginx/html
Filesystem     1K-blocks   Used     Available  Use%   Mounted on
/dev/vdc       20511312    45080    20449848   1%     /usr/share/nginx/html

$ kubectl get pv pvc-6c98cd01-dd32-4636-ac11-794ce9fff540 
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS     REASON   AGE
pvc-6c98cd01-dd32-4636-ac11-794ce9fff540   20Gi       RWO            Delete           Bound    default/pvc-for-sc-mlt   sc-ebs-ssd-mlt            3m55s

  1. 执行kubectl label pv [pv_name] topology.kubernetes.io/zone=nozone命令,为 PV 打一个非法 zone 标签,目的在于 Pod 重启后将无法调度到某个节点上。示例如下:
$ kubectl label pv pvc-6c98cd01-dd32-4636-ac11-794ce9fff540 topology.kubernetes.io/zone=nozone
persistentvolume/pvc-6c98cd01-dd32-4636-ac11-794ce9fff540 labeled

  1. 执行kubectl delete pod [pod_name]命令,删除当前 Pod 并重启一个新的 Pod,由于 Pod 对应的 PV 标签是非法 zone,重启后的 Pod 将处于 Pending 状态。示例如下:
$ kubectl delete pod deployment-nginx-mlt-7db45f9b6-5jckg
pod "deployment-nginx-mlt-7db45f9b6-5jckg" deleted

$ kubectl get pod deployment-nginx-mlt-7db45f9b6-frqvb           # 查询 Pod 状态
NAME                                   READY   STATUS    RESTARTS   AGE
deployment-nginx-mlt-7db45f9b6-frqvb   0/1     Pending   0          28s

$ kubectl describe pod deployment-nginx-mlt-7db45f9b6-frqvb      # 查询 Pod 详细信息
Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  52s                default-scheduler  0/6 nodes are available: 2 node(s) had no available volume zone, 4 node(s) had volume node affinity conflict.
  Warning  FailedScheduling  50s (x1 over 52s)  default-scheduler  0/6 nodes are available: 2 node(s) had no available volume zone, 4 node(s) had volume node affinity conflict.

说明

执行kubectl delete命令删除 Pod 后,将重启一个新的 Pod,此时 Pod 名称将发生变化。

  1. 执行kubectl patch pvc [pvc_name] -p '{"spec":{"resources":{"requests":{"storage":"[扩容后的容量]"}}}}'命令,修改 PVC 中的容量,将容量扩容至 30 GiB。示例如下:

说明

推荐扩容后的 PVC 容量大小为 10 的倍数。

$ kubectl patch pvc pvc-for-sc-mlt  -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
persistentvolumeclaim/pvc-for-sc-mlt patched

  1. 执行kubectl label pv [pv_name] topology.kubernetes.io/zone-命令,去除 PV 先前打的标签,标签去除后 Pod 即可调度成功。示例如下:
$ kubectl label pv pvc-6c98cd01-dd32-4636-ac11-794ce9fff540 topology.kubernetes.io/zone-
persistentvolume/pvc-6c98cd01-dd32-4636-ac11-794ce9fff540 unlabeled

  1. 执行以下命令,验证扩容结果。从返回结果可以看,Pod 状态为 Running、对应 PV 和文件系统已经从 20 GiB 扩容到 30 GiB。示例如下:
$ kubectl get pod deployment-nginx-mlt-7db45f9b6-frqvb      # 查看 Pod 状态
NAME                                   READY   STATUS    RESTARTS   AGE
deployment-nginx-mlt-7db45f9b6-frqvb   1/1     Running   0          3m39s

$ kubectl get pv pvc-6c98cd01-dd32-4636-ac11-794ce9fff540   # 查看 pv 存储容量
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS     REASON   AGE
pvc-6c98cd01-dd32-4636-ac11-794ce9fff540   30Gi       RWO            Delete           Bound    default/pvc-for-sc-mlt   sc-ebs-ssd-mlt            9m46s

$ kubectl get pvc pvc-for-sc-mlt                           # 查看 pvc 存储容量
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
pvc-for-sc-mlt   Bound    pvc-6c98cd01-dd32-4636-ac11-794ce9fff540   30Gi       RWO            sc-ebs-ssd-mlt   10m

$ kubectl exec deployment-nginx-mlt-7db45f9b6-frqvb df /usr/share/nginx/html   # 查看文件系统状态
Filesystem      1K-blocks  Used   Available   Use%   Mounted on
/dev/vdc        30832548   45036  30771128    1%     /usr/share/nginx/html


方式二:不重启 Pod 实现在线扩容

在节点上挂载着待扩容的云硬盘文件系统,如果扩容期间存在 I/O 进程,可能会出现文件系统扩容错误的情况,请注意规避。

  1. 执行 kubectl exec [pod_name] df [数据卷挂载路径] 命令,查看扩容前文件系统状态;执行 kubectl get pv [pv_name] 命令,查看 PV 状态。示例如下(PV 和文件系统大小均为 20 GiB):
$ kubectl exec deployment-nginx-mlt-7db45f9b6-5jckg df /usr/share/nginx/html
Filesystem     1K-blocks   Used     Available  Use%   Mounted on
/dev/vdc       20511312    45080    20449848   1%     /usr/share/nginx/html

$ kubectl get pv pvc-6c98cd01-dd32-4636-ac11-794ce9fff540 
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS     REASON   AGE
pvc-6c98cd01-dd32-4636-ac11-794ce9fff540   20Gi       RWO            Delete           Bound    default/pvc-for-sc-mlt   sc-ebs-ssd-mlt            3m55s

  1. 执行kubectl patch pvc [pvc_name] -p '{"spec":{"resources":{"requests":{"storage":"[扩容后的容量]"}}}}'命令,修改 PVC 中的容量,将容量扩容至 30 GiB。示例如下:

说明

推荐扩容后的 PVC 容量大小为 10 的倍数。

$ kubectl patch pvc pvc-for-sc-mlt  -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
persistentvolumeclaim/pvc-for-sc-mlt patched

  1. 重复步骤一中的命令,验证扩容结果。从返回结果可以看到,PV 和文件系统已经从 20 GiB 扩容至 30 GiB。示例如下:
$ kubectl exec deployment-nginx-mlt-7db45f9b6-5jckg df /usr/share/nginx/html
Filesystem      1K-blocks  Used   Available   Use%   Mounted on
/dev/vdc        30832548   45036  30771128    1%     /usr/share/nginx/html

$ kubectl get pv pvc-6c98cd01-dd32-4636-ac11-794ce9fff540
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS     REASON   AGE
pvc-6c98cd01-dd32-4636-ac11-794ce9fff540   30Gi       RWO            Delete           Bound    default/pvc-for-sc-mlt   sc-ebs-ssd-mlt            9m46s