Kubernetes 节点 NotReady 状态的系统化排查清单

目录标题

以下是针对 Kubernetes 节点 NotReady 状态的系统化排查清单,已按模块优化结构、补充细节并修正描述,便于定位问题:


🧭 Kubernetes NotReady 节点排查指南

当节点出现 NotReady 状态时,可能由多种组件异常或资源耗尽导致,建议按以下模块逐步排查:


一、节点状态初查(从集群视角出发)

✅ 1. 查看节点状态:

kubectl get nodes -o wide

✅ 2. 查看节点详细描述信息(含 Taints、Conditions、Events):

kubectl describe node <node-name> > node-describe.log

✅ 3. 导出完整节点对象 YAML 以查看内部配置:

kubectl get node <node-name> -o yaml > node.yaml

✅ 4. 查看当前集群 Events 是否有异常提示:

kubectl get events --sort-by='.lastTimestamp' -A > events.log

二、Kubelet 状态与日志排查(节点核心组件)

🔍 5. 查看 kubelet 服务运行状态:

systemctl status kubelet

🔍 6. 查看 kubelet 日志(可按需拉取最近 1000 行):

journalctl -u kubelet -n 1000 > kubelet.log
# 或持续追踪日志
journalctl -xeu kubelet

三、容器运行时检查(docker / containerd)

🚦 7. 查看容器运行时服务状态:

systemctl status docker
systemctl status containerd

📄 8. 导出运行时日志:

journalctl -u docker > docker.log
journalctl -u containerd > containerd.log

🔎 9. 检查容器运行时是否卡住(可检测是否卡在某状态):

  • 对于 Docker
for c in $(docker ps -qa); do echo "Inspecting $c..."; docker inspect $c > /dev/null; done
  • 对于 containerd
crictl ps -q | while read id; do echo "Inspecting $id..."; crictl inspect $id > /dev/null; sleep 1; done

四、系统资源与内核状态排查(可能是资源耗尽)

💾 10. 检查磁盘空间(重点关注 /var /root /etc 等):

df -h | grep -v tmpfs > disk-space.log

🧠 11. 查看内存、负载使用情况:

top -n 1
free -m
uptime

📓 12. 查看系统级日志(如硬件故障、OOM 等):

tail -n 100 /var/log/messages

五、核心服务容器排查(api-server / etcd)

⚙️ 13. 检查核心服务是否仍运行中(根据容器运行时类型):

  • Kubernetes v1.18 使用 Docker:
docker ps | grep -E 'kube-apiserver|etcd'
  • Kubernetes v1.24+ 使用 containerd:
crictl ps | grep -E 'kube-apiserver|etcd'

六、监控视角辅助排查

📈 14. 使用 Prometheus 查询节点 Ready 状态(可搭配 Grafana):

kube_node_status_condition{condition="Ready", node="qfusion01", status="true"}
  • 若返回为空,表示该节点确实 NotReady
  • 可通过时间序列查看是否出现频繁波动。

七、网络与 DNS 层问题(可选补充)

🌐 15. 验证节点网络连通性:

ping <apiserver-ip>
curl -k https://<apiserver-ip>:6443/healthz

📡 16. 检查节点 DNS 是否解析异常:

cat /etc/resolv.conf
dig kubernetes.default.svc.cluster.local

✅ 总结建议

排查方向工具/命令重点关注项
节点状态kubectl get/describe nodeCondition 为 Ready=False 的原因
Kubeletsystemctl status / journalctl -u kubelet启动失败、证书错误、配置问题
容器运行时docker ps / crictl ps容器卡顿、Runtime 异常
系统资源df -h / free -m / uptime磁盘、内存是否耗尽
日志分析/var/log/messagesOOM、硬件错误、网络异常
核心服务crictl ps / docker psetcd / apiserver 是否运行
监控辅助Prometheus + Grafana节点健康指标趋势

