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

背景信息

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

相关概念

  • 在线扩容

    指在业务Pod不暂停的情况下,实现云盘及其文件系统的扩容。

  • 离线扩容

    指在业务Pod暂停的情况下,完成云盘数据卷与文件系统扩容后,再启动业务Pod。

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

使用说明

  • 使用限制

    仅支持在线扩容2000 GiB以下容量的云盘。

  • 数据备份

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

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

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

为RAM用户添加ResizeDisk权限

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

专有集群(CSI插件)

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面,选中目标集群,并在目标集群右侧操作列下,单击详情
  4. 在集群管理页左侧导航栏中,单击集群信息
  5. 单击集群资源页签,单击Master RAM角色链接。
  6. 在RAM控制台中,添加ResizeDisk权限。添加权限具体步骤,请参见修改自定义权限策略内容和备注resizedisk

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

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

不重启容器实现在线扩容

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

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

    执行以下命令获取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-wz9hpoifm43yn9zi****   20Gi       RWO            alicloud-disk-available   57s
    执行以下命令获取PV信息。
    kubectl get pv
    预期输出:
    NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                    STORAGECLASS              REASON   AGE
    d-wz9hpoifm43yn9zi****   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-wz9hpoifm43yn9zi****

    预期输出:

    NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS              REASON   AGE
    d-wz9hpoifm43yn9zi****   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-wz9hpoifm43yn9zi****   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

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

ESSD云盘在线扩容自动完成数据备份

ESSD云盘在线扩容自动完成数据备份功能的实现流程如下图所示。

essd
流程序号 说明
表示创建ESSD云盘在线扩容请求。
表示对扩容前的云盘自动创建极速快照。
表示云盘扩容。
表示云盘内文件系统扩容。
表示扩容成功,删除自动创建的极速快照。
说明
  • 当流程③和④扩容失败时,自动创建的极速快照将被保留,用于数据恢复。
  • 使用极速快照功能时,会产生一定费用。具体计费规则,请参见快照计费

使用ESSD云盘在线扩容自动完成数据备份功能的操作步骤如下:

  1. 在创建StorageClass时,设置参数volumeExpandAutoSnapshot为forced,开启自动数据备份功能。
  2. 执行以下命令获取StroageClass信息。
    kubectl describe sc <your-storageClass-name> | grep volumeExpandAutoSnapshot

    预期在Annotations中输出:

    "volumeExpandAutoSnapshot":"forced"

    预期在Parameters中输出:

    volumeExpandAutoSnapshot=forced
  3. 执行以下命令获取PVC信息。
    kubectl get pvc

    预期输出:

    NAME              STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    <your-PVC-name>   Bound    d-2ze39o7sv976dz1y****   20Gi       RWO            <your-storageClass-name>   13h
  4. 在符合快照使用说明云盘扩容说明除数据备份外的条件,且云盘类型为ESSD时,进行备份及扩容操作。
    1. 执行以下命令进行备份及扩容。
      kubectl patch pvc <your-PVC-name> -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
      等待一段时间扩容完成,检查状态如下。
    2. 执行以下命令查看PVC信息。
      kubectl describe pvc <your-PVC-name>

      预期在Events中输出:

        Normal   SnapshotCreatedSuccessfully  91s                csi-controller-server                                                                                  ControllerExpandVolume:: Snapshot create successful: snapshotName[volume-expand-auto-snapshot-d-2ze39o7sv976dz1y****-2022-08-17-21:30:48], sourceId[d-2ze39o7sv976dz1y****], snapshotId[s-2ze85t4rk5d695ha****]
    云盘通过自动快照实现数据备份。
    • 若扩容成功,快照将自动删除。
    • 若扩容失败,可通过快照手动恢复数据,快照默认保留时间24小时。