calico IPIP 同节点通信

网友投稿 310 2022-09-11

calico IPIP 同节点通信

calico IPIP MODE 同节点通信

环境信息

[root@master ~]# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIMEmaster.whale.com Ready control-plane,master 137m v1.23.5 192.168.0.80 CentOS Linux 7 (Core) 5.4.193-1.el7.elrepo.x86_64 docker://20.10.16node1.whale.com Ready 137m v1.23.5 192.168.0.81 CentOS Linux 7 (Core) 5.4.193-1.el7.elrepo.x86_64 docker://20.10.16node2.whale.com Ready 137m v1.23.5 192.168.0.82 CentOS Linux 7 (Core) 5.4.193-1.el7.elrepo.x86_64 docker://20.10.16

创建 deployment

kubectl create deployment cni-test --image=burlyluo/nettoolbox --replicas=3

确定 node1 节点上的两个 pod,用于测试

pod1 10.244.42.65pod2 10.244.42.66

[root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScni-test-777bbd57c8-4bqtf 1/1 Running 0 80s 10.244.103.65 node2.whale.com cni-test-777bbd57c8-4lnwt 1/1 Running 0 80s 10.244.42.65 node1.whale.com cni-test-777bbd57c8-8zgs9 1/1 Running 0 60s 10.244.42.66 node1.whale.com

查看 pod1 对应 root namespace 网卡

[root@master ]# kubectl exec -it cni-test-777bbd57c8-4lnwt -- ethtool -S eth0NIC statistics: peer_ifindex: 7 rx_queue_0_xdp_packets: 0 rx_queue_0_xdp_bytes: 0 rx_queue_0_xdp_drops: 0[root@node1 ]# ip link show | grep ^77: cali59330ed5cb6@if4: mtu 1480 qdisc noqueue state UP mode DEFAULT group default

查看 pod1 内部路由表

注意

通过 ifconfig 查看 ip 地址,我们可以看到子网掩码为 32位,那么我们就可以确定,pod 出来是需要 走三层路由,因为 32位的掩码它不跟任何 ip 属于同一网段。通过 route 查看路由表,我们可以确定出去的任何地址都需要经过 网关为 169.254.1.1 的这个网关。

这里暂不解释 这个地址,我们一会抓包分析,这个地址其实是 calico 给我们生成用于 Proxy-ARP功能的地址。

[root@master ]# kubectl exec -it cni-test-777bbd57c8-4lnwt -- ifconfig eth0eth0 Link encap:Ethernet HWaddr D2:2F:85:72:CC:97 inet addr:10.244.42.65 Bcast:0.0.0.0 Mask:255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU:1480 Metric:1 RX packets:5 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:446 (446.0 B) TX bytes:0 (0.0 B)[root@master ]# kubectl exec -it cni-test-777bbd57c8-4lnwt -- route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 169.254.1.1 0.0.0.0 UG 0 0 0 eth0169.254.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0

查看 pod2 对应 root namespace 网卡

[root@master ]# kubectl exec -it cni-test-777bbd57c8-8zgs9 -- ethtool -S eth0NIC statistics: peer_ifindex: 8 rx_queue_0_xdp_packets: 0 rx_queue_0_xdp_bytes: 0 rx_queue_0_xdp_drops: 0[root@node1 ]# ip link show | grep ^88: cali072e3706f4d@if4: mtu 1480 qdisc noqueue state UP mode DEFAULT group default

查看 pod2 内部路由表

内容和 pod1 基本一致

[root@master ]# kubectl exec -it cni-test-777bbd57c8-8zgs9 -- ifconfig eth0eth0 Link encap:Ethernet HWaddr 56:D8:AC:4F:02:93 inet addr:10.244.42.66 Bcast:0.0.0.0 Mask:255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU:1480 Metric:1 RX packets:5 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:446 (446.0 B) TX bytes:0 (0.0 B)[root@master ]# kubectl exec -it cni-test-777bbd57c8-8zgs9 -- route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 169.254.1.1 0.0.0.0 UG 0 0 0 eth0169.254.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0

查看 node1 路由表

可以看到路由表中目的地址 10.244.42.65 对应的是 pod1 的 root namespace下的网卡 cali59330ed5cb6

目的地址 10.244.42.66 对应的是 pod2 的 root namespace下的网卡 cali072e3706f4d

[root@node1 ~]# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 ens3310.244.42.64 0.0.0.0 255.255.255.192 U 0 0 0 *10.244.42.65 0.0.0.0 255.255.255.255 UH 0 0 0 cali59330ed5cb610.244.42.66 0.0.0.0 255.255.255.255 UH 0 0 0 cali072e3706f4d10.244.103.64 192.168.0.82 255.255.255.192 UG 0 0 0 tunl010.244.152.128 192.168.0.80 255.255.255.192 UG 0 0 0 tunl0172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33

同节点通信数据流向图

抓包验证

我们在 node 1 上抓取两个 calico 的root namespace 下的网卡对 pod 的 eth0 抓包

pod1 ping pod2

kubectl exec -it cni-test-777bbd57c8-4lnwt -- ping 10.244.42.66

pod1 eth0

kubectl exec -it cni-test-777bbd57c8-4lnwt -- tcpdump -pne -i eth0 -w pod1.cap

pod1 cali59330ed5cb6

tcpdump -pne -i cali59330ed5cb6 -w pod1-cali.cap

pod2 eth0

kubectl exec -it cni-test-777bbd57c8-8zgs9 -- tcpdump -pne -i eth0 -w pod2.cap

pod2 cali072e3706f4d

tcpdump -pne -i cali072e3706f4d -w pod2-cali.cap

通过抓包,我们验证了如下图所示的数据流向图

问题一:为什么 pod 内部路由网关是 169.254.1.1

问题二:为什么 pod 对应 root namespace下的 cali 网卡没有IP地址,但 MAC 地址是 ee:ee:ee:ee:ee:ee,全 e 会不会有影响

而且这个 MAC地址时calico 自己生成的,用于使用 calico 点对点的路由接口,流量通过网络层,而不会到达数据链路层,因为从不使用这个 MAC 地址,因为所有的 Cali 网卡都可以使用相同的 MAC 地址,这也正契合了 proxy_arp 的特性,不关心网关接口的 MAC 地址。

Proxy-Arp

我们引用 华为的一篇文档来解释什么是 proxy-arp。​​proxy-arp​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SocialMarketing:联合营销怎么玩出圈?解锁奥利奥春天“卖萌”的101种姿势!
下一篇:Calico 部署
相关文章

 发表评论

暂时没有评论,来抢沙发吧~