news 2026/4/23 12:40:31

K8s节点NotReady排查实录:从‘invalid capacity 0 on image filesystem’到CNI插件初始化失败

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
K8s节点NotReady排查实录:从‘invalid capacity 0 on image filesystem’到CNI插件初始化失败

Kubernetes节点NotReady深度排查:从文件系统异常到CNI插件故障链分析

当你发现Kubernetes集群中的节点突然集体罢工,状态全部显示为NotReady时,那种感觉就像走进了一个没有出口的迷宫。最近我在维护一个生产环境集群时就遇到了这种情况——四个节点同时罢工,表面报错是invalid capacity 0 on image filesystem,但深入排查后发现这仅仅是冰山一角。本文将带你完整还原这次故障排查的全过程,揭示Kubernetes组件间那些不为人知的依赖关系。

1. 故障现象与初步诊断

那天早上,监控系统突然报警,显示集群所有节点状态变为NotReady。使用kubectl get nodes命令确认后,输出如下:

NAME STATUS ROLES AGE VERSION sealos-k8s-node-01 NotReady control-plane,master 4m5s v1.22.0 sealos-k8s-node-02 NotReady <none> 2m39s v1.22.0 sealos-k8s-node-03 NotReady <none> 2m40s v1.22.0 sealos-k8s-node-04 NotReady control-plane,master 3m33s v1.22.0

查看kubelet日志发现了两个看似不相关的错误:

journalctl -xe -u kubelet | grep -i error

输出显示:

May 18 13:47:56 node-04 kubelet[5038]: E0518 13:47:56.386059 5038 kubelet.go:2332] "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized" May 18 13:47:56 node-04 kubelet[5038]: E0518 13:47:56.386123 5038 kubelet.go:1303] "Image garbage collection failed once. Stats initialization may not have completed yet" err="invalid capacity 0 on image filesystem"

这两个错误中,invalid capacity 0 on image filesystem看起来像是存储问题,而cni plugin not initialized则明显是网络问题。它们之间是否存在关联?这成为了我们排查的第一个关键点。

2. 镜像文件系统容量异常分析

invalid capacity 0 on image filesystem这个错误通常意味着kubelet无法正确获取节点上容器镜像文件系统的容量信息。这会影响kubelet的垃圾回收功能,但理论上不应该直接导致节点NotReady。让我们深入分析可能的原因:

2.1 可能的原因排查

  1. 文件系统挂载问题

    • 检查/var/lib/kubelet/var/lib/containerd的挂载状态
    • 使用df -h查看相关挂载点的可用空间
  2. containerd服务异常

    • containerd负责管理容器镜像,如果它出现问题,kubelet无法获取镜像信息
    • 检查containerd状态:systemctl status containerd
  3. 磁盘inode耗尽

    • 使用df -i检查inode使用情况
    • 容器环境容易产生大量小文件,导致inode耗尽
  4. SELinux或AppArmor限制

    • 检查安全模块是否阻止了kubelet访问文件系统
    • 查看/var/log/audit/audit.log获取相关拒绝记录

2.2 诊断命令与预期输出

执行以下命令收集信息:

# 检查文件系统挂载 mount | grep -E 'kubelet|containerd' # 检查磁盘空间 df -h /var/lib/kubelet /var/lib/containerd # 检查containerd状态 containerd config dump | grep -A 5 "\[plugins.\"io.containerd.grpc.v1.cri\".image\]" # 检查inode使用 df -i /var

在本次故障中,这些检查都没有发现明显异常,containerd服务也显示为运行状态。这提示我们需要更深入地分析kubelet与containerd的交互。

3. CNI插件初始化失败的根本原因

cni plugin not initialized这个错误表明Kubernetes的网络插件未能正确启动。CNI(Container Network Interface)插件负责为Pod配置网络,如果它失败,节点上的所有Pod都将无法正常工作,导致节点被标记为NotReady。

3.1 CNI插件依赖链分析

CNI插件的正常工作依赖于以下几个关键组件:

  1. 容器运行时(containerd/docker):提供基础的容器运行环境
  2. kubelet:协调容器生命周期管理
  3. 网络插件二进制和配置文件:如Calico、Flannel等的可执行文件和配置文件
  4. 网络命名空间:内核级别的网络隔离机制

这些组件之间的关系可以用下表表示:

组件功能依赖项故障表现
containerd容器运行时内核cgroup支持容器无法创建
kubelet节点代理containerd APIPod调度失败
CNI插件网络配置containerd socket网络不通
kube-proxy服务代理CNI网络服务无法访问

3.2 关键诊断步骤

  1. 检查CNI配置文件

    ls -l /etc/cni/net.d/ cat /etc/cni/net.d/10-calico.conflist
  2. 验证CNI插件二进制文件

    ls -l /opt/cni/bin/
  3. 检查kubelet网络配置

    ps -ef | grep kubelet | grep --color=auto network-plugin
  4. 查看containerd日志

    journalctl -u containerd --since "1 hour ago" | grep -i cni

在本次故障中,所有这些检查都显示配置正确,但CNI插件仍然报告未初始化。这提示我们可能需要关注containerd的内部状态。

4. containerd重启的"神奇"效果

在多次排查无果后,尝试了一个简单的操作:重启containerd服务。令人惊讶的是,这个操作不仅解决了CNI插件初始化问题,连invalid capacity 0 on image filesystem错误也一并消失了。

systemctl restart containerd

几分钟后,所有节点状态恢复正常:

