云盘扩容方案文章列表:
基于Flexvolume插件的云盘动态存储卷扩容方案(本文);
基于CSI插件的云盘动态存储卷扩容方案:参考;
不适合动态扩容的场景,可以使用手动扩容云盘存储卷方案:参考;
数据卷扩容说明:
符合以下要求的集群环境可以进行动态扩容操作:
Kubernetes从1.13版本开始支持Flexvolume插件实现数据卷扩容;实现;阿里云ACK不支持1.13版本,所以需要您的Kubernetes集群版本大于等于1.14;
Flexvolume要求版本不低于v1.14.6.15-8d3b7e7-aliyun;
普通云盘类型不支持动态扩容,请参考使用手动扩容云盘方案;
不支持InlineVolume类型(非PV、PVC方式)云盘数据卷扩容;
切记:做数据卷扩容前,先对云盘打快照备份,以防扩容过程异常导致数据出现问题;
数据卷扩容配置需求:
对集群的要求:
对云盘扩容操作需要调用云盘扩容相应API,所以需要集群具有此API的调用权限,可以参考集群权限文档为集群添加此权限;可参考附录。
对PV的要求:
只有动态存储卷才可以进行数据卷动态扩容,即配置了StorageClassName的PV;
对StorageClass的要求:
PVC配置的StorageClass为阿里云云盘类型,provisioner为alicloud/disk;
StorageClass需要配置:AllowVolumeExpansion: True,具体含义参考,如果当前pv使用的storageClass没有配置AllowVolumeExpansion为True,可以安装下面步骤更新;
数据卷扩容步骤:
云盘动态数据卷在满足上述要求的情况下,可以实现动态扩容:
步骤1:扩容存储卷,此步骤会调整PV的Size大小;
操作:# kubectl patch pvc pvc-disk -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
步骤2:扩容文件系统,此步骤会调整云盘、PVC、文件系统大小;
操作:重启Pod;
场景示例:
下面给出三个常见的扩容场景,并给出相应扩容步骤:
场景一:可扩容的动态卷,创建动态数据卷时StorageClass配置了AllowVolumeExpansion(true);
场景二:不可扩容的动态卷,创建动态数据卷时StorageClass没有配置AllowVolumeExpansion(true);
场景三:静态数据卷,使用已有云盘手动创建数据卷,并挂载使用;
场景一针对的是:在创建动态数据卷的时候就配置StorageClass的AllowVolumeExpansion为true,后续可以直接进行数据卷扩容。云盘数据卷的“使用方式”推荐使用这个方式;
场景二针对的是:之前版本不支持动态卷扩容时创建的动态数据卷,当时没有配置AllowVolumeExpansion为true。这个场景可以通过更新StorageClass配置来获取和场景一一致的效果。
场景三针对的是:一些用户已经手动创建了云盘,手动创建PV后挂载使用,这个场景也是通过改造PV、PVC来模拟场景一;
场景一:可扩容动态卷
此场景是说直接创建可扩容动态数据卷,并为数据卷扩容。这种使用方式为云盘推荐的使用方式;
此场景的云盘使用过程如下:
1. 确保StorageClass符合扩容条件
期望的StorageClass如下:
# kubectl describe sc alicloud-disk-ssd
Name: alicloud-disk-ssd
IsDefaultClass: No
Provisioner: alicloud/disk
Parameters: type=cloud_ssd
AllowVolumeExpansion: True
MountOptions: <none>
ReclaimPolicy: Delete
VolumeBindingMode: Immediate
Events: <none>
如果当前StorageClass中没有定义AllowVolumeExpansion,或者值为False,通过下面命令进行更新:
# kubectl patch sc alicloud-disk-ssd -p '{"allowVolumeExpansion": true}'
2. 创建数据卷、应用
通过下面PVC模板创建动态数据卷:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-disk
spec:
accessModes:
- ReadWriteOnce
storageClassName: alicloud-disk-ssd
resources:
requests:
storage: 20Gi
创建应用挂载数据卷(模板略);
查看应用和数据卷信息:
# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 12m
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-disk Bound d-wz955czz7lmobytaa0f1 20Gi RWO alicloud-disk-ssd 13m
# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
d-wz955czz7lmobytaa0f1 20Gi RWO Delete Bound default/pvc-disk alicloud-disk-ssd 12m
原始挂载云盘大小为20G,创建测试文件:
# kubectl exec -ti web-0 sh
# df -h | grep data
/dev/vdb 20G 45M 20G 1% /data
# ls /data
lost+found
# touch /data/aliyun
# ls /data
aliyun lost+found
3. 扩容动态数据卷:
步骤一:扩容PVC,查看PVC、PV、文件系统大小:
执行扩容命令:
# kubectl patch pvc pvc-disk -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
persistentvolumeclaim/pvc-disk patched
PV扩容完成,但PVC、云盘、文件系统大小尚未变化,即应用可用存储空间并没有变化;
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-disk Bound d-wz955czz7lmobytaa0f1 20Gi RWO alicloud-disk-ssd 37m
# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
d-wz955czz7lmobytaa0f1 30Gi RWO Delete Bound default/pvc-disk alicloud-disk-ssd 36m
# kubectl exec -ti web-0 sh
# df -h | grep data
/dev/vdb 20G 45M 20G 1% /data
步骤二:重启Pod,扩容文件系统:
重启Pod:
# kubectl delete pod web-0
pod "web-0" deleted
云盘、PVC、PV、文件系统都扩容到了30G:
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-disk Bound d-wz955czz7lmobytaa0f1 30Gi RWO alicloud-disk-ssd 40m
# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
d-wz955czz7lmobytaa0f1 30Gi RWO Delete Bound default/pvc-disk alicloud-disk-ssd 40m
测试文件依然存储,保证了数据的可用性:
# kubectl exec -ti web-0 sh
# df -h | grep data
/dev/vdb 30G 44M 30G 1% /data
# ls /data/
aliyun lost+found
通过上面两步完成了动态数据卷的扩容操作(卷扩容 + 文件系统扩容);
场景二:不可扩容动态卷
不可扩容动态卷,是指动态数据卷对应的StorageClass没有配置allowVolumeExpansion为true;
这类数据卷的扩容主要思想是:改造对应的StorageClass,配置allowVolumeExpansion为true,然后使用与“场景一”相同的扩容步骤;
场景二与场景一的区别:
场景一是用配置了allowVolumeExpansion为True 的 StorageClass创建的PV;
场景二是用没有配置allowVolumeExpansion为True的 StorageClass创建的PV;
对于现存的正在使用的云盘动态数据卷,如果您创建动态卷的时候StorageClass没有配置allowVolumeExpansion为True(当时还不支持),可以考虑为符合这个场景;
此场景云盘事情过程:
- 更新StroageClass,添加allowVolumeExpansion(true)配置,参考“场景一”第1步;
- 扩容云盘动态数据卷;参考“场景一”第3步;
场景三:静态数据卷扩容
当用户先创建好了云盘,通过静态数据卷方式手动创建PV并挂载,这个场景的PV中一般没有配置StorageClassName或者配置的StorageClassName只为了标识作用(例如配置为disk);这时即需要对静态存储卷进行扩容;
注:静态存储卷不支持动态扩容,所以需要暂停应用,重新创建PVC、PV;
这个场景的扩容原则是:将当前的静态数据卷改造成动态数据卷;
步骤:
- 删除应用、PVC、PV,业务需要暂停,注意:给云盘打快照,且不能删除云盘;
- 创建新PVC、PV,模板中添加stroageClassName(value值具体选择哪个storageClass需要根据云盘的类型,例如:SSD、ESSD),且确认配置的stroageClass具有allowVolumeExpansion(true)配置;
- 重新创建应用挂载数据卷;
- 扩容云盘动态数据卷;参考“场景一”第3步;
静态存储卷的另一个扩容方式是:业务停止后手动扩容云盘,但pvc、pv不修改的话,以后需要扩容的时候还是要手动扩容,所以上述步骤有其意义所在。
总结:
云盘数据卷扩容只支持动态存储卷,且StorageClass需要配置allowVolumeExpansion为True。不符合这个需求的场景进行数据卷扩容时,需要改造StorageClass、PVC、PV,使之符合动态扩容条件;
需要注意的是,“数据卷扩容说明”、“数据卷扩容配置”部分指出了动态数据卷扩容所需要的条件,必须满足上述条件才能进行扩容操作。
附录:
给云盘扩容需要为集群的”Worker RAM 角色“添加ResizeDisk权限:
在集群 --> 管理 --> 集群资源 点击”Worker RAM 角色“;编辑Ram权限,添加ResizeDisk如下图: