K8s 节点断开连接后,本在运行的 Pod 会如何?
在工作节点与主节点断开连接后,工作节点上的 Pod 是什么状态,是否在继续运行?Kubernetes 控制器又在做什么?本文对此进行了实例研究,一一解答。
定义:在 Kubernetes 中,无法连接的节点称为隔离节点(partitioned node)。
为了具体了解,让我们创建一个隔离节点案例并了解其行为。
示例集群
示例集群具有一个主节点(master node)和 3 个工作节点(worker node)。这里创建了具有 2 个副本的 Nginx Deployment。这些副本在不同的节点上运行:kind-worker2 和 kind-worker3。图 1 展示了示例集群的状态:
图1:示例集群的状态
创建一个隔离节点
图2:创建一个隔离节点
Kubernetes 系统的表现如何?
工作节点(kind-worker2)被设置为 NotReady 状态,但 Pod 仍在继续运行,这是因为负责节点的 kube-controller-manager 的 node-controller 部分在等待 pod-eviction-timeout,这是确保在 Pod 删除之前该节点是无法访问的。
pod-eviction-timeout 默认设置为 5 分钟,可以在 kube-controller-manager 启动过程中进行修改。
图 3:主节点上的情况
隔离工作节点上运行的 Pod 会如何?
进入隔离工作节点,让我们看看发生了什么。从图 4 中,我们可以观察到 Pod 还在继续运行,这是因为 API server 无法与隔离节点的 Kubelet 通信来删除 Pod。同样,Kubelet 也无法控制运行哪些 Pod。
一旦隔离节点加入集群,Pod 就能删除。
总结
当节点断开连接后,很多事情都在背后发生,以下是简单的总结:
-
当节点变得不可访问时,主节点会将节点设置为“NotReady”状态。 -
主节点在执行任何操作之前会等待 pod-eviction-timeout。作为 kube-controller-manager 引导过程的一部分,默认情况下,pod-eviction-timeout 参数设置为 5 分钟。 -
在 pod-eviction-timeout 时间之后,主节点的隔离节点 Pod 处于“Terminating”状态,并会在不同节点上创建 Pod 新实例。 -
这些 Pod 会继续在隔离节点上运行。
翻译:Bach
文章来源:K8sMeetup社区
原文链接:http://mtw.so/5KcUrJ
推荐阅读