openflow流表的mac地址match项支持对mac地址做掩码,如同ip地址的掩码一般,就想着既然ip路由可以只使用一条路由表转发到网段内所有主机的报文,那么利用这个特性,二层也可以做到相同的效果,正好工作中也在用ovs做骨干测的转发,同时也存在流表的性能问题,就想着使用这种方法优化一下。
工作业务上的细节不便描述,这里只简单描述一下思路,总体思路就是模仿ip网段和ip三层路由,将同一ovs设备背后的设备的mac地址配置为同一mac地址网段内且全网唯一的地址,从而利用ovs流表mac地址match项支持对mac地址做掩码,将到达同一目的ovs设备背后设备的转发流表聚合为一条基于mac网段的流表,达到大幅缩小流表条目的目的。
如上图所示,两台ovs 可能是物理位置不同的两台虚拟 或物理设备,其中ovs1背后连接着mac网段为 00:00:01:00:00:00/ff:ff:ff:00:00:00 的一群虚拟或物理转发设备,ovs2后面连接着mac网段为 00:00:02:00:00:00/ff:ff:ff:00:00:00 和00:00:03:00:00:00/ff:ff:ff:00:00:00 的一群虚拟或物理转发设备。
这样ovs1 上到ovs2的流表只需要配置两条(ovs之间走的overlay的vxlan):
dl_dst=00:00:02:00:00:00/ff:ff:ff:00:00:00,actions=output:"vxlan-1"
dl_dst=00:00:03:00:00:00/ff:ff:ff:00:00:00,actions=output:"vxlan-1"
这样ovs2 上到ovs1的流表只需要配置一条:
dl_dst=00:00:01:00:00:00/ff:ff:ff:00:00:00,actions=output:"vxlan-1"
ovs1 和 ovs2 上去往本端具体三层设备的流表下发精确的主机mac流表:
dl_dst=00:00:01:00:00:01,actions=output:"veth1"
dl_dst=00:00:01:00:00:02,actions=output:"veth2"
dl_dst=00:00:01:00:00:03,actions=output:"veth3"
这样,将来随着系统规模的扩大,每台ovs设备的流表条目数是可控的,首先一台ovs设备受限于自己的转发性能,所连接的三层虚拟或物理设备是有限的,所以到本端的流表是有限的。而到达对端的流表,也只会随着ovs设备的增长而线性的增长,总体是可控的。
这个思路的前提是:
1. 三层设备是系统管控的,非用户私有设备,便于三层口mac地址和arp表项的统一管理。
2. 二层转发设备要支持基于mac网段的转发,除了ofs(如ovs),还可以是一些自研的白牌盒子。
虚拟机或者容器组网如果使用ovs是比较容易使用这种方式的。
网友评论