NAME STATUS ROLES AGE VERSION sealos-k8s-node-01 Ready control-plane,master 50m v1.22.0 sealos-k8s-node-02 Ready <none> 49m v1.22.0 sealos-k8s-node-03 Ready <none> 49m v1.22.0 sealos-k8s-node-04 Ready control-plane,master 50m v1.22.0

4.1 为什么重启containerd能解决问题?

containerd作为容器运行时,维护着多个内部状态和连接:

  1. gRPC连接状态:kubelet通过gRPC与containerd通信,长时间运行可能出现连接问题
  2. 文件系统挂载缓存:containerd缓存了文件系统信息,可能导致容量报告不准确
  3. 插件管理状态:CNI插件通过containerd注册,状态异常会影响网络功能

当containerd运行时间过长或遇到某些内部错误时,这些状态可能会变得不一致。重启服务会重置所有这些状态,通常能解决一些难以定位的"幽灵"问题。

4.2 更优雅的解决方案

虽然重启containerd可以快速解决问题,但在生产环境中,我们可能需要更优雅的解决方案:

  1. 配置containerd自动恢复

    # 在/etc/containerd/config.toml中添加 [plugins."io.containerd.grpc.v1.cri"] enable_selinux = false sandbox_image = "registry.k8s.io/pause:3.6" [plugins."io.containerd.grpc.v1.cri".containerd] snapshotter = "overlayfs" disable_snapshot_annotations = true
  2. 设置kubelet健康检查

    # 在kubelet配置中添加 --healthz-port=10248 --healthz-bind-address=0.0.0.0
  3. 监控关键指标

    • containerd的goroutine数量
    • gRPC调用延迟
    • 文件系统操作错误计数

5. 系统性故障排查框架

基于这次经验,我总结了一个Kubernetes节点NotReady问题的系统性排查框架:

5.1 排查流程图

  1. 确认节点状态kubectl get nodes -o wide
  2. 检查kubelet日志journalctl -u kubelet -n 100 -f
  3. 验证容器运行时crictl pssystemctl status containerd
  4. 检查网络插件ip link showkubectl get pods -n kube-system
  5. 查看资源使用topdf -h
  6. 检查内核日志dmesg -T | tail -n 50

5.2 常见错误模式对照表

错误现象可能原因验证方法解决方案
CNI插件未初始化containerd状态异常containerd日志重启containerd
镜像容量为0文件系统挂载问题mount命令重新挂载或重启
节点频繁NotReady内存压力free -m调整kubelet资源预留
Pod网络不通网络策略冲突calicoctl get networkpolicy调整网络策略

5.3 预防性维护建议

为了避免类似问题再次发生,可以考虑以下预防措施:

  1. 定期滚动重启节点组件

    # 使用kubectl drain安全排空节点 kubectl drain <node-name> --ignore-daemonsets systemctl restart kubelet containerd kubectl uncordon <node-name>
  2. 配置资源监控和告警

    • 监控containerd的内存使用和goroutine数量
    • 设置kubelet健康检查端点监控
  3. 保持版本兼容性

    • 确保kubelet、containerd和CNI插件版本兼容
    • 参考Kubernetes官方发布的版本兼容性矩阵

那次故障后,我在所有集群节点上设置了containerd的定期健康检查,并调整了kubelet的资源预留参数。半年过去了,再没遇到过类似的全节点NotReady情况。有时候,最简单的解决方案背后隐藏着最复杂的系统交互,这就是Kubernetes运维的迷人之处——你永远在学习和发现新的问题解决模式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:36:22

PS2手柄协议逆向与STM32移植笔记:如何让老手柄在新项目里焕发第二春

PS2手柄协议逆向与STM32移植笔记&#xff1a;如何让老手柄在新项目里焕发第二春 周末整理储物柜时&#xff0c;翻出一个尘封多年的PS2无线手柄。这款2004年随PlayStation2发售的经典外设&#xff0c;曾陪伴无数玩家度过热血沸腾的游戏时光。如今主机早已退役&#xff0c;但手柄…

作者头像 李华
网站建设 2026/4/23 12:33:29

告别漂移轨迹!用Valhalla的HMM地图匹配API,5分钟搞定车辆轨迹纠偏

5分钟实战&#xff1a;用Valhalla的HMM算法实现高精度车辆轨迹纠偏 当物流调度系统显示某辆货车正在珠江中央"行驶"&#xff0c;或是共享单车轨迹在建筑物间"穿墙而过"&#xff0c;这些令人啼笑皆非的GPS漂移现象背后&#xff0c;是每个轨迹数据处理工程师…

作者头像 李华
网站建设 2026/4/23 12:29:36

Steam账号批量创建与自动化管理完整方案

Steam账号批量创建与自动化管理完整方案 【免费下载链接】Steam-Account-Generator Steam Account Generator by DedSec [ Use https://accgen.cathook.club/ ] 项目地址: https://gitcode.com/gh_mirrors/st/Steam-Account-Generator Steam Account Generator是一款专为…

作者头像 李华
网站建设 2026/4/23 12:29:27

2026 年 AI 编程助手排行榜:Claude Code / Cursor / Copilot / Windsurf 全面横评

2026 年&#xff0c;AI 编程助手市场已经进入成熟竞争期。本文基于实际开发场景&#xff0c;对六款主流 AI 编程工具进行全方位横向对比&#xff0c;帮助开发者选择最适合自己的工具。 一、评测工具一览 工具开发商形态底层模型Claude CodeAnthropicCLI 工具Claude Opus 4.6 …

作者头像 李华