master1 ~]# route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0192.168.10.20.0.0.0 UG 10000 ens33
192.168.10.00.0.0.0255.255.255.0 U 10000 ens33
10.244.0.00.0.0.0255.255.255.0 U 000 cni0
10.244.1.010.244.1.0255.255.255.0 UG 000 flannel.110.244.2.010.244.2.0255.255.255.0 UG 000 flannel.110.244.3.010.244.3.0255.255.255.0 UG 000 flannel.110.244.4.010.244.4.0255.255.255.0 UG 000 flannel.1172.17.0.00.0.0.0255.255.0.0 U 000 docker0
node1 ~]# route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0192.168.10.20.0.0.0 UG 10000 ens33
192.168.10.00.0.0.0255.255.255.0 U 10000 ens33
10.244.3.00.0.0.0255.255.255.0 U 000 cni0
10.244.0.010.244.0.0255.255.255.0 UG 000 flannel.110.244.1.010.244.1.0255.255.255.0 UG 000 flannel.110.244.2.010.244.2.0255.255.255.0 UG 000 flannel.110.244.4.010.244.4.0255.255.255.0 UG 000 flannel.1172.17.0.00.0.0.0255.255.0.0 U 000 docker0
node2 ~]# route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0192.168.10.20.0.0.0 UG 10000 ens33
192.168.10.00.0.0.0255.255.255.0 U 10000 ens33
10.244.4.00.0.0.0255.255.255.0 U 000 cni0
10.244.0.010.244.0.0255.255.255.0 UG 000 flannel.110.244.1.010.244.1.0255.255.255.0 UG 000 flannel.110.244.2.010.244.2.0255.255.255.0 UG 000 flannel.110.244.3.010.244.3.0255.255.255.0 UG 000 flannel.1172.17.0.00.0.0.0255.255.0.0 U 000 docker0
如果数据包的目标是当前节点,这直接通过cni来进行处理
如果数据包的目标是其他节点,这根据路由配置,交给对应节点上的flannel.1网卡来进行处理,然后交给配套的flanneld对数据包进行封装
2.5.4、flannel.1子网内处理
当flannel.1接收到子网请求的时候,首先有flanneld进行数据包的解封。会从etcd中获取相关的网络细节配置。
为了避免每次请求都去etcd中获取相关的数据信息,所以会在第一次查询后,会在本地生成一个历史的查询记录。
master1 ~]# ip neigh | grep flannel
10.244.2.0 dev flannel.1 lladdr 4a:bb:65:9d:ed:4a PERMANENT
10.244.4.0 dev flannel.1 lladdr c6:19:ee:ca:00:80 PERMANENT
10.244.1.0 dev flannel.1 lladdr ee:08:31:5c:21:f6 PERMANENT
10.244.3.0 dev flannel.1 lladdr 9e:e4:ef:42:d0:b2 PERMANENT
注意:
这些条目记录,都是由flanneld来进行自动维护的,一旦节点丢弃或者关闭后,这里面的信息会自动更新的。
flannel的转发逻辑,对于节点上的数据包转发来说,它都在内核的fdb表中。
- 如果涉及到转发的会有相关的目标。
- 如果不涉及转发的会直接有对应的记录信息。
# 前面的mac地址是本地对应dst ip地址的信息。
~]# bridge fdb show | grep flannel.1
2a:3a:9a:e2:a7:cb dev flannel.1 dst 192.168.10.29 self permanent
c6:19:ee:ca:00:80 dev flannel.1 dst 192.168.10.30 self permanent
ee:08:31:5c:21:f6 dev flannel.1 dst 192.168.10.27 self permanent
d6:68:35:d1:25:dc dev flannel.1 dst 192.168.10.29 self permanent
9e:e4:ef:42:d0:b2 dev flannel.1 dst 192.168.10.29 self permanent
4a:bb:65:9d:ed:4a dev flannel.1 dst 192.168.10.28 self permanent
node1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0192.168.10.20.0.0.0 UG 10000 ens33
10.244.0.0192.168.10.26255.255.255.0 UG 000 ens33
10.244.1.0192.168.10.27255.255.255.0 UG 000 ens33
10.244.2.0192.168.10.28255.255.255.0 UG 000 ens33
10.244.3.00.0.0.0255.255.255.0 U 000 cni0
10.244.4.0192.168.10.30255.255.255.0 UG 000 ens33
172.17.0.00.0.0.0255.255.0.0 U 000 docker0
192.168.10.00.0.0.0255.255.255.0 U 10000 ens33
所有的路由转发,都不再使用flannel了,直接使用ens33接口进行路由转发了,这是因为我们没有涉及到跨网段的主机节点。
3.2.3、node1开启捉包
node1 ~]# tcpdump -i ens33 -nn host 10.244.4.118 and tcp port 80 # 10.244.4.118 是client-pod的IP地址
3.2.4、curl node1节点的pod
[root@master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
client-test 1/1 Running 0 88m 10.244.4.118 node2 <none> <none>
pod-test 1/1 Running 0 93m 10.244.3.57 node1 <none> <none>
master1 ~]# kubectl exec -it client-test -- /bin/bash
root@client-test:/# curl 10.244.3.57
3.2.5、分析捉包的效果
node1 ~]# tcpdump -i ens33 -nn host 10.244.4.118 and tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
19:11:53.781879 IP 10.244.4.118.38278 > 10.244.3.57.80: Flags [S], seq171017760, win 28200, options [mss 1410,sackOK,TS val 820186654 ecr 0,nop,wscale 7], length 019:11:53.782086 IP 10.244.3.57.80 > 10.244.4.118.38278: Flags [S.], seq824061379, ack 171017761, win 27960, options [mss 1410,sackOK,TS val 163227760 ecr 820186654,nop,wscale 7], length 019:11:53.782320 IP 10.244.4.118.38278 > 10.244.3.57.80: Flags [.], ack 1, win 221, options [nop,nop,TS val 820186655 ecr 163227760], length 019:11:53.782346 IP 10.244.4.118.38278 > 10.244.3.57.80: Flags [P.], seq1:76, ack 1, win 221, options [nop,nop,TS val 820186655 ecr 163227760], length 75: HTTP: GET / HTTP/1.119:11:53.782401 IP 10.244.3.57.80 > 10.244.4.118.38278: Flags [.], ack 76, win 219, options [nop,nop,TS val 163227760 ecr 820186655], length 019:11:53.783667 IP 10.244.3.57.80 > 10.244.4.118.38278: Flags [P.], seq1:236, ack 76, win 219, options [nop,nop,TS val 163227762 ecr 820186655], length 235: HTTP: HTTP/1.1200 OK
19:11:53.784106 IP 10.244.4.118.38278 > 10.244.3.57.80: Flags [.], ack 236, win 229, options [nop,nop,TS val 820186656 ecr 163227762], length 019:11:53.784402 IP 10.244.3.57.80 > 10.244.4.118.38278: Flags [P.], seq236:251, ack 76, win 219, options [nop,nop,TS val 163227762 ecr 820186656], length 15: HTTP
19:11:53.784640 IP 10.244.4.118.38278 > 10.244.3.57.80: Flags [.], ack 251, win 229, options [nop,nop,TS val 820186657 ecr 163227762], length 019:11:53.784762 IP 10.244.4.118.38278 > 10.244.3.57.80: Flags [F.], seq76, ack 251, win 229, options [nop,nop,TS val 820186657 ecr 163227762], length 019:11:53.784823 IP 10.244.3.57.80 > 10.244.4.118.38278: Flags [F.], seq251, ack 77, win 219, options [nop,nop,TS val 163227763 ecr 820186657], length 019:11:53.784953 IP 10.244.4.118.38278 > 10.244.3.57.80: Flags [.], ack 252, win 229, options [nop,nop,TS val 820186658 ecr 163227763], length 0
master1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0192.168.10.20.0.0.0 UG 10000 ens33
10.244.0.00.0.0.0255.255.255.0 U 000 cni0
10.244.1.0192.168.10.27255.255.255.0 UG 000 ens33
10.244.2.0192.168.10.28255.255.255.0 UG 000 ens33
10.244.3.0192.168.10.29255.255.255.0 UG 000 ens33
10.244.4.0192.168.10.30255.255.255.0 UG 000 ens33
172.17.0.00.0.0.0255.255.0.0 U 000 docker0
192.168.10.00.0.0.0255.255.255.0 U 10000 ens33
所有的路由转发,都不再使用flannel了,直接进行路由转发了
如果我们是第一次安装flannel的时候,使用这种模式,flannel.1网卡就不会生成了
3.3.3、node1开启捉包
node1 ~]# tcpdump -i ens33 -nn host 10.244.4.118 and tcp port 80
3.3.4、curl node1节点的pod
[root@master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
client-test 1/1 Running 0 88m 10.244.4.118 node2 <none> <none>
pod-test 1/1 Running 0 93m 10.244.3.57 node1 <none> <none>
master1 ~]# kubectl exec -it client-test -- /bin/bash
root@client-test:/# curl 10.244.3.57
3.3.5、分析捉包的效果
node1 ~]# tcpdump -i ens33 -nn host 10.244.4.118 and tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
19:28:29.204793 IP 10.244.4.118.40892 > 10.244.3.57.80: Flags [S], seq3152946712, win 28200, options [mss 1410,sackOK,TS val 821182078 ecr 0,nop,wscale 7], length 019:28:29.204904 IP 10.244.3.57.80 > 10.244.4.118.40892: Flags [S.], seq4239146046, ack 3152946713, win 27960, options [mss 1410,sackOK,TS val 164223183 ecr 821182078,nop,wscale 7], length 019:28:29.205023 IP 10.244.4.118.40892 > 10.244.3.57.80: Flags [.], ack 1, win 221, options [nop,nop,TS val 821182079 ecr 164223183], length 019:28:29.205081 IP 10.244.4.118.40892 > 10.244.3.57.80: Flags [P.], seq1:76, ack 1, win 221, options [nop,nop,TS val 821182079 ecr 164223183], length 75: HTTP: GET / HTTP/1.119:28:29.205095 IP 10.244.3.57.80 > 10.244.4.118.40892: Flags [.], ack 76, win 219, options [nop,nop,TS val 164223183 ecr 821182079], length 019:28:29.205498 IP 10.244.3.57.80 > 10.244.4.118.40892: Flags [P.], seq1:236, ack 76, win 219, options [nop,nop,TS val 164223183 ecr 821182079], length 235: HTTP: HTTP/1.1200 OK
19:28:29.205615 IP 10.244.3.57.80 > 10.244.4.118.40892: Flags [P.], seq236:251, ack 76, win 219, options [nop,nop,TS val 164223183 ecr 821182079], length 15: HTTP
19:28:29.205716 IP 10.244.4.118.40892 > 10.244.3.57.80: Flags [.], ack 236, win 229, options [nop,nop,TS val 821182080 ecr 164223183], length 019:28:29.205728 IP 10.244.4.118.40892 > 10.244.3.57.80: Flags [.], ack 251, win 229, options [nop,nop,TS val 821182080 ecr 164223183], length 019:28:29.205879 IP 10.244.4.118.40892 > 10.244.3.57.80: Flags [F.], seq76, ack 251, win 229, options [nop,nop,TS val 821182080 ecr 164223183], length 019:28:29.206565 IP 10.244.3.57.80 > 10.244.4.118.40892: Flags [F.], seq251, ack 77, win 219, options [nop,nop,TS val 164223184 ecr 821182080], length 019:28:29.206765 IP 10.244.4.118.40892 > 10.244.3.57.80: Flags [.], ack 252, win 229, options [nop,nop,TS val 821182081 ecr 164223184], length 0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)