您好,登录后才能下订单哦!
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。