4

#夏日挑战赛# Flannel Vxlan 跨节点通信-开源基础软件社区-51CTO.COM

 2 years ago
source link: https://ost.51cto.com/posts/14350
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

「本文正在参加星光计划3.0–夏日挑战赛」

Flannel 跨节点通信

和 calico vxlan 一样,跨节点通信,利用的是主机上的路由和 flannel.1 来实现的。
通过主机的路由表查看出接口的网关和对应的网卡,而网关的 MAC 地址是通过 节点维护的 fdb 表 获得的。

还是在同节点的通信基础上进行试验
pod 1 10.244.1.2 node1
pod2 10.244.2.6 node2

[root@master ~]# kubectl get pod -o wide 
NAME                        READY   STATUS    RESTARTS   AGE    IP           NODE              NOMINATED NODE   READINESS GATES
cni-test-777bbd57c8-5zhjd   1/1     Running   0          109m   10.244.2.6   node2.whale.com   <none>           <none>
cni-test-777bbd57c8-t6xhd   1/1     Running   0          109m   10.244.1.2   node1.whale.com   <none>           <none>
cni-test-777bbd57c8-whwcm   1/1     Running   0          109m   10.244.1.3   node1.whale.com   <none>           <none>

跨节点通信数据流向图

#夏日挑战赛# Flannel Vxlan 跨节点通信-开源基础软件社区

抓包演示跨节点数据流向

pod eth0 和它对应的 veth pair 网卡是点对点直通,两端报文是一样的,所以我们只需要抓一端就可以。

kubectl exec -it cni-test-777bbd57c8-t6xhd  -- ping -c 1 10.244.2.6

pod1.cap

[root@master ~]# kubectl exec -it cni-test-777bbd57c8-t6xhd -- tcpdump -pne -i eth0 -w pod1.cap

通过 pod1 路由表,我们可以发现, 10.244.2.0/24 网段的走 默认路由,需要找网关 10.244.1.1 的地址

#夏日挑战赛# Flannel Vxlan 跨节点通信-开源基础软件社区

通过 node1 路由表和 ip 地址,我们找到了网关的地址,就是 cni0 网口的地址

#夏日挑战赛# Flannel Vxlan 跨节点通信-开源基础软件社区
#夏日挑战赛# Flannel Vxlan 跨节点通信-开源基础软件社区

pod1-flannel.cap

[root@node1 ~]# tcpdump -pne -i flannel.1 -w pod1-flannel.cap

通过 node1 的路由表和 FDB表,我们知道了 flannel 封装的几个要素

#夏日挑战赛# Flannel Vxlan 跨节点通信-开源基础软件社区
#夏日挑战赛# Flannel Vxlan 跨节点通信-开源基础软件社区

node1.cap

[root@node1 ~]# tcpdump -pne -i ens33 -w node1.cap

在node 对应的物理网卡上,我们就可以看到 flannel.1 封装好的 Vxlan 报文

#夏日挑战赛# Flannel Vxlan 跨节点通信-开源基础软件社区

node2.cap

[root@node2 ~]# tcpdump -pne -i flannel.1 -w pod2-flannel.cap

解封装过程就是封装过程的逆过程,所以暂就不过多解释,结合 node1 的封装过程就可以看懂

#夏日挑战赛# Flannel Vxlan 跨节点通信-开源基础软件社区

pod2-flannel.cap

[root@node2 ~]# tcpdump -pne -i flannel.1 -w pod2-flannel.cap
#夏日挑战赛# Flannel Vxlan 跨节点通信-开源基础软件社区

pod2.cap

[root@master ~]# kubectl exec -it cni-test-777bbd57c8-5zhjd -- tcpdump -pne -i eth0 -w pod2.cap
#夏日挑战赛# Flannel Vxlan 跨节点通信-开源基础软件社区

至此,我们验证了 Flannel vxlan 中跨节点的通信过程,对于数据的流向,和calico vxlan 中基本一致,所以不难看出,vxlan 的跨节点通信的本质,其实就是 flannel.1 帮我们封装了vxlan 格式的报文,然后模拟出来一个 大二层,使跨节点也可以用二层的方式正常的通信。

#夏日挑战赛# Flannel Vxlan 跨节点通信-开源基础软件社区

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK