昨天,我们在《从二层到大二层》中介绍了VXLAN二层转发的机制。同一个网段的虚拟机需要跨越三层网络通信时,可以将二层以太网数据包封装在VXLAN隧道中穿越三层网络。那么,当不同网段的虚拟需要通信时应当如何实现呢? 在Neutron中的实现如下图:
当网段100的VM,和网段200的VM互联互通的时候,会在VXLAN隧道的两端VTEP各更改一次网段ID (VNI, Virtual Network Index),使用公用的VNI互通。这种机制叫做对称IRB。更改VNI的操作,叫做VXLAN路由 (VXLAN Routing),或RIOT(Routing In/Out Tunnel)。
在VMWare NSX中,则使用另一种叫做非对称IRB的方式实现互通:
注意到图中存在两条VXLAN隧道,其VNI是不一样的。在非对称IRB中,在入隧道方向的VTEP进行VXLAN Routing,将VNI更换为目标网段的VNI,而出隧道方向的VTEP进行VXLAN Bridging,拆除VXLAN隧道包头。由于往返的VNI、封装点均不一样,因此被称为非对称IRB。
我们发现,在对称IRB的场景下,每个VTEP只需要维护自身所在的各个网段下的所有VM的MAC和FIB信息即可。而非对称IRB场景下,每个VTEP不但需要维护所有VM的MAC和FIB信息,还需要维护ARP信息。
VTEP可以通过MAC/ARP学习等方式,得到所在宿主机下VM的MAC和FIB信息。当VTEP需要获取同一网段内其他VM的MAC/FIB信息的时候,它是如何得知的呢?
明天我们将继续详解VTEP之间信息互通的机制。