k8s 之 service ip

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s 之 service ip相关的知识,希望对你有一定的参考价值。

参考技术A

本文通过下面的例子,分析访问service ip的流程及iptables规则如何生效。

通过此yaml文件创建三个pod,一个client,两个nginx(监听在80端口),和一个service(将9999映射到nginx的80端口),实现到nginx后端的负载均衡。

查看创建的三个pod,两个nginx pod部署在worker1上,client部署在worker2上。

查看创建的service,可看到对应的两个endpoint。

service创建成功后,会在每个worker node上添加如下iptable规则

有如下三种访问service ip的场景,下面分别验证并分析iptables规则
a. 在client pod内部访问
b. 在worker node上访问
c. 在监听80端口的nginx pod中访问

a. 在client pod内部访问

然后进入nat表的处理,在PREROUTING 链上依次查找如下的规则

虽然POSTROUTING链上也有规则,但是都不匹配。
所以查找nat表的结果就是做了dnat。

b. 在worker node上访问

然后进入nat表的处理,依次查找如下的规则

在OUTPUT链上,匹配到dnat规则,将数据包的目的ip/port换成了10.1.139.84:80或者10.1.139.93:80,并且给数据包做了标记0x4000/0x4000。

根据MASQUERADE做snat时,源地址选择可以通过下面命令获取,在此例中,源ip为10.1.236.128

c. 在nginx pod访问
这里还要再分两种场景,负载均衡后的ip是发起访问的pod和不是发起访问的pod。比如 在nginx1 pod内部访问nginx的service服务,负载均衡后的ip为nginx1 pod的ip,或者为nginx2 pod的ip。

不同pod
在nginx1 pod内部访问nginx的service服务,负载均衡后的ip为nginx2 pod的ip。

将目的ip修改为10.1.139.93后,查找路由表时,发现只需要发给本worker上的calic6244c9748e即可。

此场景下的链接跟踪表项

同一个pod
在nginx1 pod内部访问nginx的service服务,负载均衡后的ip为nginx1 pod的ip。和上面的场景的区别是,不只做dnat,还要做snat。

将目的ip修改为10.1.139.84后,查找路由表时,发现只需要发给本worker上的calic6244c9748e。

但是在POSTROUTING处,还需要执行如下两条规则,因为数据包已经被打上标记0x4000/0x4000,所以在这里还要执行MASQUERADE,即snat

snat后的源ip可以通过如下命令获取

最后数据包经过dnat和snat后发给给本worker node上的calif67c1668c34。

此场景下的链接跟踪表项

以上是关于k8s 之 service ip的主要内容,如果未能解决你的问题,请参考以下文章

k8s实战之Service

运维实战 kubernetes(k8s) 之 service

运维实战 kubernetes(k8s) 之 service

k8s之service详解

Kubernetes(k8s)之Service(服务)

k8s之服务发现