之前的文章<<VXLAN原理介绍与实例分析>>简要介绍了VXLAN的基本概念和基于组播的通信过程实例。其中控制面是混合在数据面中的,由洪泛(flood)和源地址学习实现。本文通过实例将控制面从数据面中分离,手动维护FDB
及ARP
表项实现通信过程。
对于大规模的VXLAN网络中,最核心的问题一般有两个:
- 如何发现网络中其他VTEP
- 如何降低BUM(Broadcast, Unknown unicast, Multicast)流量
在对于问题一来说,之前的文章中的解决方法是洪泛,对于问题二,则通过源地址学习来确定MAC地址的归属。VXLAN的转发过程主要依赖FDB(Forwarding Database)实现。二层网桥的FDB表项格式可表达为:
1 | <MAC> <VLAN> <DEV PORT> |
VXLAN设备的表项与之类似,可以表达为:
1 | <MAC> <VNI> <REMOTE IP> |
VXLAN设备根据MAC地址来查找相应的VTEP IP地址,继而将二层数据帧封装发送至相应VTEP。
如果我们能够从集中的Controller或者存储中获取VTEP信息以及MAC地址与VTEP的对应信息,则问题一和问题二都可以通过根据相应信息动态更新FDB表项来解决,OpenStack的Neutron, VMware的NSX,Docker Overlay都有类似的思路。
下面我们通过实例来手动更新FDB表来实现VXLAN通信。我们的实验环境如下图, VTEP本地使用Linux bridge来挂载连接到network namespace中的veth pair
虚拟网卡,我们要实现3.3.3.3
二层访问3.3.3.4
。
