在ACK中实现Flexvolume云盘在线扩容

在Kubernetes 1.16版中,云盘数据卷在线扩容已经进入Beta阶段,ACK支持在Kubernetes 1.16及以上版本中实现Flexvolume云盘在线扩容。本文介绍在Flexvolume环境中如何进行云盘的动态扩容,从而增加云盘空间。

使用说明

  • 使用限制

    为保证数据扩容安全,在未启用在线扩容自动完成数据备份功能时,仅支持在线扩容2000 GiB及以下容量的云盘;启用该功能后,可支持扩容32 TiB及以下容量的云盘。

  • 数据备份

    扩容数据卷前,请先备份云盘快照,以防扩容过程异常导致数据出现问题。

  • 适用范围

    • 只有动态存储卷才可以进行数据卷动态扩容,即配置了StorageClassName的PVC。

    • 不支持扩容InlineVolume类型(非PV、PVC方式)的云盘数据卷。

    • 不支持动态扩容普通云盘类型。

    • StorageClass需要配置为AllowVolumeExpansion: True。ACK集群默认提供的StorageClass为True,自建的StorageClass需要自行配置。

    • 应用Pod需处于Running状态。

  • 插件版本

    升级您使用的CSI插件到最新版本。

为RAM用户添加ResizeDisk权限

实现云盘在线扩容前,您需要为集群的RAM角色添加ResizeDisk权限。针对不同集群和插件类型,添加ResizeDisk权限的步骤如下:

专有版集群(CSI插件)

  1. 登录容器服务管理控制台

  2. 在控制台左侧导航栏中,单击集群

  3. 集群列表页面,选中目标集群,并在目标集群右侧操作列下,单击详情

  4. 在集群管理页左侧导航栏中,单击集群信息

  5. 单击集群资源页签,单击Master RAM角色链接。

  6. 在RAM控制台中,添加ResizeDisk权限。添加权限具体步骤,请参见改自定义权限策略内容和备注resizedisk

专有版集群(Flexvolume插件)、托管版集群(所有插件类型)

重复上述前4个步骤,然后在集群管理页面单击Worker RAM 角色链接。

不重启容器实现在线扩容

  1. 获取集群KubeConfig并通过kubectl工具连接集群

    本文假设应用的当前状态如下。

    执行以下命令获取Pod信息。

    kubectl get pod

    预期输出:

    web-0         1/1     Running   0          42s

    执行以下命令查看Pod的挂载详情。

    kubectl exec web-0 -- df /data

    预期输出:

    Filesystem     1K-blocks  Used Available Use% Mounted on
    /dev/vdb        20511312 45080  20449848   1% /data

    执行以下命令获取PVC信息。

    kubectl get pvc

    预期输出:

    NAME             STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS              AGE
    disk-ssd-web-0   Bound    d-wz9hpoifm43yn9zie6gl   20Gi       RWO            alicloud-disk-available   57s

    执行以下命令获取PV信息。

    kubectl get pv

    预期输出:

    NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                    STORAGECLASS              REASON   AGE
    d-wz9hpoifm43yn9zie6gl   20Gi       RWO            Delete           Bound      default/disk-ssd-web-0   alicloud-disk-available            65s
  2. 在符合使用说明的各个条件下,执行以下命令进行数据卷扩容。

    kubectl patch pvc disk-ssd-web-0 -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'

    等待一定时间(一分钟以内)后扩容完成,检查状态如下。

    执行以下命令获取PV信息。

    kubectl get pv d-wz9hpoifm43yn9zie6gl

    预期输出:

    NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS              REASON   AGE
    d-wz9hpoifm43yn9zie6gl   30Gi       RWO            Delete           Bound    default/disk-ssd-web-0   alicloud-disk-available            5m23s

    执行以下命令获取PVC信息。

    kubectl get pvc

    预期输出:

    NAME             STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS              AGE
    disk-ssd-web-0   Bound    d-wz9hpoifm43yn9zie6gl   30Gi       RWO            alicloud-disk-available   5m10s

    执行以下命令查看Pod的挂载详情。

    kubectl exec web-0 -- df /data

    预期输出:

    Filesystem     1K-blocks  Used Available Use% Mounted on
    /dev/vdb        30832548 45036  30771128   1% /data

    您只需要执行一条命令即可完成所有的扩容操作。

