当前位置: 首页 > news >正文

K8s Pod 卡在 NotReady 状态:深入排查与修复 image filesystem 容量异常

1. 问题现象:集群节点集体罢工

刚用sealos部署完Kubernetes集群,满心欢喜执行kubectl get nodes,结果所有节点清一色显示NotReady状态,就像约好了一起罢工。这种场景下,新手最容易手忙脚乱,老司机则会先喝口水压压惊——因为90%的K8s部署问题都有标准排查流程。

具体到这次故障,节点状态显示如下:

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

此时千万别急着重装系统,我建议先执行三件套检查:

  1. 节点基础服务systemctl status kubelet containerd看核心服务是否存活
  2. 网络插件状态kubectl get pods -n kube-system检查Calico/Flannel等网络组件
  3. 日志抓取journalctl -xe -u kubelet --no-pager | grep -i error过滤关键错误

2. 揪出真凶:kubelet日志里的蛛丝马迹

在节点上执行journalctl -xe -u kubelet后,发现这样一条关键错误:

May 18 13:47:56 sealos-k8s-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"

这看起来像是CNI网络插件的问题,但继续往下翻日志,又发现了更致命的报错:

invalid capacity 0 on image filesystem

这个image filesystem容量异常才是真正的罪魁祸首。它意味着kubelet无法正确读取容器运行时(containerd/docker)提供的镜像存储空间信息,导致节点状态判断失误。就像你的手机显示"存储空间不可用"一样,虽然实际空间充足,但系统就是拒绝工作。

3. 根因分析:容器运行时与文件系统的爱恨情仇

为什么会出现invalid capacity 0这种诡异报错?经过多次实测和源码分析,发现主要有三种常见诱因:

3.1 容器运行时服务异常

containerd或dockerd服务虽然进程存在,但可能因为某些原因处于僵死状态。这时候执行ctr images list可能会卡住,或者返回空列表。这种情况在以下场景特别常见:

  • 节点突然断电导致元数据损坏
  • 磁盘IO压力过大导致服务假死
  • 内核版本与容器运行时存在兼容性问题

3.2 存储驱动配置冲突

检查/etc/containerd/config.toml时会发现这样的配置段:

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

如果实际系统使用的文件系统(比如xfs)与配置的snapshotter不匹配,就可能出现容量检测异常。

3.3 文件系统挂载问题

df -h输出中,/var/lib/containerd所在分区如果显示异常挂载选项,比如noexecnosuid,也会影响容器运行时的正常功能。我曾遇到过因为NFS存储挂载参数错误导致整个集群瘫痪的案例。

4. 手把手修复:从诊断到验证的全流程

4.1 应急处理:重启大法好

对于生产环境紧急情况,最快速的解决方案是:

systemctl restart containerd && systemctl restart kubelet

等待2分钟后检查节点状态:

kubectl get nodes -w

这个方案虽然简单粗暴,但实测有效率达到80%。就像电脑卡顿时首先会想到重启一样,容器运行时服务重启往往能解决临时性状态异常。

4.2 深度修复:配置文件调优

如果重启后问题依旧,就需要修改containerd配置:

  1. 备份原配置:cp /etc/containerd/config.toml /etc/containerd/config.toml.bak
  2. 生成默认配置:containerd config default > /etc/containerd/config.toml
  3. 调整关键参数:
[plugins."io.containerd.grpc.v1.cri".containerd] snapshotter = "overlayfs" discard_unpacked_layers = true [metrics] address = "0.0.0.0:1338"
  1. 重新加载配置:
systemctl daemon-reload systemctl restart containerd

4.3 终极方案:文件系统检查与修复

当上述方法都无效时,可能是底层文件系统损坏:

  1. 卸载containerd数据目录:
umount /var/lib/containerd
  1. 执行文件系统检查:
fsck -y /dev/sdX
  1. 重新挂载并设置正确选项:
mount -o defaults,noatime,nodiratime /dev/sdX /var/lib/containerd
  1. 重建containerd数据:
