Kubernetes如何使用Service.spec.externalTrafficPolicy =本地路由流量进行NodePort服务?

迈克·伦德奎斯特

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

  1. 节点(通过kube-proxy)根据本文的介绍kubectl explain Service.spec.externalTrafficPolicy更多信息,带有set的NodePort服务传入的数据包将路由到kube-proxy,然后kube-proxy将数据包路由到其运行的相应Pod。 Service.spec.externalTrafficPolicy=Local
    • kube-proxy网络文档进一步支持此理论,并添加了端点在服务的IPtable中添加一条规则,该规则通过kube-proxy将流量转发到节点。
  2. :服务更新从他们的IPtables endpoints,其中包含IP地址的豆荚,他们可以路线。此外,如果删除服务的标签选择器并编辑端点,则可以更改流量路由到的位置。

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

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

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

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

服务细目

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

  • 用户代理
  • iptables
  • ipvs

大多数集群都使用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

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

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

iptables -vnL -t nat KUBE-SERVICES

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

iptables -vnL -t nat KUBE-NODEPORTS

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

iptables -vnL -t nat | less

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法访问将externalTrafficPolicy作为“本地”的kubernetes服务

如果在kubernetes集群中将externalTrafficPolicy设置为Local,为什么无法访问服务

将“ externalTrafficPolicy”设置为“本地”时无响应

将外部流量从独立的Nginx服务路由到kubernetes Nodeport服务

尽管将externalTrafficPolicy设置为Local,但Kubernetes提供了一个内部源IP

使用Terraform创建的Kubernetes服务帐户导致“文档缺少路径:“ / spec / volumes / 0””副本集错误

使用clojure.spec值进行元编程?

使用clojure.spec进行强制转换是惯用的吗?

无法使用NodePort访问本地kubernetes集群中的服务

如何检查没有本地流量通过 vpn 路由到远程服务器

如何将流量从ssh服务器路由到我的本地计算机?

如何使用kubernetes NodePort从外部访问服务?

如何从.spec文件创建RPM?

如何订阅Spec对象(TextInputField)

如何从SRPM获取SPEC文件?

阅读器-如何从spec()更新col_spec对象

服务:v1.Service.Spec:v1.ServiceSpec.Selector:ReadString:期望“或n,但找到t

不了解如何使用GridLayout.spec()

如果使用本地流量策略,Kubernetes负载均衡器将停止服务流量

OpenShift BuildConfig Docker策略spec.output.to.name使用环境变量进行标记

如何使用NodePort在外部公开Kubernetes服务

如何将Angular 6+服务变量注入app-routing.module.spec.ts并测试路由器重定向

如何获得 Clojure Spec 作为对象?

如何从“spec”类的对象中提取组件?

使用clojure.spec绘制地图

在 Minitest 中使用 Spec DSL 的优势?

使用clojure.spec分解地图

如何将TCP流量从外部路由到Kubernetes集群内部的服务?

为什么 kubernetes v1.5 不能识别 service.spec.loadBalancerIp?