VxLAN 数据面封装协议
? 2011 年 8 月,主要由 VMware 与 Cisco 公司草拟并由 IETF 发布了 RFC 7348 草案《Virtual eXtensible Local Area Network (VXLAN): A Framework for Overlaying Virtualized Layer 2 Networks over Layer 3 Networks》。 ? VxLAN(Virtual Extensible Local Area Network,虚拟扩展本地局域网)是 IETF 定义的 NVO3(Network Virtualization over Layer 3)标准技术之一,从名字可以看出,VxLAN 最初定位于对传统 VLAN 协议的一种增强替代方案。本质是一种 Tunneling(隧道)网络传输技术,又称为 Overlay 网络,特点是将 L2 Frame 封装到 UDPVxLAN Header 中,并在 L3 IP 网络中进行传输(L2 over L3)。 ? 通过 VxLAN 技术可以将处于不同 L3 Subnets 的 Underlay 网络设备整合到一个逻辑上的 Overlay 网络中。对于 Overlay 网络的终端用户而言,这些网络设备似乎 “真实” 地部署在了同一个 L2 数据链路层网络中,以此来适应大规模云计算多租户隔离网络的需求。
?
?VxLAN 组网拓扑介绍
? 如上图所示,首先介绍构建一个 VxLAN 网络所需要的组成部分,包括以下 3 组核心元素: ?
NVE / VTEP / VxLAN Tunnel
VxLAN L2 Gateway / L2 VNI / BD
VxLAN L3 Gateway / L3 VNI / VRF
NVE / VTEP / VxLAN Tunnel
在抽象的 Overlay 网络中,NVE(Network Virtualization Edge,网络虚拟边缘节点)是一个处于 Underlay 网络和 Overlay 网络交界处的边缘设备,提供网络虚拟化功能,用于衔接 2 个不同的网络类型。 ? 根据具体的组网环境,NVE 可以是主机中运行的一个虚拟网元,也可以是一个物理网元(e.g. Spine/Leaf 交换机)。在本文中主要讨论硬件 NVE 的情况。
? ??软件 NVE 常见的有 OvS Tun Bridge 和 Linux Bridge + Tun 虚拟隧道网卡设备。 ?
??硬件 NVE 常见的有 Spine-Leaf 交换机设备。 ? 在具体的 VxLAN Overlay 网络中,NVE 需要具备 VTEP(VxLAN Tunnel Endpoints,隧道端点)功能,用于完成 VxLAN 协议栈的封装/解封装。两个 VTEP(local-VTEP 和 remote-VTEP)之间具有 Underlay IP 路由可达性,继而可以构造一个 L3 之上的 VxLAN Tunnel。 ? 区别于 VLAN 使用 VLAN ID 来隔离二层网络,VxLAN 使用了 VNI(VXLAN Network Identifier,VXLAN 网络标识符)来作为隔离标记。在一个 VxLAN Tunnel 中,可用于传输若干个由 VNI 进行隔离的 VxLAN 虚拟网络。 ? 另外,与 VLAN 网络隔离需要通过 L3 Gateway 来互联互通类似,在 VxLAN 网络隔离中同样需要 VxLAN Gateway 来实现 VxLAN 虚拟网络与其他类型网络之间的互联互通,而且情况会更加复杂。根据用途的区别,VxLAN Gateway 大体上可以分为 VxLAN L2 Gateway 和 VxLAN L3 Gateway 这 2 种类型,对应的 VNI 也根据用途被细分为 L2 VNI 和 L3 VNI 这 2 种类型。 ?
VxLAN L2 Gateway / L2 VNI / BD
VxLAN L2 Gateway 用于实现 VxLAN 和 VLAN 之间的互联。 ? 在 Leaf NVE 中,为了实现 VxLAN L2 Gateway 的 L2 隔离和转发而引入了 BD(Bridge Domain)的概念,它是一个可配置的二层广播域,类似于一个虚拟网桥设备。在新建一个 BD Instance 时,通常会将 BD Instance、L2 VNI、Local VLAN ID 配置为一一对应,并且在一个 BD Instance 中会同时存在 2 种类型的接口: ?
Overlay 侧接口
是一个对内的二层接口设备,更准确的说是一个 Host 上联 Leaf Port 的二层子接口设备(e.g. CloudEngine VAP),具有同一个 VLAN ID 的下挂终端(VM/Host)的 Original L2 Frame 会从此接口进入到 VTEP 中进行后续的封装。 ?
Underlay 侧接口
是一个对外的三层接口设备,会被分配一个 Underlay IP,与物理网络相连。在 Underlay 网络中的多个 VTEP 之间具备 IP 路由可达性,用于构建 VxLAN Tunnel。被 VTEP 封装之后的 VxLAN 封装包会从此接口流出进入 VxLAN Tunnel 传输。 ? 另外,BD Instance 为了能够 “缝合“ Local VLAN 和 VxLAN Tunnel 这两段网络,维护了 VID-VNID 映射关系。通过这样的方式,VxLAN L2 Gateway 就将 Local VLAN 作为了 VxLAN Tunnel 的接入点,所有加入到 Local VLAN 中的终端(VM/Host)L2 流量,就会进入到对应的 VxLAN Tunnel 中。
VxLAN L3 Gateway / L3 VNI / VRF
VxLAN L3 Gateway 用于实现下列 2 种互联场景: ?
两个 VNI 不同的 VxLAN 虚拟网络之间的互联互通。
VxLAN 虚拟网络和外部 IP 网络之间的互联互通。
可见,VxLAN L3 Gateway 主要提供了 L3 隔离和转发功能,具体沿用了 L3 VPN Instance 中的 VRF 技术。每个 VRF 都具有自己的 Route Tables,类似于 Linux Network Namespace,同时维护了 VRF 和 L3 VNI 的映射关系,以此在 VxLAN L3 Gateway 层面实现了对不同租户之间的 L3 隔离。 ? 另外,在常见的 Spine-Leaf 数据中心网络架构中,根据将 VxLAN L3 Gateway 部署在 Spine 或者部署在 Leaf 上的不同,又可以再细分为 2 种不同的 VxLAN 组网方案: ?
集中式 VxLAN L3 Gateway 组网方案
分布式 VxLAN L3 Gateway 组网方案
下图中概述性的列举了这 2 种组网方案的异同。
集中式 VxLAN L3 Gateway 组网方案
在分布的 Leaf 上部署 VxLAN L2 Gateway 功能,在集中的 Spine 上部署 VxLAN L3 Gateway 功能。这意味着所有跨网络之间的流量都需要经过 Spine 进行转发,包括:VxLAN 虚拟网络之间,以及 VxLAN 虚拟网络与外部 IP 网络之间的流量。 ? 该方案的优点是跨网络流量集中管理,简化网关部署和管理。而缺点是: ?
转发路径并非最优
跨网络之间的流量都需要在 Spine 上进行 L3 绕行,这样就导致了 Leaf 与 Spine 之间的链路上存在冗余的报文,额外占用了大量的带宽。 ?
Spine 的 ARP 表项压力大
所有通过 L3 转发的 ARP 表项(MAC-IP)都存储在 Spine 上,当终端的数量越来越多时,Spine 就容易成为网络瓶颈。 ? 所以该方案适用于小型组网环境。
分布式 VxLAN L3 Gateway 组网方案
在分布的 Leaf 上同时部署了 VxLAN L2 和 L3 Gateway,而 Spine 只作为常规 L3 转发节点并不需要感知 VxLAN 隧道的存在。具有以下特性: ?
相同 VTEP 下跨网络之间的流量在 Leaf 上完成 L3 转发。
只有不同 VTEP 下跨网络之间的流量需要经过 Spine 完成 L3 转发。
另外,只要求 Leaf 学习下挂终端的 ARP 表项,从而解决了 Spine 规格带来的容量瓶颈问题。所以该方案适用于中大规模(5000 台服务器及以上)的高性能网络。 ? 而缺点是网关部署、故障定位及网络运维相对复杂,通常需要结合 EVPN Control Plane 来完成一系列的自动化配置工作,例如:基于 BGP Peer 的 VTEP 自动发现、VxLAN Tunnel 自动建立,ARP 表项自动生成等等。 ?
? VxLAN 协议栈解析
? VxLAN 的协议栈比较简单,定义了一种 MAC-in-IP 的报文封装格式。 ?
Original L2 Frame
一个原始且完整的 L2 数据帧,是业务层发出(通常是 VM)的实际 Payload 数据。 ?
VxLAN Header(8Bytes)
将 Original L2 Frame 封装到 VxLAN Header(8Bytes)成为 Overlay Segment。 ?
VxLAN Flags(8bits):标记字段,如果 VNI 有效,则固定取值为 00001000。
Reserved(24bits):保留字段,固定取值为全 0。
VNI(VxLAN Network Identifier,24bits):最多支持 16777216(1600 万)个二层隔离网络。根据用途的不同可分为 L2 VNI 和 L3 VNI。
Reserved(8bits):保留字段,固定取值为全 0。
UDP Header(8Bytes)
是 Overlay 和 Underlay 的分界线。UDP 协议由于其高效率、低占用的特性常被用作隧道封装协议的传输层。 ?
UDP srcPort(16bits):由 local-VTEP 通过对 Original L2 Frame 进行 HASH 计算后得出,该特性使得 VxLAN 封装包在 Receive Site 具备了可行的 HASH-base 负载均衡处理能力(e.g. ECMP 等价路由)。
UDP dstPort / VxLAN Port(16bits):缺省取值为 UDP 4789,根据具体设备型号可能支持配置更改。
UDP Length(16bits):指示一个 UDP 数据报的总长度。
Checksum(16bits):检验字段。
Outer IP Header(20Bytes)
是 Underlay 的 L3 IP Header 封装。 ?
srcIP 是 local-VTEP 的 IP 地址。
dstIP 可能是 remote-VTEP 的 IP 单播地址,也可能是用于 BUM 流量的多播/组播地址。
Outer MAC Header
是 Underlay 的 L2 Frame 封装。dstMAC 和 srcMAC 地址视乎于具体的 Underlay 网络拓扑。 ?
srcMAC 是 local-VTEP 的 MAC 地址;
dstMAC 视乎于具体的 Underlay 以太网络拓扑。
VxLAN 数据面转发原理
同 VNI 的 BUM 报文转发场景
BUM(Broadcast,Unknown-unicast,Multicast)是网络中常见的 3 种流量类型,分别表示: ?
广播流量(Broadcast)
指发送到网络中所有设备的流量,例如:ARP 报文、DHCP 报文等。 ?
未知单播流量(Unknown-unicast)
指发送给网络中不存在的设备的流量,例如:发往一个错误的 MAC 地址的报文等。当交换机收到一个未知目的 MAC 地址的报文时,它需要向除了源端口外的所有端口转发该报文,以便让目的主机能够收到该报文并发送响应。因此,未知单播报文也是广播报文的一种,也会对网络带宽造成浪费。 ?
组播流量(Multicast)
指发送给一组目标设备的流量,这些设备加入到了一个组播组,组播流量的目的地址也是特定的组播地址,因此对网络带宽的占用相较于广播更少一些。 ? 在网络中,对于不同类型的 BUM 报文,交换机的处理方式也不同,例如,对于 Broadcast 和 Multicast 报文,交换机会将它们转发到所有的端口,而对于 Unknown-unicast 报文,则只会将它们转发到除源端口外的所有端口。基于这样的特性,为了简单理解,我们可以将 BUM 报文统称为 Flooding 流量。 ? 在大规模的 VxLAN 场景中,由于多个 Overlay 虚拟网络共享 Underlay 物理网络,多租户情况下,这些 Flooding(洪泛)流量对物理带宽资源的占用尤为突出,需要特别的注意。 ? 物理网络设备对 BUM 的处理方式(数据包复制)大体上有 2 种: ?
头端复制(Head-End Replication,HER)
在源头(即发送端所在的端口)将 BUM 流量复制到多个目的地,每个目的地对应着一个收件人(e.g. 一个接收组播流的客户端)。这种方式需要在源端口上复制和转发每个数据包,因此可能会导致性能问题和链路拥塞。头端复制适用于小规模网络,常用于数据中心的二层网络中。 ?
核心复制(Core Replication,CR)
将 BUM 流量复制到一组专用的核心设备,这些设备负责将流量复制到所有需要它的接收方(e.g. 接收组播流的客户端)。这种方式通过在核心层进行复制,避免了在源端口上进行大量的复制和转发,因此对网络性能的影响更小。核心复制适用于大规模网络,常用于广域网环境中。 ? 对应的 VxLAN 硬件 NVE 同样有 2 种 BUM 报文处理方式: ?
VxLAN 头端复制 + Underlay 单播路由
由 local-VTEP(源头设备)负责对终端(VM/Host)发出的 BUM 报文进行复制,并采用 Underlay 单播路由的方式,经过 VxLAN Tunnels 将 BUM 传递到其他多个 remote-VTEPs 接收。remote-VTEP 接收到 BUM 报文之后,就不再 Flooding,避免了环路。
再展开一下 Local LAN 流量接入 VxLAN Tunnel 的流程细节。如下图所示,当 VTEP 接收到终端的携带 VLAN 的 BUM 之后,首先会通过 VLAN ID 匹配到对应的 BD,然后在该 BD 内查找 VNI-Tunnel List,最后为 BUM 封装上不同的 OverlayUnderlay Header 之后向 VNI-Tunnel List 指定的所有 VxLAN Tunnels 发出。
VxLAN 核心复制 + Underlay 组播路由
首先将网络中所有的 VTEPs 设备都加入到同一个组播组中,部署专门的核心层设备并通过组播路由协议(e.g. PIM)或 IPv6 多播路由协议(e.g. IGMP )与 VTEPs 建立一个组播信道和相应的组播转发表项。当终端发出 BUM 报文后,local-VTEP 会为其封装好组播目的 IP 地址,然后进入核心层设备进行数据复制,并采用 Underlay 组播的方式,将 BUM 传递到同一个组播组内的其他 remote-VTEPs 接收。
同 VNI 的单播报文转发场景
同 VNI 的单播报文转发场景中,一个 IP 单播报文的发送实际上可以拆分为 3 次转发流程,分别是: ?
ARP Request 广播转发;
ARP Reply 单播转发;
IP 单播转发。
下面以较为简单的 “VxLAN 头端复制 + Underlay 单播路由“ 方式为例进行介绍:VM_A、VM_B、VM_C 同属于 VNI 5000,也同属于 10.1.1.0/24 子网。此时,VM_A 想与 VM_C 进行首次通信。
ARP Request 广播转发流程
首次通信,VM_A 没有 VM_C 的 MAC 地址,所以首先进行 ARP Request 广播转发流程,请求获取 VM_C 的 MAC 地址。 ?
VM_A 发送 srcMAC 为 MAC_A、dstMAC 为 “全 F(广播)”、srcIP 为 IP_A、dstIP 为 IP_C 的 ARP Request 广播报文,请求获取 VM_C 的 MAC 地址。
VTEP_1 收到 ARP Request 后,根据二层子接口上的 VLAN 和 DB 配置判断报文需要进入 VxLAN Tunnel。确定报文所属 VNID 后,VTEP_1 首先会自学习 MAC_A、VNID 和 Port_1(二层子接口对应的物理接口)的映射关系,并记录在本地 MAC Table 中。之后,VTEP_1 会根据头端复制列表对报文进行复制,并分别进行 OverlayUnderlay Header 封装。
封装的 Outer srcIP 地址为 VTEP_1 的 IP 地址,Outer dstIP 地址为 remote-VTEP(VTEP_2 或 VTEP_3)的 IP 地址;Outer srcMAC 地址为 VTEP_1 的 MAC 地址,而 Outer dstMAC 地址为去往目的 IP 的网络中下一跳设备的 MAC 地址。
根据 Outer MAC/IP 信息,在 Underlay IP 网络中进行传输,直至到达 remote-VTEP。
报文到达 remote-VTEP 后,对报文进行解封装,得到 VM_A 发送的 Original L2 Frame。同时,remote-VTEP 学习 VM_A 的 MAC 地址、VNID 和 VTEP_1 的 IP 地址的映射关系,并记录在本地 MAC Table 中。之后,remote-VTEP 根据二层子接口上 BD 和 VLAN 配置对报文在 Local LAN 二层域内进行广播。
VM_B 或 VM_C 接收到 ARP Request 后,比较报文中的 dstIP 地址是否为本机的 IP 地址。VM_B 发现 dstIP 不是本机 IP,故将报文丢弃;VM_C 发现 dstIP 是本机 IP,则对 ARP Request 做出应答。
ARP Reply 单播转发流程
VM_C 应答 ARP Reply 时,由于 VM_C 已经知道了 VM_A 的 MAC 地址,所以 ARP Reply 报文为单播报文。报文的 srcMAC 为 MAC_C,dstMAC 为 MAC_A, srcIP 为 IP_C、dstIP 为 IP_A。 ?
VTEP_3 接收到 VM_C 发送的 ARP Reply 报文后,同样先自学习 MAC_C、VNI 和 Port_3 的映射关系,并记录在本地 MAC Table 中。然后 VTEP_3 对报文进行封装。
封装的 Outer srcIP 地址为 VTEP_3 的 IP 地址,Outer dstIP 地址为 VTEP_1 的 IP 地址;Outer srcMAC 地址为 VTEP_3 的 MAC 地址,而 Outer dstMAC 地址为去往目的 IP 的网络中下一跳设备的 MAC 地址。
根据 Outer MAC/IP 信息,在 Underlay IP 网络中进行传输,直至到达 remote-VTEP。
报文到达 VTEP_1 后,VTEP_1 对报文进行解封装,得到 VM_C 发送的 Original L2 Frame。同时,VTEP_1 学习 VM_C 的 MAC 地址、VNI 和 VTEP_3 的 IP 地址的映射关系,并记录在本地 MAC Table 中。然后 VTEP_1 将解封装后的报文发送给 VM_A。
至此,VM_A 和 VM_C 均已学习到了对方的 MAC 地址。之后,VM_A 和 VM_C 将采用 IP 单播方式进行转发。转发流程类似,这里不再赘述。
不同 VNI 的单播报文转发场景
不同 VNI 的单播报文转发场景,又称为 “跨 VxLAN 子网的单播报文转发场景“,需要结合上文中提到的 VxlAN L3 Gateway 来共同完成。 ? 这里以较为简单的 “集中式 VxLAN L3 Gateway 组网方案“ 来进行介绍:Spine 提供 L3 Forwarding 功能,VM1 和 VM4 处于不同的 VxLAN 子网,VM1 的网关是 VSI-Interface10,VM4 的网关是 VSI-Interface20,并分别接入到不同的 VSI(Virtual Switching Instance,虚拟交换实例)中,VSI 具有传统以太网交换机的所有功能。 ? 假设现在已经不是首次通信,VM1、VM4、VSI-Interface10、VSI-Interface20 之间的 MAC 地址都已经互相学习到了。此时 VM1 向 VM4 发出跨子王的 IP 单播报文。 ?
VM1 先将报文发送给 VSI-Interface10。
Leaf-A 收到 VM1 发来的报文,识别此报文属于 VxLAN 10,查找 dstMAC G10 的表项,然后对报文进行 VxLAN 封装后从 Tunnel2 发送出去。
Spine-C 收到 Leaf-A 发来的报文,进行 L3 Forwarding 处理:
发现 Outer dstIP 是自己,于是对报文进行解封装。
解完封装后,Spine-C 发现 Original L2 Frame 的 dstMAC 是本机 VSI-interface10 的 MAC、dstIP 是 IP4,于是根据路由表查找 IP4 的下一跳;
发现一下跳为 Leaf-B、出接口为 VSI-Interface20,再查询 ARP 表项,并将 Original L2 Frame 的 srcMAC 修改为 VSI-interface20 的 MAC 地址,将 dstMAC 修改为 VM4 的 MAC 地址。
报文到达 VSI-interface20 接口时,识别到需要进入 VxLAN 20,所以根据 MAC 表对报文进行封装。
封装的 VNI 为 20,Outer srcIP 为 Spine-C 的 IP 地址,Outer dstIP 为 Leaf-B 的 IP 地址;Outer srcMAC 为 Spine-C 的 MAC 地址,Outer dstMAC 为去往目的 IP 的网络中下一跳设备的 MAC 地址。
封装后的报文,根据 Outer dstMAC/dstIP 信息,在 Underlay IP 网络中进行传输,直至到达 remote-VTEP。
Leaf-B 收到 Spine-C 发来的报文后,解封装,得到 Original L2 Frame。在 VxLAN 20 内找到 dstMAC 为 MAC4 的表项,并将报文从对应的接口和 VLAN 中发送出去。
最终 VM4 收到了来自 VM1 的报文。 ?
? VxLAN/UDP 的 MTU 问题 ? UDP(User Datagram Protocol,用户数据报协议),是一种无连接的、非可靠的传输层协议,常被应用于 Tunnel 协议的传输层。主要原因有以下几点: ?
速度快
只要应用进程将 Payload 传给 UDP,UDP 将此数据打包后就立刻传递给 IP 层,而无需作其他额外的机制处理。 ?
首部开销小
相较于 TCP Header 都有 20Bytes 的首部开销,UDP Header 只有 8Bytes。 ?
负载均衡特性
因为无连接,所以 UDP srcPort 可以使用 HASH 计算值,该特性能够在各个网络环节中进行负载均衡优化,例如:ECMP 传输环节,CPU 队列绑定收包环节等。 ? 但相对的,UDP 也存在一个关键的 MTU 分片问题,即:假如 UDP Datagram 进行分片,那么只有 First Fragment 是包含 UDP Header 的,一旦丢包就会导致 Receiver 无法重组出一个完整的 Datagram。如下图所示。
? 所以,当采用 UDP 作为传输层时,需要十分注意 MTU 的设置,才能带来更好的传输性能以及可靠性。根据 VXLAN RFC7348 中的建议,VxLAN 封装包不应该分片,否则在接收端 VTEP 上会丢弃分片的报文,导致无法正确解封装。
通常的,VM/Host 的默认 MTU 是 1500Bytes,即 Original L2 Frame 最大为 1500Bytes。在 VTEP 封装上 VxLAN Overhead 的 50Bytes(VxLAN header + UDP Header + Outer IP/MAC Header)之后,VxLAN 封装包的总长度就达到了 1550Bytes。 ? 如果希望不对 VxLAN 封装包进行分片,可以通过 2 种常规手段来实现: ?
减小 VM/Host 的 MTU。
加大 Underlay 网络的 MTU。
根据实际的场景,需要考虑采用不同的实现方式。
DCN 场景中的 VxLAN MTU
在 DCN 场景中,由于运营商对整网环境具有把控能力,所以通常会采用从 “业务需求出发“ 的原则,即:调整 Underlay MTU 以适应 VM/Host MTU 的需求。所以,极端情况下,Underlay MTU 可能被设置为 9000Bytes。
DCI 场景中的 VxLAN MTU
并跨越两个地理位置分离的 DC(数据中心),通过 L3 路由广域网(WAN)或其他数据中心互连(DCI)传输连接的场景中。因为 VxLAN 封装包需要经过并非完全可控的第三方承载网络,所以对 MTU 的规划需要更加严谨。所以通常采用 “从适配性出发“ 的原则,即:对 VM/Host MTU 进行控制,确保在整个端到端的承载网中均小于 Underlay MTU。 ? 以一个内层 ping 包(长度为 1422Bytes)为例,计算各层封装的长度如下表,发现最终的 VxLAN 封装包大于 1500Bytes,此时就需要修改 Inner MTU 以及 Inner App 的长度值,使其小于等于 1500Bytes。
?
? EVPN MP-BGP 控制面协议
? EVPN (Ethernet VPN)是一个 L2 VPN(L2-in-L3)协议,最初的设计目的是为了替换落后的 VPLS(Virtual Private LAN Service),号称为 Next Generation L2 VPN(下一代的 L2 VPN)。 ? 后来,EVPN 逐渐演进为一套通用的 Control Plane 协议,而不是具体为了承载业务的 Data Plane 协议。EVPN Control Plane 可以与多种不同的 Data Plane 技术(包括:MPLS、SRv6、VxLAN 等)结合使用实现一套完整的数控分离 SDN 方案。 ? EVPN Control Plane 的全称为 EVPN MP-BGP(Ethernet VPN base on Multi-Protocols BGP),是一种基于 MP-BGP 协议可扩展性的实现方式,增加新的协议类型和路由类型,包括: ?
L2 VPN AFI(Address Family Identifier,地址族标识)
EVPN SAFI(Subsequent Address Family Identifier,子地址族标识)
EVPN NLRI(Network Layer Reachability Information,网络层可达性信息)
??EVPN VxLAN SDN 方案
? 在引入 EVPN 作为 VxLAN 的 Control Plane 之前,需要通过手工的方式建立静态 VxLAN 隧道,即:手动指定 VxLAN Tunnel 的 local-VTEP 和remote-VTEP 的 IP 地址对,并构建 Tunnel。手工静态配置的方式在集中式 VxLAN L3 Gateway 组网方案中或许还能够勉强接受,但在大规模的分布式 VxLAN L3 Gateway 组网方案中会出现较为严峻的挑战,主要有 2 个方面: ?
网络扩展困难:网络变更需要手动修改集群配置,容易出现 “雪花设备“ 故障。
BUM 洪泛流量占比大:所有 VTEP 都需要通过 Flood and Learn(洪泛和自学习)来完成数据转发之前的 ARP 表项和主机路由表项学习。
为了解决这个问题,需要在 VxLAN 网络中引入 Control Plane 方案来提供灵活的运维管理支撑。目前最为流行和成熟的组合就是 EVPN VxLAN(RFC6624),依托于 BGP 在 E-BGP 和 I-BGP 场景中的适配性,也使得 VxLAN 不仅局限于 DCN(数据中心网络)场景,还能应用于 DCI(数据中心互联)场景。
? 相应的,采用 EVPN 作为 VxLAN 的 Control Plane 带来了 2 个核心优势: ?
EVPN 可实现 VTEP 自动发现、VxLAN Tunnel 的自动建立,从而降低网络运维的复杂度和提升了网络可扩展性。
EVPN 可实现 IP、MAC、VNI 等 ARP 和主机路由信息的自动宣告,从而有效减少了 BUM 泛洪流量。
? EVPN VxLAN 的路由类型
? EVPN 基于 MP-BGP NLRI 扩展引入了 5 种新的路由类型(Route Type),如下: ?
Type1. Ethernet Auto-Discovery Route(Ethernet 自动发现路由)
Type2. MAC/IP Advertisement Route(MAC/IP 通告路由)
Type3. Inclusive Multicast Ethernet Tag Route(集成多播 Ethernet Tag 路由)
Type4. Ethernet Segment Route(Ethernet 段路由)
Type5. IP Prefix Route(IP 前缀路由)
在 EVPN VxLAN 场景中,NVE(交换机)充当 PE 的角色,同时具备了 BGP Peer 和 VTEP 的功能,下文中统称为 VTEP Peer。其主要应用了 Type2、Type3、Type5 这 3 种路由类型,下面重点介绍这些路由类型的定义和作用。 ?
Type2:MAC/IP Advertisement Route(MAC/IP 通告路由)
Type2 Route 的 EVPN NLRI 字段如下: ? ??Route Distinguisher: 指示一个 EVPN Instance 的 RD 值,用于区分不同的 EVPN Instances。每个 EVPN Instance 都具有一个对应的 BD(二层广播域)。
? ??Ethernet Segment Identifier: EVPN 允许在同一物理网络上创建多个虚拟网络,这些虚拟网络被称为 Ethernet Segment。而 Ethernet Segment Identifier 就是该虚拟网络的唯一标识。在 VxLAN 场景中,ES 就是 VxLAN Tunnel,ESI 用于唯一标识一个 VxLAN Tunnel 的连接。
? ??Ethernet Tag ID 指示当前设备配置的以太网 VLAN ID。
? ??MAC Address Length 指示该 Route 携带的 host-MAC 地址的长度。
? ??MAC Address 指示该 Route 携带的 host-MAC 地址。 ?
??IP Address Length 指示该 Route 携带的 host-IP 地址的掩码长度,为 32bits(IPv4)或 128bits(IPv6)。
? ??IP Address 指示该 Route 携带的 host-IP 地址。 ?
??MPLS Label1 指示该 Route 携带的 L2 VNI,用于标识不同的 BD。 ?
??MPLS Label2 指示该 Route 携带的 L3 VNI,用于标识不同的 VRF(L3 VPN)。VxLAN 网络中为了实现不同租户之间的隔离,需要通过不同的 VRF 来隔离租户的路由表。 ? 从上述字段可见,Type2 Route 的关键特性就是支持对称 IRB(Integrated Bridging and Routing,集成的桥接和路由),能够同时发布 L2 MAC Switching 和 L3 IP Routing 信息,以此来支撑 VxLAN L2 和 L3 Gateway 应用场景。
? 基于这样的特性,Type2 Route 非常适用于云计算虚拟机迁移的场景(MAC Mobility,MAC 移动性),可以有效避免了虚拟机迁移期间所带来的 IP 地址更改,以及重新配置网络的问题。例如:当一台 VM 从 VTEP1 迁移到 VTEP2 时,VTEP2 会学习到该 VM 的 ARP 信息(通过 VM 发出的 gARP 实现),并生成 VM 对应的 Type2 Route,然后传递给 VTEP1。VTEP1 收到后,感知到 VM 的位置发生变化,触发 ARP 探测,当探测不到 VM 时,则会撤销 VM 在本地的 ARP 和主机路由信息。
VTEP 应用 Type2 通告 host-MAC 地址
当 VTEP 是 VxLAN L2 Gateway 时,VTEP Peer 之间可以通过 Type2 Route 来互相学习对方的 host-MAC Table,包括:host-MAC、BD、Interface 等信息。 ? 如下图所示,Leaf1、Leaf2 是 VxLAN L2 Gateway,Host1、Host2 属于同一个 VxLAN 子网,Leaf1 向 Leaf2 通告它的 host-MAC Table。 ?
Host1 通过特定的 Interface 和 BD 接入到 Leaf1 时,通常会触发 ARP、DHCP 等广播流量。Leaf1 以此来学习到 Host1 对应的 Host1-MAC 并记录在 BD 的 host-MAC Table 中。
随后 Leaf1 向 Leaf2 发送 Type2 Route,携带了 EVPN Instance RD、Host1-MAC、L2 VNI、VTEP IP 等信息。
Leaf2 收到 Type2 Route 后,根据 L2 VNI 匹配到相应的 BD,并将 Host1-MAC 保存在 BD 的 host-MAC Table 中。
VTEP 应用 Type2 通告 host-IP 精确路由
在 VxLAN 网络中,要想实现跨网络之间的三层互访,就需要在 VxLAN L3 Gateway 中应用 L3 VPN Instance 和隔离的 Route Table 来完成 IP Routing。 ? 当 VTEP 是 VxLAN L3 Gateway 时,VTEP Peer 之间可以通过 Type2 Route 来互相学习对方的 host-IP Table,包括:host-IPv4 /32 或 host-IPv6 /128 精确路由、Interface、L3 VNI 等信息。 ? 以较为复杂的 “分布式 VxLAN L3 Gateway 组网” 场景为例。如下图所示,Leaf1、Leaf2 同时作为 VxLAN L2/L3 Gateway,Host1、Host2 属于不同的 VxLAN 子网,Leaf1 向 Leaf2 通告它的 host-IP Table。 ? Host1 通过特定的 Interface 和 BD 接入到 Leaf1 时,通常会触发 ARP、DHCP 等广播流量。
L2 Gateway 特性:学习到 Host1 对应的 Host1-MAC 并记录在 BD 的 host-MAC Table 中。
L3 Gateway 特性:学习到 Host1 对应的 Host1-IP 并记录在 L3 VNI 对应的 VRF 的 host-IP Table 中。
随后 Leaf1 向 Leaf2 发送 Type2 Route,携带了 EVPN Instance RD、Host1-MAC、Host1-IP、L2 VNI、L3 VNI、VTEP IP 等信息。 ? Leaf2 收到 Type2 Route 后,根据 L2 VNI 匹配到相应的 BD,并将 Host1-MAC 保存在 BD 的 host-MAC Table 中。
L2 Gateway 特性:根据 L2 VNI 匹配到相应的 BD,并将 Host1-MAC 保存在 BD 的 host-MAC Table 中。
L3 Gateway 特性:根据 L3 VNI 匹配到相应的 VRF,并将 Host1-IP 保存在 VRF 的 host-IP Table 中。
VTEP 应用 Type2 实现 ARP 广播抑制
同一个 VxLAN 子网属于一个 “大二层“ 虚拟网络,子网内的主机要互相通信就需要知道对方的 MAC 地址,传统的方式是发出 ARP Request 广播报文。而在 EVPN 场景中,则可以应用 Type2 实现 ARP 广播抑制,能够有效减少 ARP 洪泛的流量。 ?
首先,VxLAN L3 Gateway 之间通过 Type2 Route 互相宣告 ARP 表项信息(host-MAC/IP)。
然后,VxLAN L3 Gateway 通过传递 ARP 类型路由,将 ARP 表项信息传递给 VxLAN L2 Gateway。
最后,VxLAN L2 Gateway 开启 ARP 代答功能后,就会根据 ARP 表项信息生成 ARP 广播抑制表,包括:host-IP、host-MAC、VTEP、VNI 等信息。
完成控制面的配置后,当 VxLAN L2 Gateway(e.g. Leaf1)再收到从 Host1 向 Host2 发出的 ARP Request 时,就会先查看自己的 ARP 广播抑制表,发现有 Host2 的 MAC-IP 记录,则直接将 ARP Request 报文中的广播 MAC 地址替换为目的单播 MAC 地址(广播变单播),然后原路 Reply,从而达到 ARP 广播抑制的目的。
但需要注意的是,Type2 Route 和 ARP 广播抑制只是减少了 ARP 洪泛流量,但不能完全避免,例如下面场景: ?
新上线的可能是 “静默主机“,它不会自动触发 ARP、DHCP 等广播流量,所以上挂 VTEP 不能被动学习其 MAC 地址。首次访问 “静默主机” 时,还是需要在 VxLAN 子网中广播 ARP Request 报文来获得对方的 MAC 地址。
在 VTEP 没来及的学习到 ARP 广播抑制表项的时候,也会按照正常的流程进行广播。
Type3:Inclusive Multicast Ethernet Tag Route(集成多播 Ethernet Tag 路由)
通过应用 Type3 Route 可以实现 VTEP Peers 的自动发现和认证,并在 VTEP Peer 之间互相传递 L2 VNI 和 VTEP IP 地址信息。 ? Type3 Route 的 EVPN NLRI 字段如下: ?
Route Distinguisher:指示 EVPN Instance 的 RD 值。
Ethernet Tag ID:指示当前设备配置的以太网 VLAN ID。在 Type3 Route 中为全 0。
IP Address Length:指示该 Route 携带的 local-VTEP IP 地址的掩码长度。
Originating Router's IP Address:指示该 Route 携带的 local-VTEP IP 地址。
Flags:在 VxLAN 场景中,该字段没有实际意义。
MPLS Label:指示该 Route 携带的 L2 VNI,用于标识不同的 BD。
Tunnel Type:指示该 Route 携带的隧道类型。在 VxLAN 场景中,该字段为 “6: Ingress Replication”,即头端复制类型。
Tunnel Identifier:指示该 Route 携带的隧道信息。在 VxLAN 场景中,该字段也是 local-VTEP IP 地址。
VTEP 应用 Type3 建立头端复制列表
前面提到 Type2 Route 只能 “抑制“ ARP 洪泛流量,但不能完全避免。这些不能避免的 BUM 流量,还是需要通过头端复制或核心复制方式来进行广播或组播。 ? 以头端复制为例,VTEP Peer 之间可以通过 Type3 Route 宣告来实现自动创建头端复制列表,包括:L2 VNI、src-VTEP IP、dst-VTEP IP 等信息。如下图所示,Leaf1、Leaf2、Leaf3 作为 VTEP,Leaf1 向 Leaf2、Leaf3 发送 Type3 Route。 ?
在 Leaf1 上完成 VTEP IP、L2 VNI、EVPN Instance 等相关配置后,Leaf1 会向 Leaf2、Leaf3 分别发送 Type3 Route,携带了 L2 VNI、local-VTEP IP、EVPN Instance RD 等信息。
Leaf2、Leaf3 收到来自 Leaf1 的 Type3 Route 后:
如果 Leaf1 VTEP IP 三层路由可达,则建立一条 VxLAN Tunnel。
如果如果 remote-VNI 与 local-VNI 相同,则新建一个头端复制表,用于后续 BUM 报文广播。
Type5:IP Prefix Route(IP 前缀路由)
Type3 Route 的 EVPN NLRI 字段如下: ?
Route Distinguisher
指示 EVPN Instance 的 RD 值。 ?
Ethernet Segment Identifier
用于唯一标识一个 VxLAN Tunnel 的连接。 ?
Ethernet Tag ID
指示当前设备配置的以太网 VLAN ID。 ?
IP Prefix Length
指示该 Route 携带的 IP Prefix 的掩码长度。 ?
IP Prefix
指示该 Route 携带的 IP Prefix,可以是精确路由(/32 或 /128),也可以网段地址(/0-32 或 /0-128),主要是传递网段路由。 ?
GW IP Address
指示默认网关地址。该字段在 VxLAN 场景中没有实际意义。 ?
MPLS Label
指示该 Route 携带的 L3 VNI,用于标识不同的 VRF。 ?
VTEP 应用 Type5 通告 host-IP 网段路由
Type5 Route 有 2 个主要的应用场景: ?
在没有 IP 地址重叠的网络规划中,可以配置 VTEP 通过 Type5 Route 宣告 host-IP 网段路由,而不是 host-IP 精确路由,以此来有效减少 VxLAN L3 Gateway 设备的路由表项。
在 VxLAN 网络和外部 IP 网络之间需要互联互通时,可以通过 Type5 Route 将外部 IP 网段宣告到 VxLAN L3 Gateway,继而实现 VxLAN 网络中的主机能够与外部网络之间进行 IP 访问。
如下图所示,Leaf1、Leaf2 作为 VxLAN L3 Gateway,其中 Leaf1 连接了一个外部网络的 192.168.1.0/24 网段。 ?
Leaf1 探测到 192.168.1.0/24 网段路由后,向 Leaf2 宣告 Type5 Route,包括:EVPN Instance RD、IP Prefix、L3 VNI、Leaf1 VTEP IP 地址等信息。
Leaf2 收到 Type5 Route 后,学习到 192.168.1.0/24 网段信息,并将其保存在相应的 Route Table 中,其下一跳为 Leaf1 VTEP IP 地址。
后续,Leaf2 就可以直接转发 dstIP 为 192.168.1.0/24 网段的 IP 报文了。
? ?
编辑:黄飞
?
评论