rm -rf /var/lib/containerd/* systemctl restart containerd

5. 防患于未然:运维最佳实践

经过多次踩坑后,我总结出以下预防措施:

  1. 监控配置:给所有节点添加image filesystem使用率告警,Prometheus配置示例:
- alert: ImageFSCapacityAbnormal expr: kubelet_node_name{job="kubelet"} and kubelet_volume_stats_available_bytes{namespace!="",persistentvolumeclaim!=""} / kubelet_volume_stats_capacity_bytes{namespace!="",persistentvolumeclaim!=""} < 0.1 for: 5m
  1. 定期维护:每月执行一次containerd maintenance操作:
ctr content gc ctr images prune --all
  1. 版本兼容性:确保内核版本、容器运行时、Kubernetes版本三者匹配,参考这个兼容矩阵:
Kubernetescontainerd内核最低版本
1.221.5.x4.14+
1.251.6.x5.4+
1.281.7.x5.10+

最后提醒大家,遇到NotReady不要慌,按照"看状态→查日志→隔离问题→验证修复"的流程,大部分K8s问题都能快速定位。记住这个万能命令组合:

kubectl describe node <节点名> | grep -i ready journalctl -xe -u kubelet --no-pager | grep -i error systemctl status containerd -l
http://www.jsqmd.com/news/662510/

相关文章:

  • CRM 客户管理系统对企业运营效率的提升价值研究
  • STM32+FreeRTOS内存分配全图解:从启动文件到任务栈的硬件级解析
  • PPTTimer:告别演讲超时的智能计时助手
  • 别再手动调参了!用YOLOv5的K-means+遗传算法,为你的数据集定制专属Anchors
  • 【数据结构】栈和链表基本方法的实现
  • 【Unity】Unity C#基础(一)从1.0到9.0:C#版本演进与Unity引擎适配史
  • Grafana 13.0.1 正式发布,带来 Dashboard、Provisioning 功能更新与 Bug 修复
  • 别再踩坑了!Ubuntu 20.04/22.04下禾赛Pandar系列激光雷达ROS驱动保姆级安装指南
  • .NET金融数据集成终极指南:如何快速获取Yahoo Finance股票数据
  • 告别大Batch和负样本:手把手复现SimSiam自监督训练(PyTorch版)
  • 统信UOS桌面版也能玩转经典街机?手把手教你用MAME模拟器搞定拳皇97
  • Linux下国产CH343驱动实战:从编译到自启动的完整指南
  • Llama-3.2V-11B-cot实战教程:双卡4090自动device_map分配技巧
  • 高效落地的广州展台设计服务商选购指南
  • 钉钉H5应用环境检测:精准识别JSAPI运行容器的实战指南
  • 自抗扰控制三阶LADRC在三相LCL逆变器模型中的应用:图一至图三的详细展示及参考文献
  • 系统分析师 数据安全与保密
  • 生化危机4重制版运行库安装指南 解决闪退 2026有效版
  • 2026年大吨位气动葫芦订制厂家怎么选择,吊钩式气动葫芦/8吨气动葫芦/叶片式气动葫芦,大吨位气动葫芦制造厂家哪家靠谱 - 品牌推荐师
  • 零样本异常检测怎么玩?手把手教你用ClipSAM和FoundAD快速搭建无监督监控系统
  • 3分钟掌握GPSTest:专业卫星导航测试工具完全指南
  • 别再暴力解压了!用python-docx库精准提取Word文档里的图片(附源码)
  • 长尾关键词优化策略助力SEO效果提升的新途径与案例分析
  • 我的Qt实践:融合QTabWidget与AdvancedDocking,打造可定制的Ribbon界面框架【开源分享】
  • 在Ubuntu 20.04上从零搭建宇树Z1机械臂仿真环境(ROS Noetic + Gazebo)保姆级避坑指南
  • SmallThinker-3B-Preview应用探索:学生解题助手、程序员代码审查伙伴、科研摘要生成器
  • 深度揭秘:如何3步解锁Unity游戏资源逆向工程
  • 从Presto集成出发:反向推导Linux服务器上OpenLDAP+LDAPS的保姆级搭建与调试指南
  • 终极指南:如何从零部署LibreOffice Online开源在线办公平台
  • Visual Studio彻底卸载终极指南:告别残留困扰,释放宝贵磁盘空间