概述
容器跨主机网络-VXLAN解析
1. VXLAN与UDP的差异
前面提到UDP的主要问题在于用户态跟内核态不断转换导致的性能较差,而VXLAN是linux内核支持的网络虚拟化技术,故,VXLAN可以在内核态完成UDP做的封装与解封装工作。
2. VXLAN与的实现方式。
可以看到VXLAN的实现方式与UDP实现方式基本差不多,主要的区别是flanneld进程用VTEP取代了。flannel.1的设备就是VXLAN所需的VTEP设备,它既有IP地址,也有MAC地址。需要理解VXLAN的实现方式,主要需要弄清楚怎么找到目的地的VTEP设备。跟UDP一样,我们以consul-0去找consul-2的方式来进行说明。
-
consul-0的请求(目的ip:10.244.2.91)通过cni0网桥。
-
在node3上可以看到10.244.2.0/24的请求,需要通过flannel.1,这里主要的问题是找到目的VTEP设备的MAC地址是什么。执行ip neigh可以看到10.244.2.0关联的MAC地址为16:08:42:04:62:57,这是flannel.1在节点启动时会把该节点VTEP的MAC地址自动添加到其他节点上。
[root@k8s-node3 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.244.2.0 10.244.2.0 255.255.255.0 UG 0 0 0 flannel.1
[root@k8s-node3 ~]# ip neigh show dev flannel.1
10.244.2.0 lladdr 16:08:42:04:62:57 PERMANENT
-
有了目的VTEP的MAC地址,linux内核可以开始二层封包工作,如图VTEP所示封装为内部以太网报头,内部ip报头。但该MAC地址并不能在宿主机二层网络传输。所以还需要把该内部数据封装成宿主机网络的一个普通数据帧,简言之宿主机的普通数据帧带着内部的这部分数据传递到其他宿主机的VTEP设备做解析。所以我们需要找到宿主机的地址。
-
在linux内核中,vxlan找到宿主机的地址需要去FDB(forwarding)的转发数据库进行查找。该FDB的信息也是由flanneld进程负责维护。通过bridge fdb可以看到宿主机的Ip地址为172.253.67.150。
[root@k8s-node3 ~]# bridge fdb show flannel.1 | grep 16:08:42:04:62:57
16:08:42:04:62:57 dev flannel.1 dst 172.253.67.150 self permanent
-
找到宿主机的相关信息,如图中间报文部分,把宿主机的相关信息进行封包,这里需要注意的是封包数据中有VXLAN Header,并且VNI=1,所以node2节点linux才会对它进行拆包,获取内部数据帧,然后根据VNI的值把它交给node2的flannel.1设备。
-
flannel.1设备进一步拆包,取出原始IP包,过cni0找到consul-2。
最后
以上就是犹豫羽毛为你收集整理的容器跨主机网络-VXLAN解析的全部内容,希望文章能够帮你解决容器跨主机网络-VXLAN解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复