3.5.5 MACVLAN

MACVLAN 是介绍的最后一种虚拟设备,在介绍 MACVLAN 先学习点前置知识,了解 VLAN 之间的通信逻辑。

1. VLAN 通信逻辑

本书内容关联

本书 7.3 节《容器间通信模型》介绍 Calico(BGP)、Flannel(host-gw)这两种三层路由网络模型时,提到它们的缺点不能跨 VLAN。而 Flannel(VXLAN)、Calico(IPIP)属于 Overlay 网络,通过构建虚拟网,并借助主机三层网络实现容器间通信,从而可以跨越 VLAN,原因就是在这里。

不同的 VLAN 都有着独立的广播域,因为它们之间完全二层隔离的,如果想要把两个 VLAN 连接起来,只能通过三层路由设备。

假设位于 VLAN-A 中的主机 A1,希望把数据包发送给 VLAN-B 中的主机 B1,由于 A、B 两个 VLAN 之间二层链路不通,因此引入了单臂路由。单臂路由是指在路由器的一个接口上通过配置子接口(或“逻辑接口”,并不存在真正物理接口)的方式,实现原来相互隔离的不同 VLAN 之间的互联互通:

  • 交换机连接主机的端口为 access 链路;
  • 交换机连接路由器的端口为 Trunk 链路。

增加了单臂路由之后,两个 VLAN 之间的通信如图 3-27 所示。A1 要和 B2 通信,A1 就把数据包先发送给路由(只需把路由设置为网关即可做到),然后路由根据数据包上的 IP 地址得知 B1 的位置,去掉 VLAN-A 的 VLAN Tag,改用 VLAN-B 的 VLAN Tag 重新封装数据包后,发回给交换机,交换机收到后就可以顺利转发给 B1 了。


图 3-27 两个 VLAN 之间使用单臂路由模式通信

由于 A1、B2 各自处于独立的网段上,它们又各自要把同一个路由作为网关使用,这就要求路由器必须同时具备 192.168.0.0/24 和 192.168.1.0/24 的 IP 地址。

当然,如果真的就只有 VLAN-A、VLAN-B 两个 VLAN,那把路由器上的两个接口分别设置不同的 IP 地址,然后用两条网线分别连接到交换机上,也勉强算是一个解决办法。但要知道,VLAN 最多可以支持 4096 个 VLAN,那如果要接四千多条网线就太离谱了。

为了解决这个问题,802.1Q 规范中专门定义了子接口(Sub-Interface)的概念,它的作用是允许在同一张物理网卡上,针对不同的 VLAN 绑定不同的 IP 地址。

2. MACVLAN

MACVLAN 借用了 VLAN 子接口的思路,并且在这个基础上更进一步,不仅允许对同一个网卡设置多个 IP 地址,还允许对同一张网卡上设置多个 MAC 地址,这也是 MACVLAN 名字的由来。

原本 MAC 地址是网卡接口的“身份证”,应该是严格的一对一关系,而 MACVLAN 打破了这层关系,它在物理设备之上、网络栈之下可以生成多个“虚拟设备”,每个“虚拟设备”都有一个 MAC 地址。

用 MACVLAN 技术虚拟出来的副本网卡,在功能上和真实的网卡是完全对等的。在收到数据包后,真正的物理机网卡承担着类似交换机的职责,物理网卡会根据目标 MAC 地址,判断这个包应该转发给哪块副本网卡处理(如图 3-28 所示)。


图 3-28 MACVLAN 工作原理

由于同一块物理网卡虚拟出来的副本网卡,天然处于同一个 VLAN 之中,因此可以直接二层通信,不需要将流量转发到外部网络。因此,MACVLAN 是虚拟机/容器组建虚拟集群网络最理想的方案。

总字数:984
Last Updated:
Contributors: isno