随笔 - 378  文章 - 0  评论 - 5  阅读 - 6085

K8s节点Not Ready故障排查

Kubernetes生产实战:节点Not Ready故障排查指南(附全流程图)

在Kubernetes集群中,节点失联是典型的紧急故障场景。本文将结合百节点集群运维经验,手把手教你快速定位问题,并提供生产级修复方案。


一、快速定位三板斧(5分钟定位问题)

1. 基础状态检查

# 查看节点基础状态
kubectl get node <节点名> -o wide

# 获取详细事件(重点关注Conditions段)
kubectl describe node <节点名> | grep -A 15 Conditions

# 查看节点资源水位
kubectl top node <节点名>

2. 核心组件检查

# 检查kubelet状态(节点侧)
ssh <节点IP> "systemctl status kubelet -l"

# 查看容器运行时状态
ssh <节点IP> "crictl ps -a | grep -v Running"

# 检查网络插件健康度
kubectl -n kube-system get pods -l app.kubernetes.io/name=calico-node

3. 关键日志速查

# Kubelet日志(最近10分钟)
journalctl -u kubelet --since "10 minutes ago" | grep -i error

# 容器运行时日志
tail -100 /var/log/containers/kubelet*.log

# 内核日志(重点关注OOM)
dmesg -T | grep -E 'oom|kill'

二、六大典型故障场景与解决方案

场景1:磁盘压力(最常见)

特征

  • kubectl describe node显示DiskPressure=True
  • 节点存在Evicted Pod

修复步骤

# 快速清理空间
ssh <节点IP> "df -h /var/lib/docker && docker system prune -af"

# 调整kubelet垃圾回收参数
KUBELET_EXTRA_ARGS="--image-gc-high-threshold=90 --image-gc-low-threshold=85"
systemctl restart kubelet
场景2:内核死锁(突发性故障)

排查工具

# 检查内核软锁
grep 'soft lockup' /var/log/messages

# 查看进程状态
ssh <节点IP> "ps auxf | grep D"

应急方案

# 临时重启节点
kubectl cordon <节点名> && kubectl drain <节点名> --ignore-daemonsets
ssh <节点IP> "reboot"
场景3:CNI插件异常(网络故障)

诊断命令

# Calico检查
calicoctl node status

# Flannel检查
ip route show | grep flannel

# 网络连通性测试
kubectl run netcheck --image=nicolaka/netshoot --rm -it -- curl <API-Server-IP>:6443
场景4:证书过期(证书管理不善)

检测方法

# 检查kubelet证书有效期
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates

# 强制证书轮换
systemctl stop kubelet
rm -f /var/lib/kubelet/pki/kubelet-*
systemctl start kubelet
场景5:硬件故障(隐蔽型问题)

排查工具

# 内存检测
memtester 1G

# 磁盘健康度
smartctl -a /dev/sda

# CPU压力测试
stress -c 4 -t 300
场景6:资源耗尽(突发流量)

应急方案

# 临时扩容节点
kubectl scale deployment/nginx --replicas=0

# 快速迁移Pod
kubectl drain <故障节点> --grace-period=300 --delete-emptydir-data

三、预防性配置清单

1. 节点健康检查配置

apiVersion: machineconfiguration.openshift.io/v1
kind: KubeletConfig
metadata:
  name: node-health-check
spec:
  machineConfigPoolSelector:
    matchLabels:
      pools.operator.machineconfiguration.openshift.io/master: ""
  kubeletConfig:
    healthzBindAddress: 0.0.0.0
    healthzPort: 10248
    eventRecordQPS: 50

2. 自动化监控告警
Prometheus关键告警规则:

- alert: NodeNotReady
  expr: kube_node_status_condition{condition="Ready",status="false"} == 1
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "节点 {{ $labels.node }} 已失联超过5分钟"

3. 自愈系统配置(示例)

# 自动隔离异常节点
def handle_node_not_ready(event):
    if event['reason'] == 'NodeNotReady':
        node_name = event['involvedObject']['name']
        cordon_node(node_name)
        drain_pods(node_name)
        reboot_node(node_name)

四、排查全流程图

节点Not Ready

能否SSH连接?

检查kubelet状态

查看节点资源水位

CPU/内存/磁盘异常?

扩容/清理/迁移

检查网络插件

检查硬件/云平台

验证API-Server连通性

端口6443通吗?

检查防火墙/安全组

检查证书有效性

黄金口诀:一查SSH二看组件,三验资源四查网络,证书内核别忘记,硬件故障终级案。

通过系统化的排查流程,90%的节点故障可在15分钟内定位。建议配置每周自动节点巡检,提前发现潜在风险。对于生产关键集群,建议部署备用节点池以快速替换故障节点。

posted on   Leo-Yide  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示