在节点在创建时会默认创建一块数据盘,供容器运行时和Kubelet组件使用,详情请参见数据盘空间分配说明。由于容器运行时和Kubelet组件使用的数据盘不可被卸载,且默认大小为100G,出于使用成本考虑,您可手动调整该数据盘容量,最小支持下调至20G,节点上挂载的普通数据盘支持下调至10G。
须知
调整容器运行时和Kubelet组件使用的数据盘大小存在一些风险,根据本文提供的预估方法,建议综合评估后再做实际调整。
- 过小的数据盘容量可能会频繁出现磁盘空间不足,导致镜像拉取失败的问题。如果节点上需要频繁拉取不同的镜像,不建议将数据盘容量调小。
- 集群升级预检查会检查数据盘使用量是否超过95%,磁盘压力较大时可能会影响集群升级。
- Device Mapper类型比较容易出现空间不足的问题,建议使用OverlayFS类型操作系统,或者选择较大数据盘。
- 从日志转储的角度,应用的日志应单独挂盘存储,以免dockersys分区存储空间不足,影响业务运行。
- 调小数据盘容量后,建议您的集群安装npd插件,用于检测可能出现的节点磁盘压力问题,以便您及时感知。如出现节点磁盘压力问题,可根据数据盘空间不足时如何解决进行解决。
约束与限制
- 仅1.19及以上集群支持调小容器运行时和Kubelet组件使用的数据盘容量。
- 调整数据盘大小功能只支持云硬盘,不支持本地盘(本地盘仅在节点规格为“磁盘增强型”或“超高I/O型”时可选)。
如何选择合适的数据盘
在选择合适的数据盘大小时,需要结合以下考虑综合计算:
- 在拉取镜像过程中,会先从镜像仓库中下载镜像tar包然后解压,最后删除tar包保留镜像文件。在tar包的解压过程中,tar包和解压出来的镜像文件会同时存在,占用额外的存储空间,需要在计算所需的数据盘大小时额外注意。
- 在集群创建过程中,节点上可能会部署必装插件(如Everest插件、coredns插件等),这些插件会占用一定的空间,在计算数据盘大小时,需要为其预留大约2G的空间。
- 在应用运行过程中会产生日志,占用一定的空间,为保证业务正常运行,需要为每个Pod预留大约1G的空间。
OverlayFS类型
OverlayFS类型节点上的容器引擎和容器镜像空间默认占数据盘空间的90%(建议维持此值),这些容量全部用于dockersys分区,计算公式如下:
- 容器引擎和容器镜像空间:默认占数据盘空间的90%,其空间大小 = 数据盘空间 * 90%
dockersys分区(/var/lib/docker路径):容器引擎和容器镜像空间(默认占90%)都在/var/lib/docker目录下,其空间大小 = 数据盘空间 * 90%
- Kubelet组件和EmptyDir临时存储:占数据盘空间的10%,其空间大小 = 数据盘空间 * 10%
在OverlayFS类型的节点上,由于拉取镜像时,下载tar包后会存在解压过程,该过程中tar包和解压出来的镜像文件会同时存在于dockersys空间,会占用约2倍的镜像实际容量大小,等待解压完成后tar包会被删除。因此,在实际镜像拉取过程中,除去系统插件镜像占用的空间后,需要保证dockersys分区的剩余空间大于2倍的镜像实际容量。为保证容器能够正常运行,还需要在dockersys分区预留出相应的Pod容器空间,用于存放容器日志等相关文件。
因此在选择合适的数据盘时,需满足以下公式:
dockersys分区容量 > 2*镜像实际总容量 + 系统插件镜像总容量(约2G) + 容器数量 * 单个容器空间(每个容器需预留约1G日志空间)
说明当容器日志选择默认的json.log形式输出时,会占用dockersys分区,若容器日志单独设置持久化存储,则不会占用dockersys空间,请根据实际情况估算单个容器空间。
例如:假设节点的存储类型是OverlayFS,节点数据盘大小为20G。根据上述计算公式,默认的容器引擎和容器镜像空间比例为90%,则dockersys分区盘占用:20G*90% = 18G,且在创建集群时集群必装插件可能会占用2G左右的空间。倘若此时您需要部署10G的镜像tar包,但是由于解压tar包时大约会占用20G的dockersys空间,再加上必装插件占用的空间,超出了dockersys剩余的空间大小,极有可能导致镜像拉取失败。
Device Mapper类型
Device Mapper类型节点上的容器引擎和容器镜像空间默认占数据盘空间的90%(建议维持此值),这些容量又分为dockersys分区和thinpool空间,计算公式如下:
- 容器引擎和容器镜像空间:默认占数据盘空间的90%,其空间大小 = 数据盘空间 * 90%
dockersys分区(/var/lib/docker路径):默认占比20%,其空间大小 = 数据盘空间 * 90% * 20%
thinpool空间:默认占比为80%,其空间大小 = 数据盘空间 * 90% * 80%
- Kubelet组件和EmptyDir临时存储:占数据盘空间的10%,其空间大小 = 数据盘空间 * 10%
在Device Mapper类型的节点上,拉取镜像时tar包会在dockersys分区临时存放,等tar包解压后会把实际镜像文件存放在thinpool空间,最后dockersys空间的tar包会被删除。因此,在实际镜像拉取过程中,需要保证dockersys分区的空间大小和thinpool空间大小均有剩余。由于dockersys空间比thinpool空间小,因此在计算数据盘空间大小时,需要额外注意。为保证容器能够正常运行,还需要在dockersys分区预留出相应的Pod容器空间,用于存放容器日志等相关文件。
因此在选择合适的数据盘时,需同时满足以下公式:
- dockersys分区容量 > tar包临时存储(约等于镜像实际总容量) + 容器数量 * 单个容器空间(每个容器需预留约1G日志空间)
- thinpool空间 > 镜像实际总容量 + 系统插件镜像总容量(约2G)
说明当容器日志选择默认的json.log形式输出时,会占用dockersys分区,若容器日志单独设置持久化存储,则不会占用dockersys空间,请根据实际情况估算单个容器空间。
例如:假设节点的存储类型是Device Mapper,节点数据盘大小为20G。根据上述计算公式,默认的容器引擎和容器镜像空间比例为90%,则dockersys分区盘占用:20G*90%*20% = 3.6G,且在创建集群时集群必装插件可能会占用2G左右的dockersys空间,所以剩余1.6G左右。倘若此时您需要部署大于1.6G的镜像tar包,虽然thinpool空间足够,但是由于解压tar包时dockersys分区空间不足,极有可能导致镜像拉取失败。
数据盘空间不足时如何解决
方案一:清理镜像
您可以执行以下命令清理未使用的Docker镜像:
docker system prune -a
说明该命令会把暂时没有用到的Docker镜像都删除,执行命令前请确认。
方案二:扩容磁盘
步骤 1 在EVS界面扩容数据盘。
步骤 2 登录CCE控制台,进入集群,在左侧选择“节点管理”,单击节点后的“同步云服务器”。
步骤 3 登录目标节点。
步骤 4 使用lsblk命令查看节点块设备信息。
这里存在两种情况,根据容器存储Rootfs而不同。
- Overlayfs,没有单独划分thinpool,在dockersys空间下统一存储镜像相关数据。
#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 50G 0 disk└─sda1 8:1 0 50G 0 part /sdb 8:16 0 200G 0 disk├─vgpaas-dockersys 253:0 0 90G 0 lvm /var/lib/docker
docker使用的空间
└─vgpaas-kubernetes 253:1 0 10G 0 lvm /mnt/paas/kubernetes/kubelet # kubernetes使用的空间
在节点上执行如下命令,将新增的磁盘容量加到dockersys盘上。
pvresize /dev/sdblvextend -l+100%FREE -n vgpaas/dockersysresize2fs /dev/vgpaas/dockersys
- Devicemapper,单独划分了thinpool存储镜像相关数据。
#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 50G 0 disk└─sda1 8:1 0 50G 0 part /sdb 8:16 0 200G 0 disk├─vgpaas-dockersys 253:0 0 18G 0 lvm /var/lib/docker ├─vgpaas-thinpool_tmeta 253:1 0 3G 0 lvm │ └─vgpaas-thinpool 253:3 0 67G 0 lvm
thinpool空间
│ ...├─vgpaas-thinpool_tdata 253:2 0 67G 0 lvm │ └─vgpaas-thinpool 253:3 0 67G 0 lvm │ ...└─vgpaas-kubernetes 253:4 0 10G 0 lvm /mnt/paas/kubernetes/kubelet
在节点上执行如下命令,将新增的磁盘容量加到thinpool盘上。
pvresize /dev/sdblvextend -l+100%FREE -n vgpaas/thinpool
在节点上执行如下命令,将新增的磁盘容量加到dockersys盘上。
- pvresize /dev/sdb
- lvextend -l+100%FREE -n vgpaas/dockersys
- resize2fs /dev/vgpaas/dockersys