Kubernetes NodePort 服务如何使用 Service.spec.externalTrafficPolicy=Local 路由流量?

use*_*074 2 kubernetes kubernetes-service

关于 NodePort 服务如何路由流量,似乎有两种相互矛盾的解释。服务可以将流量路由到两者之一,而不是两者:

  1. 节点(通过 kube-proxy)根据kubectl explain Service.spec.externalTrafficPolicy这篇增加了更多细节的文章,使用Service.spec.externalTrafficPolicy=Localset传入 NodePort 服务的数据包被路由到 kube-proxy,然后将数据包路由到其运行的相应 pod。
    • 这个kube-proxy 网络文档进一步支持这一理论,并补充说端点在服务的 IPtable 中添加了一个规则,通过 kube-proxy 将流量转发到节点。
  2. :服务更新从他们的IPtables endpoints,其中包含IP地址的豆荚,他们可以路线。此外,如果您删除服务的标签选择器并编辑端点,您可以更改流量路由到的位置。

如果其中一个是正确的,那么我一定是误解了一些东西。

  • 如果服务路由到节点,那么为什么我可以在endpoints不破坏 IPtables 的情况下进行编辑?
  • 如果服务路由到pods,那么为什么服务会在Service.spec.externalTrafficPolicy设置时遇到路由到节点的麻烦?

Mat*_*att 5

服务是由管理的虚拟地址/端口kube-proxy。服务将流量转发到其关联的端点,这些端点通常是 pod,但正如您提到的,可以设置为任何目标 IP/端口。

NodePort服务不改变服务的端点侧,所述NodePort允许外部交通成服务经由节点上的端口。

服务分解

kube-proxy可以使用3 种方法来实现服务从 Node 到目的地的转发。

  • 用户代理
  • iptables
  • ipvs

大多数集群使用 iptables,这就是下面描述的内容。我使用术语“转发”而不是“路由”,因为服务使用网络地址转换(或代理)来“转发”流量而不是标准网络路由。

该服务ClusterIP是由 管理的虚拟实体kube-proxy。此地址/端口组合在集群中的每个节点上都可用,并将任何本地(pod)服务流量转发到端点 IP 和端口。

                                         / Pod (remote node)
Pod -- ClusterIP/Port -- KUBE-SVC-NAT  --  Pod
                                         \ Pod (remote node)
Run Code Online (Sandbox Code Playgroud)

带有 a 的服务与NodePort上面相同,增加了一种通过 Node.js 将外部流量转发到集群的方法。kube-proxy管理一个额外的规则来监视外部流量并将其转发到相同的服务规则中。

Ext --     NodePort   \                / Pod (remote node)
                        KUBE-SVC-NAT --  Pod
Pod -- ClusterIP/Port /                \ Pod (remote node)
Run Code Online (Sandbox Code Playgroud)

externalTrafficPolicy=Local设置使 NodePort 服务使用本地 Pod 来为传入流量提供服务。这避免了不需要重写数据包源(通过 NAT)的网络跃点。这会导致真正的网络 IP 到达为连接提供服务的 pod,而不是集群节点之一作为源 IP。

Ext --     NodePort   \                  Pod (remote node)
                        KUBE-SVC-NAT --  Pod (local)
Pod -- ClusterIP/Port /                  Pod (remote node)
Run Code Online (Sandbox Code Playgroud)

iptables

我建议尝试为主机上的服务或节点端口跟踪从源到目标的连接。它需要一些 iptables 知识,但我认为这是值得的

列出将被转发的所有服务 ip/端口:

iptables -vnL -t nat KUBE-SERVICES

列出将被转发的所有节点端口:

iptables -vnL -t nat KUBE-NODEPORTS

一旦你有了规则,你就可以跳过KUBE-SVC-XXX完整输出中的“目标”规则。

iptables -vnL -t nat | less