如需自动化收集相关信息,我可为你定制诊断脚本或采集工具。是否需要进一步生成?

当然有,下面是对原有排查流程的进一步补充与增强建议,帮助你更全面定位 NotReady 节点的根因,尤其适用于复杂生产环境:


补充 20250707

🧩 补充一:Node Condition 详细含义与触发机制

Kubernetes 中的 NodeNotReady 多数由 Conditions 中的某项为 FalseUnknown 导致,常见影响项有:

Condition含义异常原因举例
Ready节点是否健康kubelet、runtime、网络、磁盘
MemoryPressure内存压力过大节点有 OOMKill、内存超限
DiskPressure磁盘满或 inode 枯竭/var/etc/kubernetes 分区写满
PIDPressure可分配 PID 耗尽有大量进程或内核限制过小
NetworkUnavailable网络插件未初始化CNI 异常、calico/flannel crash

🔍 查看这些状态:

kubectl get node <node-name> -o jsonpath='{.status.conditions[*]}'

📦 补充二:kubelet 常见异常原因表

异常类型日志特征原因说明
certificate expiredTLS handshake failed节点证书过期,可配合 kubeadm certs renew
unable to update node leasecontext deadline exceededapiserver 网络不通或服务挂了
container runtime is downfailed to get container statuscontainerd/docker 挂了
disk pressureeviction manager triggered磁盘 IO 写入失败,常见于数据盘满或 inode 用尽

🕸️ 补充三:网络组件(CNI)检查

如果 CNI 插件(如 Calico/Flannel)异常,也会导致节点 NotReady,需检查:

kubectl get pods -n kube-system -o wide | grep -E 'cni|calico|flannel'
kubectl logs <cni-pod> -n kube-system

可进一步排查:

ip link show
ip route
iptables -L -n -v

🔐 补充四:节点 kubelet 与 apiserver 证书校验

证书过期是 kubelet 无法与 apiserver 通信的常见原因:

openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text | grep Not

查看证书是否已过期,或节点与 apiserver 是否 TLS 不匹配。


🛠️ 补充五:节点驱逐/eviction 情况检查

节点可能是因为 Eviction(驱逐)而变为 NotReady,检查如下:

kubectl describe node <node-name> | grep -A 10 "Conditions"
kubectl get pod -A -o wide | grep <node-name>

也可查询是否被 eviction manager 驱逐过:

journalctl -u kubelet | grep -i eviction

☁️ 补充六:云平台(如公有云)节点元数据/宿主故障

  • 在公有云(如 AWS、阿里云、腾讯云)场景下,也可能是宿主机或云网络异常导致心跳丢失。

  • 建议排查:

    • 云平台控制台是否提示节点/主机宕机;
    • 安全组、NAT、VPC 网络是否异常;
    • 云监控(如 CloudMonitor、CloudWatch)告警项。

🔄 补充七:NotReady 节点恢复建议

当排查完问题后,可执行以下操作恢复节点:

# 重启 kubelet
systemctl restart kubelet

# 如需重启运行时
systemctl restart containerd   # 或 docker

# 节点恢复后确认状态
kubectl get nodes

如仍无效,可考虑执行:

# 驱逐所有 Pod
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

# 删除后自动重新注册
kubectl delete node <node-name>

⚠️ 前提是 kubelet 运行正常,且无密钥问题,否则会无法自动注册。


📌 最终建议:自动化 + 可观测性

  • Prometheus + Grafana:建立节点 CPU/内存/disk pressure 可视化告警。
  • Node Problem Detector:官方 DaemonSet,用于上报硬件/内核错误。
  • 日志集中化(如 ELK/Fluentd):便于快速搜索集群异常。

如果你希望我生成一个自动收集节点诊断信息的脚本(支持日志打包、本地资源统计等),我也可以为你定制。是否需要?

补充 20250708

