Kubernetes节点加入集群报错”invalid capacity 0 on image filesystem”问题排查与解决


阅读 4 次

问题现象描述

在Kubernetes v1.30.0集群中添加新节点时,节点状态显示异常错误:

invalid capacity 0 on image filesystem

通过kubectl describe node查看节点详情时,会发现ImageFilesystemAvailable和ImageFilesystemCapacity字段显示为0。

环境检查

问题节点的存储配置如下:

root@node:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
vda    254:0    0   40G  0 disk 
├─vda1 254:1    0    1M  0 part 
├─vda2 254:2    0  191M  0 part /boot/efi
└─vda3 254:3    0 39.8G  0 part /

containerd版本信息:

containerd github.com/containerd/containerd 1.6.20~ds1 1.6.20~ds1-1+b1

根本原因分析

这个问题通常是由于Kubelet无法正确获取容器运行时(containerd)的存储配额信息导致的。具体原因可能包括:

  • containerd配置中没有正确设置存储驱动
  • Kubelet与containerd通信异常
  • 节点存储设备挂载点权限问题
  • containerd版本与Kubernetes版本兼容性问题

解决方案

以下是经过验证的解决方案:

方法一:检查并修改containerd配置

编辑/etc/containerd/config.toml文件:

[plugins."io.containerd.grpc.v1.cri".containerd]
  snapshotter = "overlayfs"
  disable_snapshot_annotations = false

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  runtime_type = "io.containerd.runc.v2"

然后重启containerd服务:

systemctl restart containerd

方法二:调整Kubelet配置

编辑/var/lib/kubelet/config.yaml,添加以下配置:

imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80
imageMinimumGCAge: 2m0s

重启kubelet服务:

systemctl restart kubelet

方法三:检查存储挂载

确保/var/lib/containerd目录挂载在正确的设备上:

mount | grep containerd

如果发现异常,可以尝试重新挂载:

umount /var/lib/containerd
mount /dev/vda3 /var/lib/containerd

验证解决方案

执行以下命令检查问题是否解决:

kubectl describe node <node-name> | grep -A 5 "Allocatable"

正确的输出应该显示非零的存储容量:

Allocatable:
  cpu:                4
  ephemeral-storage:  36874436748
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             8010468Ki
  pods:               110

预防措施

为了避免类似问题再次发生,建议:

  • 在节点加入集群前预先检查containerd配置
  • 使用统一的节点初始化脚本
  • 定期检查节点存储状态
  • 保持Kubernetes和containerd版本兼容

扩展知识

Kubernetes v1.30.0对存储管理做了以下改进:

  • 支持更精细的存储配额管理
  • 优化了ImageGC策略
  • 增强了与containerd的集成

了解这些变化有助于更好地排查类似问题。