节点notready时,第一反应是检查kubelet状态:执行systemctl status kubelet确认是否active(running),若为inactive(dead)或failed则服务已崩;若运行但仍notready,需用journalctl -u kubelet --since "5 minutes ago" | grep -i "error|fail|timeout"分析日志,重点排查apiserver连接超时、证书过期及cgroup初始化失败。

节点NotReady时,kubelet状态怎么查
节点变成 NotReady,第一反应不是重启,而是确认 kubelet 是否还在工作。它一停,节点就“失联”,所有依赖心跳的机制(比如控制器同步、探针上报)都会断。
直接登录节点执行:systemctl status kubelet
看输出里的 Active: 行——如果是 inactive (dead) 或 failed,说明服务已崩;如果显示 active (running) 但节点仍是 NotReady,就要继续看日志:
-
journalctl -u kubelet --since "5 minutes ago" | grep -i "error\|fail\|timeout"——重点关注连接 apiserver 超时、证书过期、cgroup 初始化失败这几类错误 - 常见坑:kubelet 启动后无法注册到 apiserver,往往是因为
/var/lib/kubelet/pki/kubelet-client-current.pem过期,或ca.crt被误删;此时kubeadm certs renew无效,必须用kubeadm init phase certs all --config=...重建客户端证书
Go写的自动化恢复脚本该监听什么事件
不要轮询 kubectl get nodes,太重且延迟高。Kubernetes 提供了 Node 的 watch 接口,Go 客户端可以直接监听 NodeCondition 变化。
关键点是只关注 Ready condition 的 Status: "False" 和 Reason: "KubeletNotReady" 这类明确信号,避免被临时网络抖动误触发:
- 用
corev1.NodeConditionType常量比硬写字符串更安全,防止 typo 导致漏判 - 监听时加
ResourceVersion断点续传,否则重启脚本会丢失中间事件 - 不要一看到
NotReady就立刻执行修复——加一个 90 秒冷却窗口,用time.AfterFunc延迟触发,排除短暂 flapping
自动重启kubelet前要检查哪些依赖
盲目 systemctl restart kubelet 可能失败,甚至让节点更糟。Go 脚本在发命令前必须验证三件事:
- 确认
/etc/kubernetes/kubelet.conf存在且可读,否则重启后 kubelet 无法加载配置 - 检查
/var/lib/kubelet/pki/下的证书是否都在,尤其kubelet-client-current.pem和kubelet-server-current.pem;缺失任一,重启后会卡在 TLS handshake failed - 验证
cgroups v2是否启用(cat /proc/sys/fs/cgroup_enable),若为unified但 kubelet 配置仍用--cgroup-driver=systemd,会启动失败
这些检查用 os.Stat 和 ioutil.ReadFile 就能完成,比调 shell 命令更可控。
恢复后如何验证Pod是否真正接管
脚本执行完 systemctl restart kubelet,不能只看 kubectl get nodes 变成 Ready 就算成功。很多情况下 kubelet 虽然起来了,但 Pod 没法调度或拉不起来镜像。
必须等至少两个信号同时满足才认为恢复完成:
-
kubectl get node <node-name> -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}'</node-name>返回True -
kubectl get pods -A --field-selector spec.nodeName=<node-name> --no-headers | wc -l</node-name>大于 0,且其中至少一个 Pod 的STATUS是Running(不是Pending或ImagePullBackOff)
这两个条件缺一不可——前者只说明 kubelet 上线,后者才代表节点真正重新进入调度循环。漏掉第二步,可能掩盖镜像仓库不可达或 PV 绑定失败这类深层问题。











