kube-proxy 无法到达 master 时如何表现?

How does kube-proxy behave when it can't reach the master?

根据我对 Kubernetes 的了解,如果 master(s) 死亡,worker 应该仍然能够正常运行 (),尽管不会发生新的调度。

然而,当 master 也可以安排 worker pods 时,我发现情况并非如此。以一个 2 节点集群为例,其中一个节点是 master,另一个是 worker,master 已经去除了污点:

如果我关闭 master 和 docker exec 到 worker 的其中一个容器中,我可以看到:

nc -zv ip-of-pod 80

成功,但是

nc -zv ip-of-service 80

失败一半的时间。 Kubernetes版本为v1.15.10,kube-proxy使用iptables模式

我猜测是因为worker节点上的kube-proxy无法连接到apiserver,所以不会从iptables规则中移除master节点。

问题:

  1. kube-proxy 不会停止路由到主节点上的 pods 是预期的行为,还是有什么 "broken"?
  2. 是否有任何解决方法可用于此类设置以允许工作节点仍然正常运行?

我意识到最好的办法是将 CP 节点分开,但这对我目前正在做的事情来说不可行。

Kubernetes 中没有任何固有的东西会导致这种情况。 master 节点角色仅适用于人类,如果您删除了污点,则节点只是普通节点。也就是说,请记住有关日程安排和资源请求的通常规则适用,因此如果您的 pods 不适合那么事情就不会被安排。您的 Kubernetes 部署系统可能会在控制平面节点周围设置更专门的防火墙规则或类似规则,但这将取决于该系统。

一旦您删除了污点,kubernetes 调度器就不需要任何容忍度来在您的主节点上调度 pods。因此,它与带有控制平面组件 运行 的工作节点一样好,您还可以在此节点上 运行 您的工作负载 pods(尽管这不是推荐的做法)。

Kube-proxy (https://kubernetes.io/docs/concepts/overview/components/#kube-proxy) 是部署在集群所有节点上的组件,它处理与您的 pods 的网络和路由连接。因此,即使您的主节点已关闭,kube-proxy 仍然可以在工作节点上正常工作,并且它将流量路由到工作节点上的 pods 运行ning。

如果您所有的 pods 都在工作节点中 运行ning(它们仍在运行并且 运行ning),那么 kube-proxy 将继续将流量路由到您的 pods 甚至通过服务。

Is it expected behaviour that kube-proxy won't stop routing to pods on master nodes, or is there something "broken"?

Are any workarounds available for this kind of setup to allow the worker nodes to still function correctly?

集群主机扮演集群节点中各种活动的决策者角色。这可以包括调度工作负载、管理工作负载的生命周期、扩展等。每个节点都由主组件管理,并包含 运行 pods 所需的服务。节点上的服务通常包括 kube-proxy、container 运行time 和 kubelet。

kube-proxy 组件在节点上执行网络规则,并帮助 kubernetes 管理 Pods 和服务之间的连接。此外,kube-proxy 充当基于出口的负载平衡控制器,持续监控 kubernetes API 服务器并基于它不断更新节点的 iptables 子系统。

简单来说,主节点只是知道一切,并负责创建路由规则列表以及基于节点的添加或删除等。kube-proxy扮演着一种执行者的角色,它负责与主人核对,同步信息并执行列表上的规则。

如果主节点(API服务器)宕机,集群将无法响应API命令或部署节点。如果另一个主节点不可用,则没有其他可用的人可以指示工作节点更改工作分配,因此他们将继续执行早先由主节点调度的操作,直到主节点返回并给出不同的指示。与其内联,kube-proxy 也不能通过与 master 同步来获取最新规则,但是它不应该停止路由并继续处理网络和路由功能(使用在 master 之前确定的早期 iptable 规则节点出现故障),这将允许与您的 pods 进行网络通信,前提是工作节点中的所有 pods 仍在运行并且 运行ning.

基于单一主节点的架构不是生产的首选部署架构。考虑到弹性和可靠性是 kubernetes 的主要业务目标之一,建议将基于 HA 集群的架构作为最佳实践来避免单点故障。