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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值