随着业务发展和应用数据增长,当云盘使用空间不足时,您可以通过云盘扩容来解决磁盘容量不足的问题。但容器服务Kubernetes 1.16之前的旧版本不支持云盘自动扩容,您需要手动扩容云盘。本文介绍如何通过手动扩容云盘增加云盘空间。
使用说明
- 使用限制
仅支持扩容32 TiB及以下容量的云盘。
- 数据备份
扩容数据卷前,先执行云盘快照备份数据,以防扩容过程异常导致数据丢失。
- 适用范围
PV类型为静态云盘数据卷。
- 方式一:不暂停应用手动在线扩容:文件系统在线扩容时,如果IO流量高,文件系统存在出现IO报错的风险,但应用可以不重启。
- 方式二:暂停应用手动扩容:应用停止后,磁盘IO会暂停,文件系统扩容数据更安全,但应用会暂停一段时间。
查看云盘使用信息
本文以Web有状态应用为例,介绍两种扩容方式。参考以下操作,查看云盘的使用信息。
- 执行以下命令,查看Web应用的Pod。
kubectl get pod | grep web
预期输出:
NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 11h web-1 1/1 Running 0 11h
- 执行以下命令,查看Web应用的PVC。
kubectl get pvc | grep web
预期输出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE disk-ssd-web-0 Bound d-0jlhaq*** 20Gi RWO alicloud-disk-essd 11h disk-ssd-web-1 Bound d-0jl0j5*** 20Gi RWO alicloud-disk-essd 11h
- 执行以下命令查看Web应用的PV。
kubectl get pv | grep web
预期输出:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE d-0jl0j5*** 20Gi RWO Delete Bound default/disk-ssd-web-1 alicloud-disk-essd 11h d-0jlhaq*** 20Gi RWO Delete Bound default/disk-ssd-web-0 alicloud-disk-essd 11h
从以上预期输出可得:示例应用Web使用了20 GiB的
d-0jl0j5***
和d-0jlhaq***
云盘,分别挂载在2个Pod上。
关于如何部署Web有状态应用的具体操作,请参见创建有状态工作负载StatefulSet。
方式一:不暂停应用手动在线扩容
根据PV信息找到对应的云盘,手动对云盘扩容,然后在云盘对应挂载节点手动执行文件系统扩容。以下示例介绍如何把2个云盘扩容到30 GiB。
步骤一:云盘数据卷扩容
- 登录ECS管理控制台。
- 在左侧导航栏,选择 。
- 找到Web应用对应的云盘d-0jl0j5***及d-0jlhaq***,查看云盘状态,然后在各自操作列选择 。
- 在磁盘扩容页面,选中在线扩容,并输入扩容后容量,例如30 GiB。说明 设置的扩容后容量不允许小于当前容量。
- 仔细阅读并选中《云服务器ECS服务条款》,确认费用后单击确认扩容。具体操作,请参见扩大云盘容量。
- 阅读磁盘扩容须知后,单击已阅读,继续扩容,完成费用支付。在云盘页面查看云盘容量是否扩容成功。
步骤二:文件系统扩容
扩容云盘后,需要完成对文件系统的扩容,否则容器内存储空间依然是扩容前的大小。
- 若PV使用未分区云盘,则不能手动执行分区操作,否则将会对当前文件系统产生破坏,造成数据丢失。
- 若PV使用分区云盘,则需要扩容分区设备后扩容文件系统。具体操作,请参见扩容分区和文件系统(Linux)或扩容分区和文件系统(Windows)。
- 查看当前云盘挂载节点。
- 连接到挂载云盘的ECS实例节点上,获取云盘设备符。关于如何连接到ECS实例节点,请参见连接方式概述。
可通过以下方法获取云盘设备符。
- 获取云盘设备符。
- 执行以下命令获取云盘d-0jlhaq***的设备符。
# 查询 {pv-name} mount |grep d-0jlhaq***
预期输出:
/dev/vdc on /var/lib/kubelet/plugins/kubernetes.io/csi/pv/d-0jlhaq***/globalmount type ext4 (rw,relatime) /dev/vdc on /var/lib/kubelet/pods/a26d174f-***/volumes/kubernetes.io~csi/d-0jlhaq***/mount type ext4 (rw,relatime)
从以上预期输出可得:所挂载的云盘
d-0jlhaq***
在当前节点的设备符为/dev/vdc。
- 执行以下命令,扩容文件系统。
resize2fs /dev/vdc
预期输出:
resize2fs 1.43.5 (04-Aug-2017) Filesystem at /dev/vdc is mounted on /var/lib/kubelet/plugins/kubernetes.io/csi/pv/d-0jlhaq***/globalmount; on-line resizing required old_desc_blocks = 3, new_desc_blocks = 4 The filesystem on /dev/vdc is now 7864320 (4k) blocks long.
- 执行以下命令,验证文件系统扩容结果。
lsblk /dev/vdc
预期输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vdc 254:32 0 30G 0 disk /var/lib/kubelet/pods/a26d174f-***/volumes/kubernetes.io~csi/d-0jlhaq***/mount
从以上预期输出可得,vdc文件系统存储空间为30 GiB。
方式二:暂停应用手动扩容
通过删除StatefulSet或者将Replica配置为0的方式暂停应用,手动对每个依赖数据盘扩容,然后再启动应用。以下示例如何把2个云盘扩容到30 GiB。
步骤一:删除应用Pod
- 执行以下命令,将Pod缩容为0个副本。
kubectl scale sts web --replicas=0
预期输出:
statefulset.apps/web scaled
- 执行以下命令,查看Pod是否删除。
kubectl get pod | grep web
无输出,代表已删除Web应用。
步骤二:云盘数据卷扩容
- 登录ECS管理控制台。
- 在左侧导航栏,选择 。
- 找到Web应用对应的云盘d-0jl0j5***及d-0jlhaq***,查看云盘状态,然后在各自操作列选择 。
- 在磁盘扩容页面配置扩容方式及扩容后容量。
- 若云盘处于待挂载状态,在磁盘扩容页面无需选中在线扩容,输入扩容后容量,例如30 GiB。
- 若云盘处于使用中状态,在磁盘扩容页面选中在线扩容,并输入扩容后容量。
说明 设置的扩容后容量不允许小于当前容量。 - 仔细阅读并选中《云服务器ECS服务条款》,确认费用后单击确认扩容。具体操作,请参见步骤一:扩容云盘容量。
- 阅读磁盘扩容须知后,单击已阅读,继续扩容,完成费用支付。
步骤三:文件系统扩容
扩容云盘后,需要完成对文件系统的扩容,否则容器内存储空间依然是扩容前的大小。
- 若PV使用未分区云盘,则不能手动执行分区操作,否则将会对当前文件系统产生破坏,造成数据丢失。
- 若PV使用分区云盘,则需要扩容分区设备后扩容文件系统。具体操作,请参见扩容分区和文件系统(Linux)或扩容分区和文件系统(Windows)。
- 可选:将待挂载云盘挂载到某个ECS节点。说明 需要将云盘挂载到ECS节点上才可实现文件系统扩容。如果该云盘的状态变为使用中,表示挂载成功。
- 连接到挂载云盘的ECS实例节点上,获取云盘设备符。关于如何连接到ECS实例节点,请参见连接方式概述。
- 执行以下命令获取云盘设备符。
for device in `ls /sys/block | grep vd`; do cat /sys/block/$device/serial | grep 0jlhaq*** && echo $device; done
说明0jlhaq***
为扩容云盘IDd-0jlhaq***
中d-
后的字符串。 - 可选:若上述操作无法获取到云盘设备符,请按以下操作获取。
- 将目标云盘卸载后执行
ls /dev/vd*
命令查看云盘列表。 - 将目标云盘挂载后执行
ls /dev/vd*
命令查看云盘列表。 - 比较上述获取的云盘列表,多出来的云盘即为目标云盘。
- 将目标云盘卸载后执行
- 执行以下命令获取云盘设备符。
- 执行以下命令,扩容文件系统。
resize2fs /dev/vdb
说明 /dev/vdb为步骤2获取的云盘设备符。预期输出:
resize2fs 1.43.5 (04-Aug-2017) Resizing the filesystem on /dev/vdb to 7864320 (4k) blocks. The filesystem on /dev/vdb is now 7864320 (4k) blocks long.
- 验证文件系统扩容结果。
步骤四:重启应用
- 执行以下命令,将Pod扩容为2个副本。
kubectl scale sts web --replicas=2
预期输出:
statefulset.apps/web scaled
- 执行以下命令,查看Pod是否恢复。
kubectl get pod | grep web
预期输出:
NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 74s web-1 1/1 Running 0 42s
- 执行以下命令,查看文件系统大小。
kubectl exec web-0 -- df /data
预期输出:
Filesystem 1K-blocks Used Available Use% Mounted on /dev/vdb 30832548 45036 30771128 1% /data
从以上预期输出可得,/dev/vdb文件系统存储空间为30 GiB。
在执行resize2fs
命令后出现如下错误提示
resize of device /dev/xxx failed: exit status 1 resize2fs output: resize2fs xxx(version)
Please run `e2fsck -f /dev/xxx` first
问题原因因为不满足文件系统的一致性导致IO崩溃。
解决方案请按照提示执行e2fsck -f /dev/xxx
后再尝试扩容。