数据卷扩容
使用云盘存储卷,往往在服务初始化的时候申请了一个适当容量的云盘,但是随着数据的增长,数据盘的容量不能满足需求,需要扩容。
传统应用的扩容场景中,往往是先手动停掉应用,再对数据盘进行备份,然后执行扩容操作,最后重新启动应用。
Kubernetes本身是一个自动化调度、编排系统,实现了对数据卷的生命周期管理。最新版本中已经提供对数据卷扩容的功能;
数据卷扩容目前支持以下类型:
gcePersistentDiskawsElasticBlockStoreOpenStack Cinderglusterfsrbdcsi
CSI数据卷扩容目前属于Alpha阶段(1.14),需要开启Feature Gates才可以使用;
ExpandCSIVolumes=true
注:数据卷扩容只支持通过storageclass创建的动态pv,静态pv不能实现扩容;
实现原理
Resizer架构上分为controller部分 和 node部分,实现过程也分2个阶段:
![d343100823f69a5af71926e680353322.png](https://img-blog.csdnimg.cn/img_convert/d343100823f69a5af71926e680353322.png)
阶段1:Controller部分实现云盘扩容
这个阶段由csi-resizer实现完成,在controller中通过云盘api调用实现扩容。
下面逻辑决定是否扩容:
resizer watch pvc,判断pvc是否需要resize:
比较pvc现在和之前的值,当pvc值变大时;
比较pvc和volume的值,当pvc值大于pv值时;
扩容是通过resizeVolume函数实现的,过程:
对需要扩容的pvc,配置pvc状态为resizing;
调用csi-plugin中 ControllerExpandVolume函数,调用云盘api实现云盘扩容;
更新pv对象的size,size变成扩容后大小;
如果需要文件系统扩容,更新pvc状态为:FileSystemResizePending,等待node部分进行文件系统扩容;
此时pvc的conditions字段变为: