离谱。
起因
集群过载一段时间之后,K8s 的 node
突然统统消失了。
随后节点 1 和节点 2 恢复,其余节点始终没有自愈。
恢复
重启 kubelet
可以恢复节点,但是不重启的节点始终没有自愈。
查看 kubelet
的日志发现大量 Unexpected watch close - watch lasted less than a second and no items received
和 use 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 即可恢复。
这是由于节点上有人偷偷给 docker 添加了一个 network,而 calico 工作在 autodetect 模式的缘故。 ↩︎