节点在创建时会默认创建一块数据盘,供容器运行时和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类型及Device Mapper类型。
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分区空间不足,极有可能导致镜像拉取失败。
数据盘空间不足时如何解决
方案一:清理镜像
您可以执行以下步骤清理未使用的镜像:
- 使用containerd容器引擎的节点:
- 查看节点上的本地镜像。
crictl images -v
- 确认镜像无需使用,并通过镜像ID删除无需使用的镜像。
crictl rmi {镜像ID}
- 使用docker容器引擎的节点:
- 查看节点上的本地镜像。
docker images
- 确认镜像无需使用,并通过镜像ID删除无需使用的镜像。
docker rmi {镜像ID}
请勿删除cce-pause等系统镜像,否则可能导致无法正常创建容器。
方案二:扩容磁盘
- 在EVS控制台扩容数据盘。详情请参见扩容云硬盘容量。
在EVS控制台扩容成功后,仅扩大了云硬盘的存储容量,还需要执行后续步骤扩容逻辑卷和文件系统。
- 登录CCE控制台,进入集群,在左侧选择“节点管理”,单击节点后的“同步云服务器”。
- 登录目标节点。
- 使用lsblk命令查看节点块设备信息。
这里存在两种情况,根据容器存储Rootfs而不同。
Overlayfs:没有单独划分thinpool,在dockersys空间下统一存储镜像相关数据。
- 查看设备的磁盘和分区大小。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
└─sda1 8:1 0 50G 0 part /
sdb 8:16 0 150G 0 disk # 数据盘已扩容至150G,存在50G空间仍未分配
├─vgpaas-dockersys 253:0 0 90G 0 lvm /var/lib/containerd
└─vgpaas-kubernetes 253:1 0 10G 0 lvm /mnt/paas/kubernetes/kubelet
- 扩容磁盘。
将新增的磁盘容量加到容器引擎使用的dockersys逻辑卷上。
- 扩容物理卷PV,让LVM识别EVS新增的容量。其中/dev/sdb为dockersys逻辑卷所在的物理卷。
pvresize /dev/sdb
回显如下:
Physical volume "/dev/sdb" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
- 将空闲容量100%扩容到逻辑卷LV。其中vgpaas/dockersys为容器引擎使用的逻辑卷。
lvextend -l+100%FREE -n vgpaas/dockersys
回显如下:
Size of logical volume vgpaas/dockersys changed from <90.00 GiB (23039 extents) to 140.00 GiB (35840 extents).
Logical volume vgpaas/dockersys successfully resized.
- 调整文件系统的大小。其中/dev/vgpaas/dockersys为容器引擎的文件系统路径。
resize2fs /dev/vgpaas/dockersys
回显如下:
Filesystem at /dev/vgpaas/dockersys is mounted on /var/lib/containerd; on-line resizing required
old_desc_blocks = 12, new_desc_blocks = 18
The filesystem on /dev/vgpaas/dockersys is now 36700160 blocks long.
- 检查是否扩容成功。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
└─sda1 8:1 0 50G 0 part /
sdb 8:16 0 150G 0 disk
├─vgpaas-dockersys 253:0 0 140G 0 lvm /var/lib/containerd
└─vgpaas-kubernetes 253:1 0 10G 0 lvm /mnt/paas/kubernetes/kubelet
Devicemapper:单独划分了thinpool存储镜像相关数据。
- 查看设备的磁盘和分区大小。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 8:0 0 50G 0 disk
└─vda1 8:1 0 50G 0 part /
vdb 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盘上。
- 扩容物理卷PV,让LVM识别EVS新增的容量。其中/dev/vdb为thinpool空间所在的物理卷。
pvresize /dev/vdb
回显如下:
Physical volume "/dev/vdb" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
- 将空闲容量100%扩容到逻辑卷LV。其中vgpaas/thinpool为容器引擎使用的逻辑卷。
lvextend -l+100%FREE -n vgpaas/thinpool
回显如下:
Size of logical volume vgpaas/thinpool changed from <67.00 GiB (23039 extents) to <167.00 GiB (48639 extents).
Logical volume vgpaas/thinpool successfully resized.
- 由于thinpool未挂载到设备,因此无需调整文件系统的大小。
- 检查是否扩容成功。使用lsblk命令查看设备的磁盘和分区大小,若新增的磁盘容量已经加到thinpool盘,则表示扩容成功。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 8:0 0 50G 0 disk
└─vda1 8:1 0 50G 0 part /
vdb 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 167G 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
选项二:将新增的磁盘容量加到dockersys盘上。
- 扩容物理卷PV,让LVM识别EVS新增的容量。其中/dev/vdb为dockersys逻辑卷所在的物理卷。
pvresize /dev/vdb
回显如下:
Physical volume "/dev/vdb" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
- 将空闲容量100%扩容到逻辑卷LV。其中vgpaas/dockersys为容器引擎使用的逻辑卷。
lvextend -l+100%FREE -n vgpaas/dockersys
回显如下:
Size of logical volume vgpaas/dockersys changed from <18.00 GiB (4607 extents) to <118.00 GiB (30208 extents).
Logical volume vgpaas/dockersys successfully resized.
- 调整文件系统的大小。其中/dev/vgpaas/dockersys为容器引擎的文件系统路径。
resize2fs /dev/vgpaas/dockersys
回显如下:
Filesystem at /dev/vgpaas/dockersys is mounted on /var/lib/docker; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 15
The filesystem on /dev/vgpaas/dockersys is now 30932992 blocks long.
- 检查是否扩容成功。使用lsblk命令查看设备的磁盘和分区大小,若新增的磁盘容量已经加到dockersys盘,则表示扩容成功。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 8:0 0 50G 0 disk
└─vda1 8:1 0 50G 0 part /
vdb 8:16 0 200G 0 disk
├─vgpaas-dockersys 253:0 0 118G 0 lvm /var/lib/docker # 扩容后的dockersys盘
├─vgpaas-thinpool_tmeta 253:1 0 3G 0 lvm
│ └─vgpaas-thinpool 253:3 0 67G 0 lvm
│ ...
├─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