关于NodePort服务如何路由流量似乎有两个相互矛盾的解释。服务可以将流量路由到两者之一,而不是两者:
kubectl explain Service.spec.externalTrafficPolicy
和更多信息,带有set的NodePort服务传入的数据包将路由到kube-proxy,然后kube-proxy将数据包路由到其运行的相应Pod。 Service.spec.externalTrafficPolicy=Local
endpoints
,其中包含IP地址的豆荚,他们可以路线。此外,如果删除服务的标签选择器并编辑端点,则可以更改流量路由到的位置。如果其中之一是对的,那我一定是误会了。
endpoints
不破坏IPtables的情况下进行编辑?Service.spec.externalTrafficPolicy
?甲服务是由管理的虚拟地址/端口kube-proxy
。服务将流量转发到其关联的终结点,这些终结点通常是pod,但是正如您提到的,可以将其设置为任何目标IP /端口。
甲NodePort服务不改变服务的端点侧,所述NodePort允许外部交通成服务经由节点上的端口。
kube-proxy
可以使用3种方法来实现服务从节点到目标的转发。
大多数集群都使用iptables,下面将对此进行介绍。我使用术语“转发”代替“路由”,因为服务使用网络地址转换(或代理)来“转发”流量,而不是标准网络路由。
该服务ClusterIP
是由管理的虚拟实体kube-proxy
。此地址/端口组合在群集中的每个节点上都可用,并将任何本地(pod)服务流量转发到端点IP和端口。
/ Pod (remote node)
Pod -- ClusterIP/Port -- KUBE-SVC-NAT -- Pod
\ Pod (remote node)
具有a的服务与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知识,但我认为这是值得的
列出将转发的所有服务ip /端口:
iptables -vnL -t nat KUBE-SERVICES
列出将要转发的所有节点端口:
iptables -vnL -t nat KUBE-NODEPORTS
一旦有了规则,就可以KUBE-SVC-XXX
在完整输出中跳过“目标”规则。
iptables -vnL -t nat | less
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句