问题现象描述
在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的集成
了解这些变化有助于更好地排查类似问题。