【问题标题】:Kubernetes - Networking inside cluster -Kubernetes - 集群内的网络 -
【发布时间】:2020-06-10 00:14:13
【问题描述】:

我正在尝试了解 Kubernetes 网络,并在 GKE 网络文档中遇到了以下 sn-p...GKE - Networking。这说...

Kubernetes manages connectivity among Pods and Services using the kube-proxy component, which runs on each node. kube-proxy, which is not an in-line proxy, but an egress-based load-balancing controller, watches the Kubernetes API server and continually maps the ClusterIP to healthy Pods by adding and removing destination NAT (DNAT) rules to the node's iptables subsystem. When a container running in a Pod sends traffic to a Service's ClusterIP, the node selects a Pod at random and routes the traffic to that Pod.

我对此有两个问题...

  1. 假设有 5 个节点,其中 3 个节点是服务的一部分。现在,其中一个 pod(来自不属于服务的节点)想要与服务通信......它通过服务的 FQDN 找到服务..这个节点中的 kube-proxy 是否将流量发送到其中一个 pod服务的一部分?
  2. 另外,它说 kube-proxy 负载平衡整个 Pod 集的流量......这是怎么做到的?如果有一个节点进行流量路由,它会知道哪个节点是下一个获取流量的节点/pod。但是服务会随机选择节点(在服务中),对吗?

有人可以澄清一下吗?

提前致谢。

【问题讨论】:

  • 能否请您以不同的方式解释这两个问题?抱歉,我没完全理解

标签: kubernetes load-balancing


【解决方案1】:

请找到您问题的答案:

1) 此节点中的 kube-proxy 是否将流量发送到作为服务一部分的 pod 之一?

是的kube-proxy 会将流量路由到正确的 Pod。集群中的每个节点都会有 kube-proxy,每个 kube-proxy 都会编写 iptable 规则来在使用 serviceIP 时将流量重定向到 pod

2) 举个例子:

我们有 4 个节点集群和两个应用程序运行 2 个副本。

node1 -> application1_pod1
node2 -> application1_pod2
node3 -> application2_pod1
node4 -> application2_pod2 
(all 4 pods are running in different node)

现在 application1 想使用 application2 的服务名称与 application2 通信。

1. application1_pod1 may talk to application2_pod1
1.1 (once this is done, node1 iptables will route next traffic to application2_pod2)
2. application1_pod2 may talk to application2_pod1 (as the iptables of node2 is not aware of previous traffic in node1)
2.1 (once this is done, node2 iptables will route next traffic to application2_pod2)
3. application1_pod1 will talk to application2_pod2 (because of 1.1)
4. application1_pod2 will talk to application2_pod2 (because of 2.1)

所以在第 2 步结束时,到 application2_pod1 的流量为 100%,到 application2_pod2 的流量为 0%。 在第 4 步结束时,到 application2_pod2 的流量为 50%,到 application2_pod2 的流量为 50%

所以严格来说不是循环,而是最终循环。

服务IP如何转换为podIP?

ServiceIP 是虚拟IP。 PodIP 基本上是 containerIP(与一些正在运行的进程相关联)。 ServiceIP 以循环方式指向 PodIP。

kube-proxy 将在每个节点中编写如下 iptable 规则:(假设有 3 个 pod)

When destination is equal to serviceIP, then route to 

- PodIP1 with 33% probability, 
- PodIP2 with 33% probability and
- PodIP3 with 34% probability

为了实现这一点,kube-proxy 将监听来自 API 服务器的服务(基本上是端点)创建和更新。

【讨论】:

  • 感谢 Dinesh 的帮助。我一直在努力理解流程..当负载均衡器得到它时,它会发送到节点,并且该节点中的 kube-proxy 会将它发送到作为服务一部分的任何 pod。我想知道 kube-proxy 如何获取 ip 表(主要来自 API 服务器)?此处如何利用服务 ip 等。您能否解释或指出一些可以帮助我的文档?
  • 我添加了更多关于 serviceIP 到 podIP 转换的细节
【解决方案2】:

查看official doc这部分

kube-proxy 以 3 种不同的代理模式运行:

  1. 用户空间代理模式
  2. iptables 代理模式
  3. IPVS 代理模式

实现细节有所不同,但一般来说,kube-proxy 管理与服务和端点的连接。就像代理一样,它可以将不属于其节点的流量重定向到正确的流量。

所以...

1) 是的

2)您引用的文档专门针对 GKE。如果你查看k8s官方文档,你会发现只有kube-proxy in iptables mode chooses a backend at random.,其他模式将使用循环或用户指定的方法来调度流量。

【讨论】:

  • 感谢您的回复。我同意你的观点 2,GKE 使用 iptables 模式,因此随机选择节点,但我的问题是.. 负载平衡是如何发生的?例如......我有 3 个节点,节点 1 现在获得流量 kube-proxy 如何决定哪个 pod 应该获得流量..?如果有一个管理流量的节点,它知道发生了什么,但在这种情况下集群中的任何节点都可能被拾取,随机节点如何将流量路由到特定 pod,从而平衡负载?
  • 我们举一个例子,有 3 个 pod,节点 A 上有 1 个 pod,节点 B 上有 2 个 pod。您是在询问是否有流量进来并且节点是随机选择的(假设是均匀的),不会平衡吧?
  • 问题是,服务不是随机选择节点,而是后端是随机选择的。并且两个节点在自己的 iptables 中都有 3 个服务后端映射条目。所以流量分布均匀是没有问题的。
  • 肯,谢谢。创建了一个图表以便更好地理解...link
    如果你看到这张图,有 pod 的 node3 不是服务的一部分,而是集群的一部分。负载均衡器将流量发送到集群中的任何节点(不仅是服务的一部分)。想一想集群中的任何节点是否随机获取流量,并且 kube-proxy 从 API 服务器获取服务的 Pod ips 并路由流量....如何实现负载平衡? API 服务器在将服务端点返回给 kube-proxy 时是否会告诉哪个 pod 应该获得流量?
  • 负载均衡器知道它的服务,因此流量应该被引导到节点 1 或节点 2。然后 kube-proxy 可以平均分配流量。
猜你喜欢
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2019-05-04
  • 2019-01-17
  • 1970-01-01
  • 2020-07-31
  • 2019-12-01
  • 1970-01-01
相关资源
最近更新 更多