更新时间:2024-01-04 GMT+08:00

选择合适的节点数据盘大小

节点在创建时会默认创建一块数据盘,供容器运行时和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容器引擎的节点:
    1. 查看节点上的本地镜像。
      crictl images -v
    2. 确认镜像无需使用,并通过镜像ID删除无需使用的镜像。
      crictl rmi {镜像ID}
  • 使用docker容器引擎的节点:
    1. 查看节点上的本地镜像。
      docker images
    2. 确认镜像无需使用,并通过镜像ID删除无需使用的镜像。
      docker rmi {镜像ID}

请勿删除cce-pause等系统镜像,否则可能导致无法正常创建容器。

方案二:扩容磁盘

  1. 在EVS界面扩容数据盘。
  2. 登录CCE控制台,进入集群,在左侧选择“节点管理”,单击节点后的“同步云服务器”
  3. 登录目标节点。
  4. 使用lsblk命令查看节点块设备信息。

    这里存在两种情况,根据容器存储Rootfs而不同。

    • Overlayfs,没有单独划分thinpool,在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   90G  0 lvm  /var/lib/docker               # 容器引擎使用的空间
      └─vgpaas-kubernetes 253:1    0   10G  0 lvm  /mnt/paas/kubernetes/kubelet  # kubernetes使用的空间

      在节点上执行如下命令, 将新增的磁盘容量加到dockersys盘上。

      pvresize /dev/vdb 
      lvextend -l+100%FREE -n vgpaas/dockersys
      resize2fs /dev/vgpaas/dockersys
    • 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盘上。
        pvresize /dev/vdb 
        lvextend -l+100%FREE -n vgpaas/thinpool
      • 在节点上执行如下命令, 将新增的磁盘容量加到dockersys盘上。
        pvresize /dev/vdb 
        lvextend -l+100%FREE -n vgpaas/dockersys
        resize2fs /dev/vgpaas/dockersys