在Kubernetes 1.17中经常发生节点突然死亡的情况

请留意

请注意,本文的内容是基于独立调查的,不是Kubernetes的官方立场,因此请不要根据本文向相关方面提出疑问。同时,本文中提到的解决方案并不能保证问题会得到解决。

经过

从将稳定运行的 Kubernetes 集群升级到 1.17 版本开始,经常出现节点突然死亡的问题。

经过调查,该节点的操作系统仍然活跃,并能够响应PING请求,但在Kubernetes层面,与主控节点之间的通信已经中断,并输出以下日志。

kubelet.log E1013 20:38:49.531746    2094 controller.go:177] failed to update node lease, error: Put https://172.20.0.1:2040/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/10.129.108.224?timeout=10s: context deadline exceeded (Client.Timeout exceeded while awaiting headers)
kubelet.log E1013 20:38:50.140112    2094 kubelet_node_status.go:402] Error updating node status, will retry: error getting node "**.**.**.**": Get https://172.20.0.1:2040/api/v1/nodes/10.129.108.224?resourceVersion=0&timeout=10s: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
kubelet.log E1013 20:38:53.975263    2094 controller.go:177] failed to update node lease, error: Put https://172.20.0.1:2040/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/10.129.108.224?timeout=10s: read tcp 172.20.0.1:6999->172.20.0.1:2040: use of closed network connection

推测认为的原因

如果由于某种原因导致主节点和节点之间的通信断开,通常会尝试重新连接,但在描述Kubernetes的Go语言中存在错误,可能会导致通信重试失败。

请以中文原生态的方式解析以下内容,仅需要一种选项:

“请参考以下链接:https://github.com/kubernetes/kubernetes/issues/87615”

影响范围

在Kubernetes 1.16、1.17、1.18版本中似乎容易出现此问题,尤其是在1.17版本中频繁发生。

为困扰的事情

由于有了Kubernetes,我们可能会认为只要有一个节点挂掉并不需要太在意,但是在这种情况下确实存在一个问题。问题在于,这个节点在主节点看来已经挂了,但实际上它还活着。例如,如果有一个需要在该节点上运行的Pod,而主节点检测到了该节点的断连,就会尝试在另一个节点上启动Pod。但是由于该节点上的Pod仍在运行,就会导致Pod被重复启动的情况发生。在这种情况下,如果Pod执行了锁定PV文件等行为(例如数据库),后启动的Pod就会在获取锁定失败并无法正确启动。此外,通过服务到原始Pod的通信也被主节点排除在外,最终导致无法访问Pod的状态。

顺便说一下,相应节点的Pod即使与主节点断开连接,也不会自动销毁。在过去的Kubernetes版本中,会发生这样的行为,但是从1.15版本开始,不再发生自动销毁。

在这种情况下,直到API服务器重新与kubelet建立通信之前,不能删除Pod。在删除被调度之前,被删除的Pod将继续在被分离的节点上运行。
在Kubernetes 1.5之前的版本中,节点控制器强制删除了API服务器无法访问的这些Pod。然而,从1.5版本开始,节点控制器不再强制删除,直到确认Pod在集群中停止。

处理

通过将Kubernetes升级到1.19版本,可能会升级Go版本,从而有可能解决这个问题。

强烈推荐您升级至最新的IBM Cloud Kubernetes Service版本1.19,该版本已经可供使用。

然而,在IBM云上运行的Red Hat OpenShift集群使用的Kubernetes还不支持1.19版本。

如果无法进行版本升级,可以通过重新启动节点来恢复状态。

广告
将在 10 秒后关闭
bannerAds