一次 K8s 集群修复日志

离谱。

起因

集群过载一段时间之后,K8s 的 node 突然统统消失了。

随后节点 1 和节点 2 恢复,其余节点始终没有自愈。

恢复

重启 kubelet 可以恢复节点,但是不重启的节点始终没有自愈。

查看 kubelet 的日志发现大量 Unexpected watch close - watch lasted less than a second and no items receiveduse of closed network connection 的错误日志,貌似kubelet 用了死掉的链接。

(1.17) Kubelet won’t reconnect to Apiserver after NIC failure (use of closed network connection) 来看,这还是个和 Golang 有关的 bug……

期间由于部分节点提前恢复,导致大量的 pod 调度到其上,导致资源占满,DaemonSet calico 的 pod 始终 Pending,kill 掉大量 pod 即可恢复。

随后发现 calico Unhealthy,网络依旧存在问题。

通过 calicoctl node status 发现节点 2 的 IP 因为神秘原因1 错误,并非 eth0 的 IP。

export ETCD_KEY_FILE="/etc/kubernetes/ssl/etcd-key.pem"
export ETCD_CERT_FILE="/etc/kubernetes/ssl/etcd.pem"
export ETCD_CA_CERT_FILE="/etc/kubernetes/ssl/ca.pem"
export ETCD_ENDPOINTS="https://IP1,https://IP2,https://IP3:2379"
calicoctl get node -o yaml > calico-node2.yaml
# 修正 calico-node2.yaml
calicoctl replace -f ./calico-node2.yaml

修复 IP 即可恢复。


  1. 这是由于节点上有人偷偷给 docker 添加了一个 network,而 calico 工作在 autodetect 模式的缘故。 ↩︎