死磕k8s之calico-nodeport

本文详细剖析了k8s使用Calico作为网络插件时,NodePort服务的工作原理,通过iptables四表五链展示了请求从外部到达Pod的完整路径,包括DNAT、SNAT操作及标签设置,揭示了网络流量在不同节点间的转发逻辑,有助于理解k8s网络架构。
摘要由CSDN通过智能技术生成

死磕k8s之calico-nodeport

序言:

本篇文章将要聚焦于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.然后就开始第一次的路由选择了

在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangshen023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值