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

前提条件

实现云盘在线扩容前,您需要为集群的RAM角色添加ResizeDisk权限。针对不同集群和插件类型,添加权限步骤如下:
  • 专有集群(CSI插件):
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,选择集群 > 集群
    3. 集群列表页面,选中目标集群,并在目标集群右侧操作列下,单击管理
    4. 基本信息页签的集群资源区域,单击Master RAM 角色链接。
    5. 在RAM控制台中,添加ResizeDisk权限。添加权限具体步骤,请参见修改自定义策略内容resizedisk
  • 专有集群(Flexvolume插件)、托管集群:

    参照上述步骤,并将上述步骤d中的单击Master RAM 角色链接改成单击Worker RAM 角色链接。

背景信息

云盘数据卷扩容包括云盘扩容文件系统扩容两部分,云盘和文件系统都支持应用在线扩容(设备mount到目录状态下扩容),但是从文件系统扩容最佳实践角度,最稳定的扩容方案是先停止应用层服务、解除挂载目录,再进行数据卷扩容。

基于稳定性需求,提供以下两种扩容的方式:
  • Pod不重启实现数据卷扩容:在负载高IO情况下,有小概率造成文件系统问题。
  • Pod重启时实现数据卷扩容:应用停止后,扩容更安全。

从Kubernetes 1.16开始默认实现了Pod不重启即可以实现数据卷扩容。

使用说明

  • 数据备份

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

  • 适用范围
    • 只有动态存储卷才可以进行数据卷动态扩容,即配置了StorageClassName的PV。
    • 不支持扩容InlineVolume类型(非PV、PVC方式)的云盘数据卷。
    • 不支持动态扩容普通云盘类型。
    • StorageClass需要配置为AllowVolumeExpansion: True。ACK集群默认为True
  • 插件版本

    升级您使用Flexvolume或者CSI插件到最新版本。

不重启容器实现在线扩容

  1. 使用命令行工具连接Kubernetes集群,请参见通过kubectl连接Kubernetes集群
    本文假设应用的当前状态如下。
    # kubectl get pod
    web-0         1/1     Running   0          42s
    
    # kubectl exec web-0 df /data
    Filesystem     1K-blocks  Used Available Use% Mounted on
    /dev/vdb        20511312 45080  20449848   1% /data
    
    # kubectl get pvc
    NAME             STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS              AGE
    disk-ssd-web-0   Bound    d-wz9hpoifm43yn9zie6gl   20Gi       RWO            alicloud-disk-available   57s
    
    # 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"}}}}'
    等待一定时间(一分钟以内)后扩容完成,检查状态如下。
    # 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
    
    # kubectl get pvc
    NAME             STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS              AGE
    disk-ssd-web-0   Bound    d-wz9hpoifm43yn9zie6gl   30Gi       RWO            alicloud-disk-available   5m10s
    
    # kubectl exec web-0 df /data
    Filesystem     1K-blocks  Used Available Use% Mounted on
    /dev/vdb        30832548 45036  30771128   1% /data

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

重启容器实现在线扩容

  1. 通过命令行工具连接Kubernetes集群,请参见通过kubectl连接Kubernetes集群
    本文假设应用的当前状态如下。
    # kubectl get pod
    web-0         1/1     Running   0          42s
    
    # kubectl exec web-0 df /data
    /dev/vdb        20511312 45080  20449848   1% /data
    
    # kubectl get pvc
    disk-ssd-web-0   Bound    d-wz9g2j5qbo37r2lamkg4   20Gi       RWO            alicloud-disk-available   7m4s
    
    # kubectl get pv d-wz9g2j5qbo37r2lamkg4
    d-wz9g2j5qbo37r2lamkg4   20Gi       RWO            Delete           Bound    default/disk-ssd-web-0   alicloud-disk-available            7m18s
  2. 执行以下命令向PV中添加调度labels,其value值为一个不存在对应zone的随意字符串。
    # kubectl label pv d-wz9g2j5qbo37r2lamkg4 failure-domain.beta.kubernetes.io/zone=cn-nozone
    persistentvolume/d-wz9g2j5qbo37r2lamkg4 labeled
  3. 重启Pod。

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

    # kubectl delete pod web-0
    # kubectl get pod
    web-0   0/1     Pending   0          27s
  4. 执行以下命令扩容数据卷。
    # kubectl patch pvc disk-ssd-web-0 -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
  5. 删除PV的调度信息labe,促使Pod完成启动。
    # kubectl label pv d-wz9g2j5qbo37r2lamkg4 failure-domain.beta.kubernetes.io/zone-
    persistentvolume/d-wz9g2j5qbo37r2lamkg4 labeled
    等待一定时间(一分钟内)后检查扩容是否符合预期。
    # kubectl get pod
    web-0   1/1     Running   0          3m23s
    
    # kubectl get pvc
    disk-ssd-web-0   Bound    d-wz9g2j5qbo37r2lamkg4   30Gi       RWO            alicloud-disk-available   17m
    
    # kubectl get pv d-wz9g2j5qbo37r2lamkg4
    d-wz9g2j5qbo37r2lamkg4   30Gi       RWO            Delete           Bound    default/disk-ssd-web-0   alicloud-disk-available            17m
    
    # kubectl exec web-0 df /data
    /dev/vdb        30832548 45036  30771128   1% /data

    可以看出云盘由20Gi成功被扩容至30Gi。