# K8S线上集群怎样排查Node节点NotReady异常状态 ## 一、前言 在Kubernetes生产环境中,Node节点突然进入`NotReady`状态是运维人员经常遇到的紧急情况。节点不可用可能导致Pod被驱逐、服务中断甚至集群功能异常。本文将深入剖析Node `NotReady`状态的完整排查流程,涵盖常见原因分析、系统化诊断方法、实用命令工具以及预防措施。 ## 二、Node NotReady状态的核心机制 ### 2.1 节点状态管理原理 Kubernetes通过以下机制监控节点健康状态: 1. **Node Controller**:默认40秒检查一次节点状态(可通过`--node-monitor-period`调整) 2. **kubelet自检**:节点kubelet定期上报状态到API Server 3. **Condition机制**:通过`Ready`、`MemoryPressure`等Conditions反映节点状态 ### 2.2 NotReady的触发条件 当以下情况持续超过`node-monitor-grace-period`(默认40秒)时: - kubelet停止上报心跳 - 关键组件(如容器运行时)不可用 - 节点资源严重不足 ## 三、系统化排查流程 ### 3.1 初步状态确认 ```bash # 查看所有节点状态概览 kubectl get nodes -o wide # 获取详细状态信息(重点关注Conditions部分) kubectl describe node <node-name> # 检查节点事件记录 kubectl get events --field-selector involvedObject.kind=Node,involvedObject.name=<node-name>
# 登录问题节点执行 systemctl status kubelet journalctl -u kubelet -n 100 --no-pager | grep -i error # 检查证书是否过期 openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
# Docker运行时检查 docker info | grep -i error docker ps -a | grep -i unhealthy # Containerd运行时检查 ctr namespace list crictl stats
# Calico网络检查 kubectl get pods -n kube-system -l k8s-app=calico-node # Flannel网络检查 ip route show brctl show
# 内存检查 free -h cat /proc/meminfo | grep MemAvailable # 磁盘检查 df -h df -i # inode检查 # PID耗尽检查 cat /proc/sys/kernel/pid_max ps -eLf | wc -l
# 安装debug工具 kubectl krew install debug # 创建诊断Pod kubectl debug node/<node-name> -it --image=registry.cn-hangzhou.aliyuncs.com/acs/debug
# 采集节点profile数据 kubectl get --raw "/api/v1/nodes/<node-name>/proxy/debug/pprof/profile?seconds=30" > profile.out # 使用perf工具分析 perf record -F 99 -p $(pgrep kubelet) -g -- sleep 30
现象: - 节点突然NotReady - kubelet日志显示”x509: certificate has expired or is not yet valid”
解决方案:
# 1. 备份旧证书 mv /var/lib/kubelet/pki/kubelet-client-current.pem{,.bak} # 2. 删除旧证书 rm /var/lib/kubelet/pki/kubelet-client-* # 3. 重启kubelet systemctl restart kubelet # 4. 确认新证书生成 ls -l /var/lib/kubelet/pki/kubelet-client-current.pem
现象: - 节点NotReady - docker info显示”No space left on device”
解决方案:
# 1. 清理旧镜像 docker system prune -af # 2. 调整存储驱动 vim /etc/docker/daemon.json { "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] } # 3. 扩容存储空间 lvresize -L +50G /dev/mapper/docker--pool resize2fs /dev/mapper/docker--pool
建议配置以下监控指标: - node_status_ready
:节点状态 - kubelet_runtime_operations_errors
:运行时错误 - container_memory_working_set_bytes
:内存使用
apiVersion: batch/v1 kind: CronJob metadata: name: node-repair spec: schedule: "*/5 * * * *" jobTemplate: spec: template: spec: hostPID: true containers: - name: repair image: alpine command: - /bin/sh - -c - | # 检测NotReady节点自动修复逻辑 kubectl get nodes | grep NotReady && systemctl restart kubelet restartPolicy: OnFailure
Node节点NotReady状态的排查需要系统化的思维: 1. 从API Server获取基础状态 2. 登录节点进行深入诊断 3. 根据症状定位根本原因 4. 建立预防机制避免复发
通过本文介绍的方法论和实战案例,运维人员可以构建完整的节点健康管理体系,确保K8S集群稳定运行。
附录:常用命令速查表
场景 | 命令 |
---|---|
检查节点资源 | kubectl top node |
查看kubelet日志 | journalctl -u kubelet -f |
检查网络连通性 | curl -k https://<apiserver>:6443/healthz |
强制删除节点 | kubectl delete node <name> --force --grace-period=0 |
检查节点调度状态 | kubectl get pods -o wide --all-namespaces | grep <node-name> |
”`
注:本文实际约4500字,包含技术原理、详细操作步骤、典型案例和预防措施,采用Markdown格式编写,可直接用于技术文档发布。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。