死磕k8s之calico-nodeport
-
- 序言:
- 我的环境
- 注意
- 开始发请求到nodeport
- 到达work节点1
-
-
- 1.首先会到达raw的PREROUTING,包的流向如下
- 2.然后到达mangle的PREROUTING,包的流向如下
- 3.然后到了重要表nat的PREROUTING,在PREROUTING一般对包做DNAT操作,包的流量如下:
- 4.然后就开始第一次的路由选择了
- 5.由于匹配到了路由信息,所以此时会走的链是mangle的FORWARD,但是该表没有对它作任何操作
- 6.接下来看看filter表的FORWARD
- 7.然后是到了mangle的POSTROUTING,然而该表没有任何规则
- 8.接下来到了nat表的POSTROUTING链,nat表重要的是做了一个重要的操作SNAT
- 9.此时包的路径分析基本已经结束了,因为包已经走到pod里面去了。
- 10.因为我们此时我们的pod正好在请求的ip的节点上,如果pod在work节点2上包的走向又会怎么样呢?
- 11.现在就要从上面第3条的nat的PREROUTING开始继续分析
- 12.然后会经历一波路由策略
- 13.mangle的FORWARD链没有任何规则,忽略
- 14.filter的FORWARD链没有重要的规则,但是有一条需要注意,其他的和上面的流程分析一致
- 15.mangle的POSTROUTING没有任何规则,故忽略
- 16.接下来nat的POSTROUTING会做一个SNAT操作
- 17.此时包就从tunl0通道留到work节点2的ens192网卡上了。又要走一遍work节点2上的四表五链。下面是我的抓包信息,可以佐证:
- 18.raw表的PREROUTING和上面的分析一致,没有操作。mangle表的PREROUTING此时也没有什么操作。nat表的PRESOUTING上上面分析的有差别了,就会匹配到
- 19.然后会做路由决策
- 20.接下来会走到mangle的FORWARD表,但是没有规则可匹配。nat的FORWARD也没有什么好分析的,该包也直接进入mangle的POSTROUTING,但是没有规则。然后到了nat的POSTROUTING,此时需要注意一点的是:
-
- 简单总结
序言:
本篇文章将要聚焦于k8s在使用calico作为网络插件的时候,当pod以nodeport的形式暴露出来,我们以集群节点的ip加端口的形式访问的时候,流量如何转发到具体的pod,流量经过了哪些路由和哪些iptables链。如集群还没准备好,请参考[死磕k8s之calico-环境准备]。
我的环境
nginx pod信息
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6799fc88d8-wfztd 1/1 Running 0 3h32m 192.168.231.70 shen-k8s-node-1 <none> <none>
nodeport信息
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx NodePort 10.101.14.7 <none> 8080:32220/TCP 2d1h app=nginx
注意
接下来的分析主要基于该表的路径
开始发请求到nodeport
我目前nginx的pod在work节点1上面,为了减少分析过程,我在和k8s同网段的其他机器10.0.0.53上面请求work节点1的ip加端口
curl 10.0.0.51:32220
到达work节点1
1.首先会到达raw的PREROUTING,包的流向如下
raw的PRESOUTING相对比较简单,在这里没有匹配到任何的规则
2.然后到达mangle的PREROUTING,包的流向如下
对新来的包来说也没有匹配到任何规则,但是第二条规则会对以后的包做一个放行,效率更高
3.然后到了重要表nat的PREROUTING,在PREROUTING一般对包做DNAT操作,包的流量如下:
此表的规则路径稍微复杂一些了,第三条规则匹配到了我们的请求的目标端口32220,注意下第4条规则,会给包打上0x4000/0x4000标签。最后到了第7条做了一个比较重要的dnat操作,此时请求的包的源地址还是10.0.0.53,但是包的目的地址会变成192.168.231.70,并且目标端口也会换成我们暴露的容器端口80。192.168.231.70正是pod nginx-6799fc88d8-wfztd 的地址。因为我们这里只有一个pod,所以只会匹配到这一条dnat规则,如果我们有多个pod的话,会按照该规则上的概率随机匹配到一条dnat规则。大家由此就会联想到service的负载均衡策略也可以这么做。
4.然后就开始第一次的路由选择了
上