节点NotReady故障处理

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: NodeNotReady
  expr: kube_node_status_condition{condition="Ready",status="true"} == 0
  for: 5m
  labels:
    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%以上。建议将核心检查步骤沉淀为自动化脚本,并建立多维监控体系,实现从"被动救火"到"主动防御"的转变。

posted on 2025-02-23 11:42  Leo-Yide  阅读(226)  评论(0)    收藏  举报