Open vSwith Agent之VxLAN
对于VxLAN类型的网络来说,同样需要解决节点内部不同虚拟网络之间的隔离问题,解决这个问题的方式也与VLAN类型网络相同。
此外VxLAN类型网络主要解决的问题是OVS网桥无法从隧道学习MAC地址,我们需要为每一个加入VxLAN网络的节点建立一个Tunnel Port(IP和VNI)。
OVS网桥无法从隧道学习MAC地址。
当报文从br-ini进入br-tun后,通过转发表,应该可以从目的MAC找到一个单播IP和VNI,OVS不能自动学习这个对应关系。
这个对应关系通过下面方式来学习。
当单播报文从远端进入br-tun的时候,就可以确信,这个报文的源MAC地址对应VM肯定位于此Tunnel port(IP和VNI)所连接的主机,这就是发送报文需要的OVS端口。将这个对应关系作为一个规则写入OVS的一个流表,这张流表为反向流量提供MAC到Tunnel Port(远端IP和VNI)的映射。
这个过程和一般交换机MAC地址学习的过程极为类似,学习过程中使用的流表是LEARN_FROM_TUN,学习到的规则存储于UCAST_TO_TUN.
单播发送问题可以通过上述的学习过程建立映射,那么针对未知单播或广播报文又该如何处理?答案是通过多播或单播(依据配置)发送到所有Tunnel Port上。
下图为VxLan类型网络节点虚拟网络拓扑。在Tunnel Port学习的基础删辅以少量其他流表,完成整个VxLAN虚拟网络的转发。
egress方向(从节点内部到物理网络)上,从br-ini进入br-tun的数据首先由流表PATCH_LV_TO_TUN根据报文是否为单播,定位到UCAST_TO_TUN或者FLOOD_TO_TUN。UCAST_TO_TUN内是学习到MAC与Tunnel Port映射规则。而FLOOD_TO_TUN则是将报文发送到所有属于虚拟子网的Tunnel Port。
ingress方向(从Tunnel Port到节点内部网络),从Tunnel Port进入报文经过流表VXLAN_TUN_TO_LV,此流表负责查找VNI对应的LVID填入报文,之后将报文送到LEARN_FROM_TUN进行MAC地址学习。
物理网络接口eth0与br-tun之间并没有连接,对应VxLAN来说,eth0接收到外部进入网络流量后,Linux网络协议栈会将其转交给br-tun进行处理,因此也并不需要配置eth0与br-tun之间的bridge-mapping。