以下是对你提出的 3 个实际故障场景的 排查补充说明,涵盖故障现象、原因分析、排查命令与建议,适用于日常运维与知识沉淀:


✅ 场景一:执行 df -h 卡顿(夯住)→ 原因:NAS 挂载超时或中断

🔍 故障现象:

  • 执行 df -h 卡死不返回,或挂载点响应极慢
  • 其他涉及磁盘相关的命令如 ls /mnt/xxxdu -sh 等同样卡顿

📌 常见原因:

  • NFS/NAS 挂载的远程存储失联(网络异常、存储挂掉)
  • 挂载未使用 soft/timeo 参数,导致默认无限期等待
  • 内核尝试访问丢失的挂载点文件,阻塞调用栈

🧪 排查命令:

mount | grep nfs
showmount -e <nas-ip>       # 测试 NAS 是否仍能导出
timeout 3 ls /mnt/nfsdata   # 检查是否卡顿
dmesg | tail -n 50          # 是否有 NFS timeout 报错

🛠 建议方案:

  • 优化挂载参数:soft,timeo=5,retrans=3 避免死等

  • 使用 df -h -x nfs 排除 NFS 影响

  • 建议使用 stat, findmnt 代替 df 进行快速诊断

  • 异常时重启 stale 挂载:

    umount -f -l /mnt/nfsdata
    

✅ 场景二:uptimedate 卡顿 → 原因:系统时间同步源异常(如 chronyd 卡顿)

🔍 故障现象:

  • 执行 uptimedate 卡住几秒甚至不返回
  • 有时伴随 systemd-timesyncdchronyd 异常
  • top/journalctl 启动缓慢

📌 常见原因:

  • 时间同步服务访问慢(NTP 源故障或 unreachable)
  • 读取 /proc/uptimegettimeofday() 卡顿(时间相关系统调用)
  • 容器或虚拟化场景中宿主机时间源漂移

🧪 排查命令:

chronyc tracking
chronyc sources -v
timedatectl status
systemctl status chronyd

🛠 建议方案:

  • 更换可达性更好的 NTP 服务器(如内网高可用 NTP)
  • 确保 chronyd 配置项 makestep, maxdistance 设置合理
  • 观察 /var/log/chrony/journalctl -u chronyd 中是否报错

✅ 场景三:节点扩容时 nginx 配置错误 → 引发服务路由异常

🔍 故障现象:

  • 新扩容节点加入后,服务发现失败或 404、502
  • 老节点正常,新节点通过 ingress-nginx 访问失败
  • kubectl get ep 显示 endpoint 正常,但 Nginx 无法转发

📌 常见原因:

  • nginx 配置中硬编码了 backend IP 或节点标签
  • ingress controller 中使用 nodePorthostNetwork 转发策略未匹配新节点
  • nginx.conf 缓存未更新,或未 reload
  • ingress 没有正确选择新节点的 pod(调度标签/selector 漏配)

🧪 排查命令:

cat /etc/nginx/nginx.conf
kubectl get nodes -o wide
kubectl get ingress -A
kubectl describe ingress <name> -n <ns>
kubectl get ep <svc-name> -n <ns> -o wide

🛠 建议方案:

  • 检查 Ingress Controller 是否启用了 --watch-ingress-without-class--publish-service

  • 配置 externalTrafficPolicy=Local 时确保 node 上有 pod 副本

  • 推荐使用 ingressClass 控制 ingress 对象与 nginx 匹配

  • 动态变更后 reload nginx:

    kubectl rollout restart deploy ingress-nginx-controller -n ingress-nginx
    

✅ 总结

场景原因排查重点修复建议
df -h 卡住NAS 网络中断mount, dmesg, timeout使用 soft,timeo,排除失败挂载
uptime 卡住时间同步阻塞chronyc, timedatectl替换 NTP 源,查看 chronyd 日志
nginx 路由异常ingress 配置未更新ep, logs, ingress describe确保 endpoints 更新,nginx reload

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值