重启容器实现在线扩容

  1. 使用命令行工具连接Kubernetes集群,请参见步骤二:选择集群凭证类型

    本文假设应用的当前状态如下。

    执行以下命令获取Pod信息。

    kubectl get pod

    预期输出:

    <your-pod-name>         1/1     Running   0          42s

    执行以下命令查看Pod的挂载详情。

    kubectl exec <your-pod-name>  -- df /data

    预期输出:

    Filesystem     1K-blocks  Used   Available Use% Mounted on
    /dev/vdb       20511312   45080  20449848  1%   /data

    执行以下命令获取PVC信息。

    kubectl get pvc

    预期输出:

    NAME              STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS                     AGE
    <your-PVC-name>   Bound    d-wz9hpoifm43yn9zi****   20Gi       RWO            alicloud-disk-topology-alltype   57s

    执行以下命令获取PV信息。

    kubectl get pv

    预期输出:

    NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                     STORAGECLASS                     REASON   AGE
    d-wz9hpoifm43yn9zi****   20Gi       RWO            Delete           Bound      default/<your-PVC-name>   alicloud-disk-topology-alltype            65s
  2. 执行以下命令查看PV的调度信息。

    kubectl get pv d-wz9g2j5qbo37r2lamkg4  -oyaml | grep failure-domain.beta.kubernetes.io/zone
        failure-domain.beta.kubernetes.io/zone: cn-shenzhen-e
  3. 修改调度信息label,在zone后面添加字段,促使这个PV关联的Pod不可调度。

    例如,把以下示例中原来的cn-shenzhen-e改为cn-shenzhen-e-nozone。

    kubectl label pv d-wz9g2j5qbo37r2lamkg4 failure-domain.beta.kubernetes.io/zone=cn-shenzhen-e-nozone --overwrite
    persistentvolume/d-wz9g2j5qbo37r2lamkg4 labeled
  4. 重启Pod。

    由于修改了调度信息,Pod会暂时处于Pending状态。

    执行以下命令删除Pod。

    kubectl delete pod web-0

    执行以下命令获取Pod信息。

    kubectl get pod

    预期输出:

    web-0   0/1     Pending   0          27s
  5. 执行以下命令扩容数据卷。

    kubectl patch pvc disk-ssd-web-0 -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
  6. 将PV的调度信息label改回去,促使Pod启动完成(把cn-shenzhen-e-nozone改为起初的cn-shenzhen-e)。

    kubectl label pv d-wz9g2j5qbo37r2lamkg4 failure-domain.beta.kubernetes.io/zone=cn-shenzhen-e --overwrite
    persistentvolume/d-wz9g2j5qbo37r2lamkg4 labeled

    等待一定时间(一分钟内)后检查扩容是否符合预期。

    执行以下命令获取Pod信息。

    kubectl get pod

    预期输出:

    web-0   1/1     Running   0          3m23s

    执行以下命令获取PVC信息。

    kubectl get pvc

    预期输出:

    disk-ssd-web-0   Bound    d-wz9g2j5qbo37r2lamkg4   30Gi       RWO            alicloud-disk-available   17m

    执行以下命令获取PV信息。

    kubectl get pv d-wz9g2j5qbo37r2lamkg4

    预期输出:

    d-wz9g2j5qbo37r2lamkg4   30Gi       RWO            Delete           Bound    default/disk-ssd-web-0   alicloud-disk-available            17m

    执行以下命令查看Pod的挂载详情。

    kubectl exec web-0 -- df /data

    预期输出:

    /dev/vdb        30832548 45036  30771128   1% /data

    从返回结果中可以看出云盘由20 GiB成功被扩容至30 GiB。