use*_*074 2 kubernetes kubernetes-service
关于 NodePort 服务如何路由流量,似乎有两种相互矛盾的解释。服务可以将流量路由到两者之一,而不是两者:
kubectl explain Service.spec.externalTrafficPolicy和这篇增加了更多细节的文章,使用Service.spec.externalTrafficPolicy=Localset传入 NodePort 服务的数据包被路由到 kube-proxy,然后将数据包路由到其运行的相应 pod。
endpoints,其中包含IP地址的豆荚,他们可以路线。此外,如果您删除服务的标签选择器并编辑端点,您可以更改流量路由到的位置。如果其中一个是正确的,那么我一定是误解了一些东西。
endpoints不破坏 IPtables 的情况下进行编辑?Service.spec.externalTrafficPolicy设置时遇到路由到节点的麻烦?甲服务是由管理的虚拟地址/端口kube-proxy。服务将流量转发到其关联的端点,这些端点通常是 pod,但正如您提到的,可以设置为任何目标 IP/端口。
甲NodePort服务不改变服务的端点侧,所述NodePort允许外部交通成服务经由节点上的端口。
kube-proxy可以使用3 种方法来实现服务从 Node 到目的地的转发。
大多数集群使用 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 知识,但我认为这是值得的
列出将被转发的所有服务 ip/端口:
iptables -vnL -t nat KUBE-SERVICES
列出将被转发的所有节点端口:
iptables -vnL -t nat KUBE-NODEPORTS
一旦你有了规则,你就可以跳过KUBE-SVC-XXX完整输出中的“目标”规则。
iptables -vnL -t nat | less
| 归档时间: |
|
| 查看次数: |
2654 次 |
| 最近记录: |