calico ipip 跨节点pod通信详解
问题概述
为了更好地了解calico ipip协议中跨节点之间pod通信
(这里以redis pod为例)
其链路通信示意图如下:
1. 这里我们一步一步抓包来进行验证。
①:pod1 eth0→node1 calico.xx
通过node1我们kubectl get ipamblocks -A找到容器地址段
当前我们需要去验证的跨节点容器间通信为如图标红两个pod
②:这里我们从pod1(redis1-0-0) 去ping 对端尝试在calico网卡上抓包
tcpdump -i cali64e8186a81e -nnve -p icmp -w /root/cali64.pcap
(这里能看到有从pod1->pod2的出包,同时有pod2→pod1的回包,那么证明网络是从pod1 网卡eth0是发包到了cali64xxxx网卡)
③:这里如何将容器内的网络让对端节点知道呢,因为在对端路由表中是不存在node1节点pod的路由信息的。
因此这里涉及到ipip包封装,简单来说就是node1中的tunl0网卡将原始报文
(源地址:10.112.209.41(redis-1-0-0)→对端10.112.0.43(目的地址))进行了封装,在外面包了一层节点的信息(以告诉对端下一跳如何进行)
(在node2节点上tcpdump -i eth0 -nnve src host 192.168.36.28(node1节点ip) -w /root/eth0.pcap)
发现如下:
同理,包到了node2节点eth0后,通过解包,会根据路由找到下一跳calico.xxx网卡,进而找到目的端。
####注意#####
当同子网之间通信时,其实无需进行路由处理(即可以省去ipip协议进行通信,而尝试直接BGP路由协议解决,减少链路损耗。)