如何通过Service.spec.externalTrafficPolicy =本地路由流量来Kubernetes NodePort服务?

时间:2020-02-04 23:53:06

标签: kubernetes kubernetes-service

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

  1. 节点(通过kube-proxy) 根据添加更多详细信息的kubectl explain Service.spec.externalTrafficPolicythis article,路由进入Service.spec.externalTrafficPolicy=Local的NodePort服务的数据包到kube-proxy,然后kube-proxy将数据包路由到其运行的相应pod。
    • kube-proxy networking documentation进一步支持这一理论,即端点在服务的IP表中添加了一条规则,该规则通过kube-proxy将流量转发到节点。
  2. 豆荚:服务从endpoints更新其IP表,其中包含它们可以路由到的豆荚的IP地址。此外,如果您删除服务的标签选择器和edit endpoints,则可以更改流量路由到的位置。

如果其中之一是正确的,那我一定是误会了。

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

2 个答案:

答案 0 :(得分:3)

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

NodePort Service不会更改服务的端点,NodePort允许外部流量通过节点上的端口进入Service。

服务中断

kube-proxy可以使用3 methods来实现服务从节点到目的地的转发。

  • 用户代理
  • iptables
  • ipvs

大多数集群都使用iptables,下面将对此进行介绍。我使用术语“转发”代替“路由”,因为服务使用Network Address Translation(或代理)来“转发”流量,而不是标准网络路由。

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

                                         / Pod (remote node)
Pod -- ClusterIP/Port -- KUBE-SVC-NAT  --  Pod
                                         \ Pod (remote node)

带有NodePort的服务与上面的服务相同,只是增加了一种通过节点将外部流量转发到群集中的方法。 kube-proxy管理一条附加规则,以监视外部流量并将其转发到相同的服务规则中。

Ext --     NodePort   \                / Pod (remote node)
                        KUBE-SVC-NAT --  Pod
Pod -- ClusterIP/Port /                \ Pod (remote node)

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

Ext --     NodePort   \                  Pod (remote node)
                        KUBE-SVC-NAT --  Pod (local)
Pod -- ClusterIP/Port /                  Pod (remote node)

iptables

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

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

iptables -vnL -t nat KUBE-SERVICES

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

iptables -vnL -t nat KUBE-NODEPORTS

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

iptables -vnL -t nat | less

答案 1 :(得分:0)

<块引用>

externalTrafficPolicy: Cluster 不会在 ClusterIP 上使用,尝试删除并应用它,它会工作