Linux 虚拟网卡技术:Macvlan
在 VEPA 模式下,所有从 Macvlan 接口发出的流量,不管目的地全部都发送给父接口,即使流量的目的地是共享同一个父接口的其它 Macvlan 接口。在二层网络场景下,由于生成树协议的原因,两个 Macvlan 接口之间的通讯会被阻塞,这时需要上层路由器上为其添加路由(需要外部交换机配置 Hairpin 支持,即需要兼容 802.1Qbg 的交换机支持,其可以把源和目的地址都是本地 Macvlan 接口地址的流量发回给相应的接口)。此模式下从父接口收到的广播包,会泛洪给 VEPA 模式的所有子接口。 现在大多数交换机都不支持 Hairpin 模式,但 Linux 主机中可以通过一种 Harpin 模式的 Bridge 来让 VEPA 模式下的不同 Macvlan 接口通信(前文已经提到,Bridge 其实就是一种旧式交换机)。怎么配置呢?非常简单,通过一条命令就可以解决:
或者使用 iproute2 来设置:
如果你的内核是你手工编译升级的,那么可能你的用户态程序并不支持新内核对应的所有特性,也就是说你的 brctl 可能版本过老不支持 hairpin 命令,那么可以 sysfs 来搞定:
在 Linux 主机上配置了 Harpin 模式之后,源和目的地址都是本地 Macvlan 接口地址的流量,都会被 br0(假设你创建的 Bridge 是 br0)发回给相应的接口。 如果想在物理交换机层面对虚拟机或容器之间的访问流量进行优化设定,VEPA 模式将是一种比较好的选择。 VEPA 和 Passthru 模式下,两个 Macvlan 接口之间的通信会经过主接口两次:第一次是发出的时候,第二次是返回的时候。这样会影响物理接口的宽带,也限制了不同 Macvlan 接口之间通信的速度。如果多个 Macvlan 接口之间通信比较频繁,对于性能的影响会比较明显。 Bridge 此种模式类似 Linux 的 Bridge,拥有相同父接口的两块 Macvlan 虚拟网卡是可以直接通讯的,不需要把流量通过父网卡发送到外部网络,广播帧将会被泛洪到连接在"网桥"上的所有其他子接口和物理接口。这比较适用于让共享同一个父接口的 Macvlan 网卡进行直接通讯的场景。 这里所谓的 Bridge 指的是在这些网卡之间,数据流可以实现直接转发,不需要外部的协助,这有点类似于 Linux host 内建了一个 Bridge,即用 brctl 命令所做的那一切。但和 Linux bridge 绝不是一回事,它不需要学习 MAC 地址,也不需要 STP,因此效能比起使用 Linux bridge 好上很多。 Bridge 模式有个缺点:如果父接口 down 掉,所有的 Macvlan 子接口也会全部 down 掉,同时子接口之间也将无法进行通讯。 Private 此种模式相当于 VEPA 模式的增强模式,其完全阻止共享同一父接口的 Macvlan 虚拟网卡之间的通讯,即使配置了 Hairpin 让从父接口发出的流量返回到宿主机,相应的通讯流量依然被丢弃。具体实现方式是丢弃广播/多播数据,这就意味着以太网地址解析 arp 将不可运行,除非手工探测 MAC 地址,否则通信将无法在同一宿主机下的多个 Macvlan 网卡间展开。之所以隔离广播流量,是因为以太网是基于广播的,隔离了广播,以太网将失去了依托。 Passthru 此种模式会直接把父接口和相应的MacVLAN接口捆绑在一起,这种模式每个父接口只能和一个 Macvlan 虚拟网卡接口进行捆绑,并且 Macvlan 虚拟网卡接口继承父接口的 MAC 地址。 此种模式的优点是虚拟机和容器可以更改 MAC 地址和其它一些接口参。 4. Macvlan 和 Bridge 的使用场景 最后我们再来讨论一下 Macvlan 和 Bridge 的各自使用场景。 使用 Macvlan:
使用 Bridge:
(编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |