容器跨主机网络-VXLAN解析

容器跨主机网络-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的方式来进行说明。

  1. consul-0的请求(目的ip:10.244.2.91)通过cni0网桥。

  2. 在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
  1. 有了目的VTEP的MAC地址,linux内核可以开始二层封包工作,如图VTEP所示封装为内部以太网报头,内部ip报头。但该MAC地址并不能在宿主机二层网络传输。所以还需要把该内部数据封装成宿主机网络的一个普通数据帧,简言之宿主机的普通数据帧带着内部的这部分数据传递到其他宿主机的VTEP设备做解析。所以我们需要找到宿主机的地址。

  2. 在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
  1. 找到宿主机的相关信息,如图中间报文部分,把宿主机的相关信息进行封包,这里需要注意的是封包数据中有VXLAN Header,并且VNI=1,所以node2节点linux才会对它进行拆包,获取内部数据帧,然后根据VNI的值把它交给node2的flannel.1设备。

  2. flannel.1设备进一步拆包,取出原始IP包,过cni0找到consul-2。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值