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的主要内容,如果未能解决你的问题,请参考以下文章
运维实战 kubernetes(k8s) 之 service