先把当时的情况摆出来。自建 K8s 1.27 集群跑在 VMware 上,几台 worker 重启后 kubelet 报 Failed to register node,journalctl -u kubelet 里能看到 Node 的 InternalIP 每次都不一样,节点在 kubectl get nodes 里反复出现又消失。

把日志和配置对完,能解释这个现象的基本就这几处。节点有多个网卡,kubelet 按默认顺序挑到了 DHCP 分配的那个浮动地址。也可能是云主机的辅助网卡后插上,路由表顺序变了,kubelet 选的出口地址跟着变。

还有一种情况,kubelet 的 --node-ip 参数没写死,每次重启都重新探测。另外,节点注册用的 hostname 重名,apiserver 把两条记录当成同一个。

先看 kubelet 实际选中的地址和网卡

journalctl -u kubelet | grep -i 'node ip'

接着把节点出口地址固定下来写进 kubelet 配置

grep -n node-ip /var/lib/kubelet/kubelet-config.yaml

然后重启 kubelet 再删掉旧的 Node 对象让节点重新注册

kubectl delete node node-03 && systemctl restart kubelet

等前面都确认过,再核对注册后的地址是否固定

kubectl get node node-03 -o wide

怎么算真的好了,看的是同一批现象。kubectl get nodes 里 node-03 保持 Ready 超过十分钟不再抖动,-o wide 显示的 InternalIP 与网卡固定地址一致。

容易忽略的是,多网卡机器必须显式指定 --node-ip,靠自动探测在 DHCP 环境里迟早会漂;改完记得同步 kube-proxy 的 --bind-address。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189