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

Kubernetes排错(十五):节点NotReady故障排查处理

在Kubernetes生产集群中,节点突然变成NotReady状态是运维团队最常遇到的紧急故障之一。本文将分享一套经过实战检验的排查流程,并附上生产环境专用诊断命令。

一、快速诊断三板斧(5分钟定位问题)
1. 基础状态速查
# 查看所有节点状态(重点关注READY列)
kubectl get nodes -o wide# 获取节点详细事件(核心排查入口)
kubectl describe node <节点名> | grep -A 15 'Conditions'
2. 黄金三指标
  1. 网络连通性:API Server可达性
    # 从故障节点测试控制面连通性
    curl -k https://<API-Server-IP>:6443/healthz
    
  2. kubelet状态:进程是否存活
    # 检查kubelet服务状态(生产环境常见问题源)
    systemctl status kubelet -l | grep Active
    
  3. 容器运行时:CRI是否正常
    # Containerd运行时检查
    ctr containers list
    
二、深度排查七步走
步骤1:kubelet日志分析
# 实时追踪kubelet日志(重点关注ERROR级别)
journalctl -u kubelet -f | grep -E 'error|fail'

常见日志模式

  • PLEG is not healthy → 容器运行时异常
  • Failed to update node status → 证书过期或APIServer连接问题
步骤2:资源瓶颈检查
# 磁盘空间(/var/lib分区是关键)
df -h /var/lib/docker /var/lib/kubelet# 内存压力(可用<10%需警惕)
free -m | awk 'NR==2{printf "%.1f%%\n", $3*100/$2}'# 进程级资源监控
top -p $(pgrep kubelet) -p $(pgrep containerd)
步骤3:网络诊断
# 检查CNI插件状态(Calico示例)
calicoctl node status# 关键端口连通性测试
nc -zv <API-Server-IP> 6443  # 控制面通信
nc -zv <其他节点IP> 8472     # Flannel VXLAN
步骤4:证书有效性验证
# 检查kubelet客户端证书
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates

⚠️ 证书过期是生产环境常见陷阱

步骤5:内核日志审查
# 查看系统级错误(OOM、硬件故障等)
dmesg -T | grep -iE 'oom|error|fail'
步骤6:容器运行时检测
# Containerd健康检查
ctr version && ctr namespaces list# 容器进程树分析
pstree -ap | grep -E 'containerd|kubelet'
步骤7:节点自检工具
# 使用官方检查脚本
curl -sSL https://raw.githubusercontent.com/kubernetes-sigs/kubespray/master/contrib/validate/validate-cluster.sh | bash
三、高频故障场景处理指南
场景1:PLEG不健康(生产环境TOP1问题)

现象

PLEG is not healthy: pleg was last seen active 3m0s ago

解决方案

# 重启容器运行时(Containerd示例)
systemctl restart containerd
# 清理残留容器
ctr containers list | awk '{print $1}' | xargs -I{} ctr containers delete {}
场景2:证书过期

特征

  • kubelet日志出现x509: certificate has expired or is not yet valid
    修复流程
rm -f /var/lib/kubelet/pki/kubelet-client-*
systemctl restart kubelet
场景3:磁盘爆满

应急处理

# 快速定位大文件
du -h /var/lib/docker/overlay2 | sort -rh | head -20# 清理dead容器
docker system prune -af
四、生产环境防护体系
1. 预防性监控配置
# Prometheus告警规则示例
- alert: NodeNotReadyexpr: kube_node_status_condition{condition="Ready",status="true"} == 0for: 5mlabels:severity: critical
2. 节点健康检查机制
# kubelet配置示例(/etc/kubernetes/kubelet.conf)
healthzBindAddress: 0.0.0.0:10248
healthzPort: 10248
3. 自动化恢复方案
# 自动驱逐Pod脚本(谨慎使用)
kubectl get pods --all-namespaces -o wide | grep <故障节点> | awk '{print $1,$2}' | xargs -n2 kubectl delete pod -n
五、专家级调试技巧
  1. 动态日志级别调整

    # 临时开启kubelet调试日志
    curl -X PUT -d "4" http://localhost:10248/debug/flags/v
    
  2. 内核参数调优

    # 解决文件句柄耗尽问题
    sysctl -w fs.inotify.max_user_watches=1048576
    
  3. APIServer审计分析

    kubectl logs -n kube-system kube-apiserver-<pod> | grep <节点IP>
    
六、避坑指南
  1. 勿盲目重启节点:可能导致状态不一致
  2. 慎用force delete:可能引发数据卷残留
  3. 监控时区统一:确保所有节点时间同步
  4. 版本兼容性检查:kubelet与控制面版本差异不超过2个minor版本

通过系统化的排查流程和预防措施,运维团队可以将节点NotReady的平均恢复时间(MTTR)缩短70%以上。建议将核心检查步骤沉淀为自动化脚本,并建立多维监控体系,实现从"被动救火"到"主动防御"的转变。

相关文章:

  • uniapp-商城-53-后台 商家信息(更新修改和深浅copy)
  • 大模型项目:普通蓝牙音响接入DeepSeek,解锁语音交互新玩法
  • 【iOS】SDWebImage源码学习
  • 八股文-js篇
  • 【漫话机器学习系列】253.超平面(Hyperplane)
  • Python_day22
  • QT6 源(93)篇三:阅读与注释共用体类 QVariant 及其源代码,本类支持比较运算符 ==、!=。
  • 【计算机视觉】OpenCV实战项目:Text-Extraction-Table-Image:基于OpenCV与OCR的表格图像文本提取系统深度解析
  • 【愚公系列】《Manus极简入门》031-商业模式创新师:“模式筛选者”
  • MySQL数据库下篇
  • Python与矢量网络分析仪3671E:通道插损自动化校准(Vscode)
  • spring cloud loadbalancer实现机房感知的负载均衡
  • CSS:盒子阴影与渐变完全解析:从基础语法到创意应用
  • 大模型中的temperature参数是什么
  • LLMs之MCP:2025年5月2日,Anthropic 宣布 Claude 重大更新:集成功能上线,研究能力大幅提升
  • React+Springboot项目部署ESC服务器
  • 大学之大:东京工业大学2025.5.11
  • Pandas 时间处理利器:to_datetime() 与 Timestamp() 深度解析
  • 17.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--loki
  • web animation API 锋利的css动画控制器 (更新中)
  • 中国人民抗日战争暨世界反法西斯战争胜利80周年纪念活动标识发布
  • 《广州大典研究》集刊发展座谈会:“广州学”的传承与创新
  • 上海交大计算机学院成立,设多个拔尖人才特色班
  • 1至4月全国铁路完成固定资产投资1947亿元,同比增长5.3%
  • 印度一战机在巴基斯坦旁遮普省被击落,飞行员被俘
  • 上海第四批土拍成交额97亿元:杨浦宅地成交楼板单价半年涨近7000元