研究数据中心如何进行网络虚拟化配置之前,我们需要熟悉 EVPN的基础知识。如前所述,EVPN是一种为网络虚拟化提供控制平面的解决方案。用最简单的术语来说,EVPN是一种连接被三层网络分隔的二层网段的技术。EVPN通过在三层网络之上构建出一个叠加的虚拟二层网络来实现此目的。EVPN 使用 BGP 作为控制协议,在数据中心中使用 VXLAN 进行数据包封装。
本章将回答如下问题:
- 什么是 EVPN,以及为什么 EVPN 如此流行?
- 部署 EVPN 的控制平面模型是什么?
- 哪些 BGP 组件支持 EVPN ?
- EVPN 桥接与传统 802.1Q 桥接有何不同?
- 如何支持双归属主机?
EVPN 是一种相当复杂的解决方案,产生于服务提供商网络想寻找 VPLS (Virtual Private LAN Service,虚拟私有局域网服务) 替代方案的想法。
VXLAN 是为基于路由的Underlay 网络之上的二层点对多点的虚拟网络提供了数据平面封装,而 EVPN则定义了控制平面技术。 EVPN规范由IETF的NVO3(Network Virtualization Overlay over L3)工作组创建。在本章中,我们仅关注 EVPN 控制平面的内容。
VXLAN 只定义了如何封装和传输数据,但没有提供一种高效的方式来学习和管理网络中的二层和三层信息。而 EVPN 则通过控制平面来动态地学习和分发网络中的 MAC 地址和 IP 地址,从而使网络更具可扩展性和可靠性。EVPN 通过 BGP(边界网关协议)来进行这些信息的分发,它提供了更强的多点到多点的灵活性,并且能够在不依赖广播的情况下,提升网络性能和效率。
EVPN 的作用:
-
动态地址学习:通过 BGP 分发和管理 MAC 和 IP 地址,避免传统的广播洪泛。
-
降低广播流量:相比传统的二层网络,EVPN 减少了广播域中的不必要流量,提高了网络的效率。
-
提高网络扩展性:可以更有效地支持大规模多租户和虚拟网络环境,同时提供多点到多点的连接能力。
一个Overlay 网络虚拟化控制平面必须解决以下问题:
- 提供内部到外部地址的映射
- 确定内部地址所属的虚拟网络
- 在多个封装情况下识别所用的封装
除此之外,VXLAN 还需要知道哪些 VTEP属于哪些虚拟网络,以便多目的地以太帧,例如: BUM (广播、未知单播和多播)被转发到相应的目的端点。
EVPN 更进一步,还提供了以下的支持:
- ARP/ND 抑制
- 路由
- 多归属节点
- 三层多播
除此之外,还支持执行个别特定于设备的配置,例如:
- 创建 VTEP
- 将 VXLAN 虚拟网络与虚拟网络对应的本地 VLAN 进行关联
- 指定处理多目的地以太帧的方法:入口复制 (也称为头端复制)或 Underlay 网络多播
- 处理 Underlay 网络多播相关的配置
VTEP在何处?
VTEP 作为“内存刷新器”处在网络虚拟 Overlay 的边缘,用于连接非虚拟网络与虚拟网络。VTEP位于数据包被封装进入 Overlay 网络处,以及数据包被解封离开Overlay 网络处。 VTEP 离主机端点越近,虚拟化状态改变越不会影响到网络的核心。
如果将主机端点设置为 VTEP,构成 Clos 拓扑的路由器就可以仅作为路由器工作。这将使网络保持不变,并且使网络虚拟化看起来更像是一个应用程序,而不是一个网络功能。云提供商如 Amazon 和 Microsoft 在 VPC 解决方案中就使用了该模型。VPC 内子网通信是通过路由而不是桥接进行转发的。每个云提供商使用的封装方式也各不相同,并未使用 VXLAN。他们还使用了专属的控制平面来分配内部地址到外部地址的映射。云服务提供商既不提供二层连接也不提供多播,因此他们无需担心处理多目的地以太帧的问题。
一些使用 EVPN 的私有云解决方案在主机上使用 FRR 启动 EVPN。这是一种标准的无控制器的解决方案,同时结合基于主机的 eBPF 和iptables,可以提供与 VMware等公司相同的解决方案。
**对于 Clos 拓扑,除了主机之外,VTEP 下一个理想位置是 leaf 节点。**将 VTEP 放在 spine 或 super-spine 上没有意义,这是因为 EVPN 用于连接被底层路由网络分隔的虚拟二层网段,而在二层 Clos 网络中,二层网络终结于 leaf 节点。leaf 节点部署VTEP是数据中心中最常见的 EVPN 部署模型。
是否是一个协议统治所有?
如前所述,NVO3 由两部分组成:一个 Underlay 路由网络和 Overlay 网络。我们讨论了如何使用 OSPF和BGP 作为路由协议来构建 Underlay 路由网络。BGP特别是eBGP,在数据中心比 OSPF 流行得多。当 EVPN 出现后,鉴于服务提供商将 EVPN作为一个 VPN 解决方案,传统的供应商寻求一种和服务提供商部署 EVPN 类似的解决方案。在该方案中,将OSPF 或IS-IS 用于构建 Underlay 路由网络,iBGP 用于交换虚拟网络信息。
FRR采用创新的方式通过无编号 BGP (unnumbered BGP)进行 BGP 配置,它也是第一个使用单一eBGP 会话来构建 Underlay 路由网络和交换拟网络信息的路由软件。 换句话说,在 BGP 中交换 MAC 地址与在 BGP中启用另一个 AFI/SAFI(如IPv6) 一样简单。
IETF是网络虚拟化技术的主要标准组织,尤其是那些基于IP和MPLS 的技术。VXLAN规范是一类信息性的 RFC: RFC7348。绝大多数的网络虚拟化工作是由IETF的 NVO3(Network Virtualization Overlay over L3,叠加于三层网络之上的网络虚拟化) 工作组牵头的。但是进展缓慢,除了在一些术语上达成一致以外,作者并没有发现来自 NVO3 工作组的任何工作被主流的网络供应商或者 Linux 内核所支持。但是,EVPN 相关的工作在 L2VPN 工作组内正在展开。结合了 VXLAN的 EVPN技术正处于标准化工作流程内的草案阶段。但是规范本身已经稳定了有一段时间了有多个供应商利用开源路由套件 FRR,已经支持了大多数 EVPN 的特性。
iBGP特征
iBGP对等互联通常发生在被路由网络分隔的对等设备之间。这与eBGP 不同,eBGP 对等互联总是在物理链路两侧的对等设备之间。例如,在 Clos 拓扑的 NVO3用例中,iBGP 在 leaf 节点之间建立对等互联。这意味着每个 leaf 节点会与其他所有leaf 节点会建立一个 iBGP 对等互联会话。这种网状的 iBGP 对等连接关系会很快变得不可扩展而且脆弱。
为了克服此问题,引入了两种独立的解决方案: BGP 联邦(BGPconfederations) 和路由反射器 RR (Route Reflectors)。在这两种方案中,RR 是迄今为止最受欢迎的解决方案,也是人们在 NVO3 中部署 iBGP 的考虑采用的方式。
RR遵循hub-and-spoke模式,其中所有 iBGP接入设备都连接到一组中央RR 服务器。RR 的工作是为路由计算最佳路径,并将其通告给每个 RR 客户端。然而与eBGP 不同,RR 不会修改路由的下一跳网络地址,而是保留它收到的路由通告中的值。
为了说明这一点,请查看图 16-1。该图演示了 eBGP和 iBGP 在传播其学习到的路由时对下一跳的不同处理。eBGP 总是将路由的下一跳修改成发送通告的路由器,称为 next-hop-self。而 iBGP 在向对等方发送通告时不会修改路由的下一跳。如图所示,A 可以选择一条完全不经过 B 的数据路径来到达 10.1.1.0/24
。如果假定 B为 RR,这会将重复的路由计算卸载到 B 上,并且可以避免 iBGP 接入设备之间的网状连接关系。由于这个原因,计算节点作为 RR 的情况并不少见。如果存在多个RR,这些 RR 之间甚至不必相互通信即可完成工作,如图 16-2 所示。这意味着可以将CIos 网络仅作为连接层(即 Underlay 网络),以保持其简单。但是这种情况并不常见。
图16-1:比较eBGP和iBGP进行下一条传播的行为
在CIos 拓扑中,更典型的部署是由 spine 节点充当 RR。spine 节点是 Underlay 网络的一部分,并不涉及虚拟网络。spine 节点也是连接所有 leaf的节点。因此,spine节点天然适合充当 RR。唯一的要求是需要所有的 spine 节点都能够充当 RR,以确保所有spine节点具有相同的性能特征,并且RR的故障特征能够保持对Underlay网络和数据包转发相同。
图16-2:RR服务器和纯三层Underlay网络
总之,iBGP部署会使用RR。在Clos拓扑中,spine节点自然地成为RR。
Underlay 和 Overlay 协议的分离
如前所述,传统网络供应商在 Underlay 网络和 Overlay 网络中使用了不同的路由协议:Underlay 网络使用OSPF或IS-IS 路由协议,Overlday 网络使用iBGP路由协议,采用 spine 节点作为 iBGP的RR。思科 ACI解决方案采用了该型,在 Underlay 网络中采用了 IS-IS 作为路由协议。
该模型的主要缺点如下:
- 如果你已经在 Underlay 中使用了eBGP,那么近新构建现有的 Underlay 路由协议将是破坏性的。
- 更多的协议意味着更多的复杂性,并且在出现问题时更难进行故障排除
使用单一eBGP
另一种方法是使用单一eBGP 会话来交换 Underlay 和 Overlay 路由信息。该方法首先在 FRR 中被实现。与许多 BGP 专家交谈之后,作者认为该选项对数据中心的 CIos拓扑来说是一种更简单更优雅的解决方案。
使用一个 eBGP 会话来同时传输 Underlay 和 Overlay 路由信息可以简化配置,FRR在避免修改 Underlay 路由下一跳的同时,会自动避免修改虚拟网络路由的下一跳。其他使用单一 eBGP 会话的实现,需要使用类似如下代码段的路由配置。
route-map NH_UNCHANGED permit 10
set ip next-hop unchanged
router bgp ...
...
neighbor 169.254.0.1 route-map NH_UNCHANGED out
...
spine 节点上的 BGP 进程会同时保留接收到的 Overlay 和 Underlay 信息。它使用Underlay 信息来构建 Underlay 的数据包转发表。它还会保留从 leaf 节点接收到的Overlay信息,以将其传递给其他leaf节点,这个功能类似于RR。然而,除非另有指示,否则 spine 节点对虚拟网络一无所知,并会丢弃有关虚拟网络的信息。当 FRR 识别出同一会话被用于承载 Underlay 路由和Overlay 路由时,会自动让 spine 节点保留该信息。其他支持单一eBGP 会话模型的供应商实现则需要添加额外的配置。例如对于 Cisco 路由器,你必须将 keep-route-target-all 添加到 EVPN 配置中。
支持虚拟网络路由的BGP组件
BGP 添加了一些组件来支持通告虚拟网络路由。这些组件首先出现在服务提供商网络的MPLS L3VPN的上下文中。 第一个问题是使用什么 AFI/SAFI。EVPN 使用了l2vpn/evpn
这种AFI/SAFI。这是因为 EVPN被认为是一种二层的 VPN。接下来的问题是,BGP 必须能够处理允许在虚拟网络之间存在重复地址的模型。
路由标识符RD作为第一个标识符,路由目标RT作为第二个标识符。
路由标识符 (RD)
RD 是一个八字节的值,该值被添加到每个虚拟网络地址中,以保持该地址在全局上唯一。 RFC 4364 的 4.2 节定义了 RD,及其格式和用途。这里有三种不同的 RD 格式。RFC 7432 定义了 EVPN 中使用的 RD 格式,如图 16-3 所示。
我们知道 VNI(Virtual Network Instance) 的长度是三字节,那么它是如何在 RD的两字节空间中进行编码的呢? 这不是问题,因为我们假定实际上没有 VTEP 会需要支持超过 64000 个 VNI。目前大多数交换硬件在单个设备上都不支持这么多的VNI。即使能够做到,也不会在单个设备上支持这么多的 VNI,因为这样该设备故障将影响到很多客户。路由器的 IPv4 回环地址与 VNI 结合可以使 RD 在整个网络中是唯一。因此,RD 中的 VNI-specific 值是 VNI的设备本地编码,不需要是 VNI的绝对值。
由于路由器的回环IP地址是 RD 的一部分,因此具有相同虚拟网络IP的两个节点最终将具有不同的 RD。这样可以区分相同IP地址的不同VPN实例。
RD 被编码在 MP_REACH_NLRI
和 MP_UNREACH_NLRI
属性的 NLRI字段中。
路由目标(RT)
RT 是添加到虚拟网络 NLRI中的一个附加路径属性。RT 用于对其所属的虚拟网络进行编码,用于控制VPN路由的进出口策略。通告虚拟网络及其地址的 BGP 设备使用称为 export RT 的特定 RT 来代表通告的虚拟网络。接收和使用通告的 BGP 设备使用这个 RT 来决定将路由添加到哪个本地虚拟网络中,此时该 RT称为 import RT。在典型的 VPN配置中网络管理员必须同时配置 import RT 和export RT。
RFC 4364 的4.3.1 节定义了 RT 和使用。RFC 8365 的 5.1.2.1 节描述了使用 VXLAN的 EVPN的RT 编码,如图 16-4 所示
图16-4:EVPN-VXLAN 中使用的 RT格式
如下是这些字段的定义:
ASN
通告地址的 BGP 设备的 ASN,长度为两个字节。A
一个 1 比特的字段,表示 RT 是自动派生的还是手动配置的Type
一个 3 比特的字段,表示 EVPN 使用的封装。如果是 VXLAN,该字段的值是1,如果是 VLAN,该字段的值是 0。Domain-ID(D-ID)
一个 4 比特的字段,通常为零。在某些情况下,如果 VXLAN 编号空间重叠,那么使用该字段来表示 VNI 所属的管理域。Service ID
一个三个字节的字段,包含虚拟网络标识符。 对于 VXLAN,该字段是三字节的 VNI。 对于 VLAN,只使用了这三个字节的低12位。
RD和RT的使用
每个 BGP 实现都维护两种路由表
- 全局路由表
- 针对每个虚拟网络的一个路由表
BGP 在全局表上运行最佳路径算法,为每个IP地址前缀选择一条路径向其对等方进行通告。因为对于每个通告发起方来说,RD 都是唯一的,所以一个路由的所有副本都将被通告给其邻居。为了将路由导入到虚拟网络的路由表中,BGP首先使用import RT 条目,从全局表中选择需要导入到虚拟网络中的特定候选路由。然后,它再次在导入的候选路由上运行最佳路径算法,但这一次是在虚拟网络的路由表的上下文中运行。如果一个相同的地址在被通告时携带了多个 RT,则最佳路径算法会选择最佳的一条。
一个VPN实例通常具有一个唯一的RD,但可以有多个RT(导入和导出)
工作示例
- 假设有两个EVPN实例:
VPN-A
和VPN-B
。VPN-A
的RD为100:1
,RT为200:1
(导入和导出)。VPN-B
的RD为100:2
,RT为200:2
(导入和导出)。
- 如果
VPN-A
中的一个路由192.168.1.0/24
被通告出去,它将被标记为RD:100:1, RT:200:1
。 - 另一个设备接收到这个路由后,会检查其导入RT策略。如果它的导入RT策略包含
200:1
,它将接收该路由。
总结
- RD 用于区分不同VPN实例中的相同路由前缀。
- RT 用于决定VPN实例之间的路由共享策略。
FRR 中RD和RT的使用
EVPN 的标准规定 RT 能够按需自动派生。虽然并非所有实现都支持该模型,但FRR 支持该模型。如前所述,假定以 VXLAN 作为封装,FRR 会对 RT 进行编码。
大多数其他实现都要求通过一条配置来声明该目标,例如: route-target import auto
FRR 维护了一个比特位映射,每个比特位代表一个单独的 VNI。RD中的 VNI-Specific 两个字节就来自该映射上对应比特位的值。FRR 还允许管理员为特定的虚拟网络手动配置 RT,但不处议这样做,因为这样可能会出错。
EVPN路由类型
IPv4单播路由是通过MP_REACH_NLRI
和MP_UNREACH_NLRI
属性来通告的。对于大多数的 AFI/SAFI组合,UPDATE 消息携带的可达性信息的结构和内容在该AFI/SAFI中是相同的。但是对于EVPN并非如此。EVPN 需要交换不同的信息。UPDATE 消息可能是通告一个特定 MAC 地址的可达性,亦或是一个虚拟网络的可达性。另外,与IPv4 和IPv6 不同,EVPN同时使用了 AFI和 SAFI,因此无法分离单播和多播地址的信息。为了对信息进行额外的细分,EVPN NLRI 会通过路由类型对不同类型的信息进行编码。表 16-1 列出了适用数据中心的路由类型。
Route Type | What it carries | Primary use |
---|---|---|
RT-1 | Ethernet Segment Auto Discovery | 数据中心支持多归属端点,作为 MLAG 的替代 |
RT-2 | MAC, VNI, IP | 通告虚拟网络中特定 MAC 地址及其IP地址的可达性 |
RT-3 | VNI/VTEP Association | 通告虚拟网络的VTEP 对应的 VNI |
RT-4 | Designated Forwarder | 确保仅单个 VTEP 转发多目的地以太到多归属端点 |
RT-5 | IP prefix, VRF | 通告IP前缀,例如:汇总路由以及与该前缀关联的 VRF |
RT-6 | Multicast group membership | 包含VTEP 下挂的终端所请求加入的多播组的信息 |
处理BUM的通信选择
在网络中,BUM 是 Broadcast, Unknown Unicast, and Multicast 的缩写,代表三种类型的流量:
- Broadcast(广播): 向网络中所有主机发送的数据包。广播数据包会被发送到网络中的所有设备,常用于ARP请求、DHCP发现等。
- Unknown Unicast(未知单播): 单播数据包的目标地址在接收设备的MAC地址表中找不到时,设备会将该数据包泛洪到所有端口。通常发生在数据帧到达交换机时,交换机还没有学习到该目标MAC地址的情况下。
- Multicast(组播): 发送给特定组的一组主机的数据包,常用于视频会议、实时数据分发等。组播流量会被发送到那些加入特定组播组的主机,而不是所有主机。
处理 BUM 流量有两种选择:头端复制或 Underlay 网络的路由多播。 因此每个 VTEP 必须将自己支持的方式告知给其他 VTEP。RT-3 EVPN 消息将携带一个 BGP 属性,称为 PMSI (Provider Multicast Service Interface) ,用来标识该设备支持的 BUM数据包处理方式。PMSI 属性没有定义在常规的 EVPN标准中,而是定义在一个完全不同的标准 RFC 6514 中。下面是EVPN 草案中建议的复制模型的值,其中大多数属于 PIM (Protocol-Independent Multicast,协议无关的多播)。
- 3是PIM 特定源多播 (PIM-SSM)
- 4是PIM稀疏(PIM-SM)
- 5是双向 PIM (Bidir PIM or Bidirectional PIM)
- 6是入口复制 (ingress replication)
许多实现都建议使用入口复制,而不是使用多播。这可能因为这些实现并不支持上述列出的选项。例如,思科的ACI解决方案使用IS-IS来构建多播树,IS-IS甚至没定义在RFC 6514中。最基本的是,如果你使用Underlay网络的路由多播,将无法检测到跨VTEP的配置错误,因为大多数实现并未通告该信息。
EVPN 和桥接
在本节中,我们将探讨 EVPN 如何取代 802.10 的 flood-and-learn 模型。主要区别是 EVPN 使用了 BGP 来分发虚拟网络 MAC 地址的可达性和关联虚拟网络的IP路由,另外 EVPN 不使用 STP。查看图 16-5 所示的拓扑可以了解桥接如何与 EVPN一起工作。
EVPN和Flood-and-Learn模型对比
特性 | Flood-and-Learn(802.1D/802.1Q) | EVPN |
---|---|---|
MAC地址学习方式 | 数据平面泛洪和学习(Flood-and-Learn) | 控制平面学习(通过BGP分发MAC/IP) |
广播流量处理 | 泛洪(Flooding) | 控制平面分发,减少BUM流量,通过组播或入口复制优化 |
环路避免机制 | 依赖STP协议,链路利用率低 | 使用控制平面和多路径ECMP,不需要STP,支持多主冗余路径 |
扩展性 | 规模有限,MAC表膨胀导致问题 | 高扩展性,适合大规模数据中心和多租户网络 |
多租户支持 | 不支持或需复杂配置 | 天然支持多租户隔离和策略控制 |
底层封装 | 无特殊封装,基于以太网帧转发 | 支持VXLAN、MPLS、SRv6等多种封装 |
应用场景 | 小规模网络或传统企业网 | 大规模数据中心、云网络、多租户环境 |
图16-5:EVPN 桥接拓扑示例
Underlay 是路由网络,leaf节点和 spine 节点之间的数据包总是通过路由而不是桥接来传递的。
如前所述,leaf 节点是 VTEP。VTEP需要一个IP地址来发送和接收数据包,通常一个VTEP的所有VNI通常共享同一个IP地址。EVPN 会在所有 leaf节点上启用。
To function as a VTEP, they need an IP address to source and receive packets. Typically, a single IP address is used across all VNIs.
而在 Clos 网络中,仅会在 Leaf 节点与本地服务器之间的互联端口上启用 802.1Q桥接。
设备的本地配置还会定义本地 VLAN到全局 VNI的映射。图 16-5 中,假定红色粗线表示红色 VLAN 映射到红色 VNI,蓝色细线表示蓝色 VLAN 映射到蓝色 VNI。
首先要注意的是,与之前的 Clos 网络图示不同,该图中的子网不限于单个机架。无论红色 VNI 在何处,子网172.16.1.0/24
处于红色 VNI。同理,无论蓝色 VNI 在何处,子网 172.16.101.0/24
处于蓝色 VNI。不同的leaf 节点可以将不同的 VLAN ID 关联到一个子网上,只要这些不同的 VLAN ID 映射到一个全局 VNI 即可。**EVPN 交换的所有信息都是和全局 VNI相关的,并不涉及本地 VLAN 实例的信息。**由于子网跨了多个路由器,子网也会与全局 VNI 相关的。
接下来,每个 Leaf都有第二个IP地址,即VTEP IP地址,在 10.0.127.0/24
子网中与之关联。所有 VXLAN 封装的数据包的源IP地址和目的IP地址都属于该子网。网络管理员还必须确保该 VTEP的IP地址可以被 BGP 发布,否则其他 VTEP 将不知道如何到达该地址。
每个leaf 节点通过 RT-3 路由获得其他 leaf 节点的虚拟网络。因此,leaf01 知道leaf02 和 leaf04 对应红色 VNI,leaf03 和 leaf04 对应蓝色 VNI。类似地,其他 leaf节点也可以从 BGP的 UPDATE 消息中学习得到此信息。
Underlay IP地址:
- Leaf和Spine节点的接口IP地址(
10.0.0.11
,10.0.0.21
)。 - VTEP IP地址(
10.0.127.0/24
子网中的IP地址):用于VXLAN封装的源和目的IP地址。
Overlay IP地址:
- 租户子网IP地址(如
172.16.1.0/24
和172.16.101.0/24
):属于VXLAN VNI中的虚拟网络地址。
采用入口复制方式的 EVPN 桥接
现在,让我们通过数据包序列来了解 EVPN 桥接是如何与头端复制一起工作的。假设 **server101 发送一个数据包到 server104。**由于 server101和 server104 属于同一子网,server101 会发送 ARP 请求数据包询问 server104 的 MAC 地址,该ARP 请求是一个以太网广播数据包,目的 MAC 地址为 FF:FF:FF:FF:FF:FF
,源的 MAC 地址为 server101的 MAC 地址,下文中我们用
M
A
C
101
MAC_{101}
MAC101 表示:
1)这种情况下,从 server101 发送到 leaf01 的数据包与传统桥接的数据包没有区别。leaf01 接收到该数据包,就像传统桥接一样,leaf01 获悉可以通过连接到server101 的端口到达 M A C 101 MAC_{101} MAC101。leaf01 知道该数据包是广播数据包,因此需要发送给红色 VNI的所有接收者。leaf01 使用头端复制将数据包泛洪到所有的相关的leaf节点,在本例中为leaf02 和 leaf04。大多数商用芯片要求配置头端复制中每个隧道端点的下一跳列表。因此可以选择将头端复制任务分散到多个 spine 节点中。
2)leaf01 封装 VXLAN数据包,然后将一个副本发送到 spine01,目的地为leaf02;将另一个副本发送到 spine02,目的地为 leaf04。发到 leaf02 的数据包的目的IP 地址是 leaf02的VTEP 地址10.0.127.12
,其源IP地址是leaf01的IP地址 10.0.127.11
。 同样,发送到 leaf04 的数据包的目的IP 地址为 10.0.127.14
,源IP地址为 10.0.127.11
。
3)当spine01 收到数据包时,将对 VXLAN头中的IP (即leaf02的IP地址)进行路由查找。 然后,spine01 将数据包路由到通向 leaf02 的端口。spine02 也会对发往 leaf04 的数据包执行相同的操作。
4)当这些 VXLAN 封装数据包到达 leaf02 和leaf04 时,leaf02 和 Leaf04 是出口VTEP,因为这些数据包中的目的IP地址是它们的IP 地址,并且 UDP 目的端口表示这是 VXLAN 数据包。因此 leaf02 和leaf04 会对数据包进行解封装,并使用本地 802.1Q桥接来决定将数据包从哪个本地端口发送出去。leaf02 和leaf04都不会以 VXLAN 封装的形式将该数据包发送到任何其他节点,这样就避免了在解封 VXLAN 数据包后再将 VXLAN 封装数据包原路泛洪到 Overlay 网络中,这种做法类似IP 的自转发检测。在 EVPN 中,这个检查被称为“split-horizon check”(水平分割检查)。到此为止,server102 和 server104 都接收到了数据包。
在上述过程中,leaf02 和 leaf04 都不会从泛洪数据包中了解到
M
A
C
101
MAC_{101}
MAC101的任何信息。但是,leaf01 的 MAC 转发表中会有一条新的关于
M
A
C
101
MAC_{101}
MAC101的本地条目。因此,在红色虚拟网络中,leaf01 会通过 BGP 的UPDATE 消息通告
M
A
C
101
MAC_{101}
MAC101的可达信息。具体来说,leaf01 会使用 EVPN RT-2 消息来发送携带{VNI,MAC}的通告。该消息声称可以通过 VTEP leaf01 到达红色虚拟网络中的
M
A
C
101
MAC_{101}
MAC101。leaf01 将该信息传递给其BGP 对等设备 spine01 和 spine02。spine01和 spine02 依次将该消息传递给它们各自的对等 leaf节点: leaf02、leaf03 和leaf04。每个 spine 节点都会产生一个消息副本,因此 leaf 节点会收到该更新的多个副本。leaf 节点收到信息后,会将
M
A
C
101
MAC_{101}
MAC101信息写入它们的 MAC 转发表,并记录
M
A
C
101
MAC_{101}
MAC101是一个远程节点,可以通过 leaf01 的VTEP IP 地址 10.0.127.11
访问。leaf03 没有红色 VNI,因此仅会简单地存储该消息或直接将其丢弃。由于 spine 节点没有虚拟网络的信息,因此它们不知道 leaf03 没有红色的 VNI,对该消息不感兴趣。
如果在leaf04 更新MAC 表之前,server104 的ARP应答就已经到达了 leaf04,那么leaf04 会像广播数据包一样对该数据包进行泛洪,因为此时leaf04还不知道 M A C 101 MAC_{101} MAC101。如果在 leaf04 收到 leaf01的 BGP UPDATE 信息并更新其 MAC 表之后,ARP 应答才到达 leaf04,则leaf04 只会将 ARP 应答直接只发送到 leaf01。如果仅要将数据包单播到 leaf01,leaf04 会根据从 server104 接收的数据头的哈希值,来随机决定将数据包发送到 spine01 还是 spine02。
在红色 VNI中,leaf04 也会通过学习得知MAC 位于连接到 server104 的本地端口。leaf04 使用 EVPN RT-2 路由类型发送 BGP UPDATE 消息,表示可以通过 leaf04 到达红色VNI中的MAC。该消息被同时发送到spine01和spine02,它们再将该BGP UPDATE 消息发送给所有其他 leaf 节点。在 BGP 处理结束时,leaf01、leaf02和leaf04 都会知道可以通过 VTEP leaf01到达红色VNI中的MACo,可以通过VTEP leaf04 到达红色VNI 中的MAC。
EVPN桥接与传统 802.1Q桥接之间的主要区别
- EVPN 通过 BGP的UPDATE 消息将远程 MAC 地址记录到节点的 MAC 表中,而 802.1Q 是从数据包本身学习到的。
- 在EVPN中,从server101到 server104 的数据包的路径与从 server104 到server101的回复路径可以采用不同的路径,而在 802.1Q 桥接中,它们的路径是相同。
EVPN桥接与传统 802.1Q桥接中相同的部分
- 通过标准 802.1Q 学习可以将本地连接的 MAC 写入MAC 表
- 泛洪数据包将发送到虚拟网络中的所有端点
- 每个
{virtual network, MAC address}
两元组都与单个出口端口相关联
采用 Underlay 网络的路由多播方式的 EVPN 桥接
图16-6:采用 Underlay 网络的路由多播方式的 EVPN 桥接数据包序列
使用与上节相同的示例演示 Underlay 网络的路由多播的方式。
数据包序列假定使用PIM-SM,RP位于 spine 节点上。虽然我们在“数据中心中的 PIM-SM”中提到 spine 节点作为 RP 有问题,但是在这里,我们仍将 spine 节点作为 RP,以减少需要描述的数据包序列并简化说明。在 Underlay 网络中,假设我们使用 OSPF 来进行单播路由。我们已经在“多 RP 和 MSDP”中介绍了如何使用任播 RP 来将任何spine 节点作为 RP,但是我们将在本讨论的其余部分中忽略 MSDP。
假设给多播组分配 VNI的过程是通过设备配置完成,而不是通过 BGP 完成。为简单起见,我们为红色 VNI中 BUM流量分配红色多播组 ( G r e d G_{red} Gred),为蓝色 VNI中BUM 流量分配蓝色多播组 ( G b l u e G_{blue} Gblue) 。该分配是在每个 leaf 节点上完成。
图16-6 展示了数据包序列。与入口复制相比,多播数据包序列更复杂,也使得Underlay 网络的路由多播选项变得非常复杂。
1)当红色多播组分配给红色 VNI时,每个 leaf 节点向 RP 发送 PIM Join 消息以请求接收 ( ∗ , G r e d ) (*,G_{red}) (∗,Gred)多播路由。不同的leaf 节点可以选取不同的spine 节点发送此消息。
2)同样,server101会发送对 server104 的ARP 请求。leaf01 收到了该数据包。
Server101 发送 ARP 请求的原因 是为了在与 Server104 通信之前获取它的 MAC 地址,这是二层通信的基本步骤。在 VXLAN 和 EVPN 环境下,这个 ARP 请求会被封装成 VXLAN 多播数据包,通过 PIM-SM 多播机制在网络中传播,以便目标服务器能够响应 ARP 请求。
3)leaf01发送一个PIM Register 数据包到 spine 节点,此 spine 节点是离自己最近的RP。假设它选择 spine01为最近的RP。
4)spine01接收到 PIM Register 消息,通过查询其状态,spine01 得知它有两个侦听器leaf02和leaf04。spine01将 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred) 多播组的 PIM Join 消息发送到leaf01。 spine01 为 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred)多播组创建一个多播条目,该条目的RPF接口为指向 leaf01的接口,出接口则为指向 leaf02 和leaf04 的两个接口。RP通常将其通过 PIM Register 接收到的数据包发送到 ( ∗ , G r e d ) (*,G_{red}) (∗,Gred)多播组上。
在多播路由中,RPF接口 是指 Reverse Path Forwarding Interface(反向路径转发接口)。RPF 是一种机制,用于确保多播路由器以最有效的路径转发数据包,并防止多播路由环路的产生。它是多播路由的核心组件之一,尤其在 PIM(Protocol Independent Multicast) 协议中广泛使用。
5)leaf01 从spine 接收到 PIM Join 消息,并设置 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred) 的多播条目,出接口指向 spine01。
6)因为ARP请求实际上尚未到达leaf02 或leaf04 中的任何一个,所以会继续发送ARP 请求。在 leaf01 接收到下一个 ARP 数据包后,leaf01 将数据包封装在VXLAN头中,其目的IP 地址设置为 Gd,源IP 地址设置为它的 VTEP IP 地址10.0.127.11
。在多播路由表中进行查找后,数据包被发送到 spine01。
7)spine01 在接收到该数据包之后,将发送一个 PIM Register Stop 消息到 leaf01。否则leaf01在红色VNI中收到每个新ARP数据包后,都会继续发送PIM Register 数据包。
8)spine01 还会根据多播路由表将数据包转发到 leaf02 和 leaf04。
9)leaf04 接收到数据包,并注意到自己的多播路由表中没有 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred)的路由条目。但leaf04 中有一条 ( ∗ , G r e d ) (*,G_{red}) (∗,Gred) 路由条目,指向了连接 server104 的接口。因此数据包被传送到 server104。在leaf02 上的情况相同,数据包被传送到server102。
10)leaf04为 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred)创建一个多播路由表条目,并查找到达leaf01 的单播路径。这里有两条路径,分别通过 spine01 和 spine02。假设它选择了经过 spine01 的这条路径。现在,它将 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred)的 RPF 接口设置为指向 spine01 的接口,出接口设置为指向 server104 的接口。此时,使用 Underlay 网络的路由多播,数据包将从 leaf01 发送到 leaf04。
11)此时,和leaf04 类似,leaf02 也为 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred)创建一个多播条目。它也会查找到达 leaf01 的单播路径,发现可以使用 spine01或 spine02。 假设它选择spine02。它将多播条目的 RPF 接口设置为指向 spine02 的接口,出接口设置为指向 server102 的接口。它将发送一条 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred)的 PIM Join 消息到 spine02。
12) spine02 收到 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred) 的 PIM Join 消息后,了解到达 leaf01 可以通过连接到leaf01 的接口。spine02 将为 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred)创建了一条多播路由条目,该条目的RPF接口设置为指向 leaf01的接口,而出接口为指向 leaf02 的接口。leaf02还发送了一条 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred)的 PIM Join 消息到leaf01。
13)leaf01收到了来自 spine02 的 PIM Jin 消息,并设置 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred) 条目的出向接口为指向 spine01和 spine02 的接口。
14)现在,从leaf01发送的红色VNI的BUM数据包将同时到达spine01和spine02。spine01 发到 leaf02 的数据包将被丢弃,因为 leaf02 已将该多播组的RPF 接口设置为指向 spine02 的接口。
15)此时,因为不再需要 RPT 树的数据包,leaf02 将 ( l e a f 01 , G r e d , R P T P r u n e ) (leaf01,G_{red}, RPT\space Prune) (leaf01,Gred,RPT Prune) 消息发送到 spine01,并且完成 SPT 切换。
16)Spine01 收到来自leaf02 的 ( l e a f 01 , G r e d , R P T P r u n e ) (leaf01,G_{red}, RPT\space Prune) (leaf01,Gred,RPT Prune)消息后,将leaf02 从 ( l e a f 01 , G r e d ) (leaf01,G_{red}) (leaf01,Gred)多播路由条目的出接口列表中删除。
如果 leaf02将(*,G)
的 PIM Join 消息发送到 spine02,而 leaf04 将该消息发送到spine01,那么会发生什么? 这是可能的,因为两个 spine 都是任播 RP,并且不同的leaf 可以选择不同的 spine 发送 PIM Join 消息。leaf01 将仅向其中一个 spine (假如是 spine01) 发送 PIM Register 或 PIM Null Register 消息,并且只有 spine01 会创建
(
l
e
a
f
01
,
G
r
e
d
)
(leaf01,G_{red})
(leaf01,Gred)树。那么 leaf01 的数据包将如何到达 leaf02 呢?
这部分由 MSDP 处理。spine01 创建 (eaf01,Ga)多播路由后,MSDP 便将该信息同步到 spine02。spine02 使用该信息发送
(
l
e
a
f
01
,
G
r
e
d
)
(leaf01,G_{red})
(leaf01,Gred)组的 PIM Join 消息,因为它已连接到 leaf02,并且该leaf 已经请求接收 (*,G)
多播流。spine02 通过 RPF 接口将Join 请求发送到 leaf01,这是通向 leaf01 的链路。它将这条多播路由的出接口设置为指向 leaf02 的接口。从 spine02 接收到 PIM Jin 消息时,leaf01将 spine02 的接口添加到
(
l
e
a
f
01
,
G
r
e
d
)
(leaf01,G_{red})
(leaf01,Gred)多播路由的出接口列表。 现在,数据包将同时流向 leaf02 和leaf04。
处理 MAC 地址迁移
在图16-5中,server101 上有一个 VM,其 MAC 地址为 M A C V M 101 MACVM_{101} MACVM101。使用EVPN桥接模型,在首次发送数据包之后,所有 leaf 都知道 M A C V M 101 MACVM_{101} MACVM101与leaf01的VTEP相关联。现在考虑如果 VM 迁移到 server102 将会发生什么。
当 VM 迁移后第一次发送数据包时,leaf02 得知
M
A
C
V
M
101
MACVM_{101}
MACVM101已连接到自己的本地链路上。同时,leaf02 上
还有一个路由条目,该条目指出
M
A
C
V
M
101
MACVM_{101}
MACVM101与leaf01 相关联,它是通过 BGP通告获得。由于本地连接的路由条目优先级高于通过 BGP 学习得到的路由条目,leaf02会修改 MAC 表,将
M
A
C
V
M
101
MACVM_{101}
MACVM101指向连接到 server102 的端口。然后,它发出一条BGP EVPN RT-2 UPDATE 消息,告知其他节点将与
M
A
C
V
M
101
MACVM_{101}
MACVM101相关联的节点切换
为leaf02。leaf04 会按该消息的要求进行切换。但是 leaf01 认为
M
A
C
V
M
101
MACVM_{101}
MACVM101是本地连接到自己上,因为本地连接的条目优先于通过 BGP 学习得到的条目,所以 leaf01不会将其与
M
A
C
V
M
101
MACVM_{101}
MACVM101的关联切换为leaf02,而是继续认为它是本地连接,这是错误的。
为了解决该问题,EVPN定义了一个新 BGP扩展团体属性,称为 MAC Mobility,其格式如图 16-7 所示。
使用该扩展团体属性的第一个基本规则是:如果该 MAC 地址已经与一个远程 VTEP关联,该扩展团体属性必须用于通告本地学习得到的 MAC 地址。Sequence Number表示该 MAC 地址已迁移的次数。例如,第一次将该属性附加到 MAC 地址的 RT-2通告中时,Sequence Number 被设置为 1。使用该扩展团体属性的第二个基本规则是:如果节点在一个虚拟网络中收到带有该扩展属性的 MAC 地址的通告,该节点没有带有该扩展团体属性的任何路由条目,或者新通告中的 Sequence Number 高于本地数据库中当前条目的 Sequence Number,那么就必须接受该通告作为最佳路径。如果从不同的 VTEP 接收到相同 Sequence Number 的多个更新,那么将以IP 地址较小的 VTEP 的更新为准。
静态 MAC 地址是不允许迁移的 MAC 地址。在通告此 MAC 地址时,必须设置该路由的 MAC Mobility 扩展团体属性的“s”位,以表明该 MAC 地址为静态地址。当任何 VTEP 收到带有该标签的 MAC 通告时,必须忽略在相关虚拟网络中对该MAC地址的任何本地检测到的更改。
有时,MAC 地址已迁移的消息是错误的。原因之一是 L2 网络缺乏严格的安全策略,可能会造成 MAC 地址欺骗,试图将 MAC 地址从一个安全的主机转移到被入侵的主机。错误迁移消息的另一个原因是,连接到的 802.1Q 网络的问题可能导致 STP树不断更新。当 STP 树更新后,MAC 地址可能会出现在树中其他位置,使其看起来像 MAC 地址被迁移了。
为了处理所有这些情况,如果 VTEP 检测到 MAC 地址更新太频繁,它可以停止发送或处理该 MAC 地址的进一步更新。它还必须通知管理员正在发生的事情。没有明确的方法可以摆脱这种情况。
FRR的EVPN 实现支持标准中定义了 MAC Mobility。如果它检测到 MAC 地址在指定时间段内移动过于频繁,则在一段时间内忽略该 MAC 地址的更新,直到 MACMobility 计时器重启。FRR 可以设置该机制的移动次数和时间段长度。
支持双归属主机
在企业网络中,计算节点经常连接多个交换机。这样做主要是为了确保在单个链路故障或单个交换机故障的情况下,计算节点不会与网络断开连接。这也使数据中心在升级窗口期间升级交换机的时候,不会导致连到该交换机的所有计算节点断网。作为企业网络解决方案,EVPN 通常会与双连接主机一起部署。
图16-8 展示了常用的拓扑,但是主机 server101、server201、server102 和交换机leaf01,leaf02 之间采用了双连接。
下面将讨论双连接主机的问题以及如何解决。
- 双连接主机如何连接到交换机?
- 其他 VTEP 如何看到双连接节点? 换话说,图 16-8 中laf03 和leaf04的VTEP 如何查看 server101,server201 和server102 ?
- 当某些主机失去与其中一台交换机的连接时会发生什么? 例如,如果 server102丢失了与 leaf01的连接,会发生什么?
- 对于多目的地以太帧(例如,BUM 数据包),数据包传递是如何工作的? 由于leaf01 和 leaf02各自发送副本,双连接服务器是否会得到重复的数据包? 如果没有运行在可靠的流协议下(如 TCP),那么重复数据包可能会使某些应用程序感到困惑。
主机 - 交换机互连模型
在最常见的部署中,主机将两个链接作为一个绑定,也称链接聚合。绑定有两个主要优点:一是两个链接可以同时使用,二是作为绑定,链接仅需要一个而不是两个IP 地址。两个链接同时使用也称主 - 主模式。
绑定是使用标准 LACP (Link Aggregation Control Protocol,链路汇聚控制协议)创建。LACP 会确保主机连接到正确的设备上。例如,如果 server102 意外地连接到了leaf03,而不是 leaf02,那么LACP 会捕获到该错误,因为server102 发现它在两个链路上没有与同一对设备通信。LACP 仅在当所有链路连接到同一对设备上时才支持绑定。LACP 还会捕获单向链接故障之类的问题。
一些客户使用双交换机互连的目的仅是为了处理故障。在这种情况下,一个连接处于备用模式。仅当活动连接失效时,备用连接才会生效。 这种模式称为 NIC 组合或主-备模式。类似绑定模式,该模式有一些要求。主-备模式设备用连接被启用时具有与最近失效的连接相同的 IP 地址。同时,它还假设该连接上的默认网关与其他连接上的默认网关相同。
双连接主机的 VXLAN模型
撰写本书时,大多数数据转发芯片的实现都假定一个MAC地址位于单个 VTEP后面。图 16-8 中,每个主机连接到了两个不同的交换机。那么远程 VTEP (图中 leaf03 和leaf04)如何处理此情况呢?
这有两种可能性,每个VTEP都有自己的IP地址,或两个 VTEP共享一个公共IP地址。VTEP 共享IP地址是最常见的部署。 这样做的主要原因是 MAC 转发表的常用实现仅支持单个出口。在传统的桥接中,一个 MAC 地址没有理由有多个出向的端口,因为 STP 明确消除了多路径,以避免环路。通过将绑定表示为单个逻辑端口避免出现该问题。 在选定一个逻辑端口之后,还有一些额外的逻辑用于选择绑定中的单个物理端口来传输数据包。
图16-8的示例拓扑中,依据此模型,leaf01 和 leaf02 使用一个公用的源 VTEP的IP地址,为所有连接主机传递数据包。大多数实现通过 MLAG (Multichassis Link Aggregation,多机箱链路聚合) 协议来验证交换机配置了相同的公共IP地址。我还没有见过使用 EVPN 消息中的信息来验证公用IP 地址的实现。网络管理员还必须确保可以通过 BGP通告该公共 IP地址。否则,其他 VTEP 将不知道如何到达该VTEP的IP地址。
交换机对等选项
MLAG
当链路的一端被多个设备分开时,标准 LACP 将不支持创建绑定。换句话说,该标准不支持双连接主机连接到两个不同的交换机 leaf01 和 leaf02 的模型。因此每个网络供应商都有自己专有解决方案来提供这种模型。该解决方案的通用名称是MLAG,但是每个供应商的解决方案都有品牌名称,具体实现和部署细节会有所不同。例如,在交换机的 MLAG 对之间,Cumulus 和 Arista 需要有单独的对等链接,显示为L1和L2 之间的一条线。思科的 NX-OS 不需要有对等链接。
EVPN支持多归属
EVPN原生支持双连接设备。这些设备被称为多宿主节点。RFC 7432的第8节和RFC 8365 的第 8节描述了该解决方案的主要细节。EVPN 主要使用RT1和RT4消息类型来处理多宿主节点。RT-1 告诉网络哪些交换机连接到哪些公用设备或以大网网段。在数据中心中,一个以太网网段被定义为 VTEP 连接到的桥接网络或一个绑定链接。当连接到一个绑定时,RT-1 通告会将远程节点 (例如本例中的主机)的LACP标识符作为 ESI (Ethernet segmentID,以太网段ID)。当其他 VTEP 接收到RT-1 通告的 BGP 更新时,可以知道自己的哪些对等方连接到了同一主机上。
RT-4 会选择对等设备之一作为多目的地数据帧的指定转发器。RT-4 通告会携带以大网网段到该网段的路由器的映射。每个 VTEP 会从收到以太网网段的所有通告中选择具有最小VTEP的IP 地址的网段作为虚拟网络的指定转发器。在这种情况下两个对等设备不需要公共的VTEP IP 地址。
让我们使用示例拓扑进行详细说明。首先,该标准允许 leaf01 成为一组节点server101和server201的指定的转发器,而leaf02 成为另一组节点 server102的指定的转发器。图 16-8 中每个主机仅带一个 VLAN。如果主机支持多个 VLAN,则该标准进一步允许leaf01 成为 server101 上一组 VLAN的指定转发器,而leaf02 成为该节点上另一组 VLAN的指定转发器。
处理链接故障
如果图16-8 中的一台主机 (例如 server102) 失去了其中一条到leaf01的链接,会发生什么?
1)对于MLAG,最常见的实现是使用对等链接通过另一台交换机到达主机。在本示例中,leaf01和leaf02 都会通过公共的 VTEP IP 通告 server102 可达。Underlay 网络的多路径流量可以寻址 leaf01和 leaf02 之间的公共 VTEP IP。当leaf01 失去与server102的连接时,它将撤回对server102的通告。然而,由于leaf02的通告仍然有效,因此leaf03和leaf04仍然可以通过公共 VTEP IP 到达MAC102。因此,即使在链接已断开,leaf01 无法直接传送该数据包的情况下,发送到 server102的数据包仍然可能到达 leaf01。在这种情况下,leaf01将数据包解封装,并使用对等链接将未封装的数据包发送到 leaf02,然后由 leaf02 将数据包传递到 server102。即使双连接主机丢失与VTEP对等设备之一的链接,由于所用的地址是公共的 VTEP IP 地址,对等链接将被用于将数据包传递到该主机。
2)在没有对等链接的时候,大多数实现会重新封装数据包,并将数据包发送到另一台交换机。在本示例中,leaf01对VXLAN数据包进行解封装,添加一个新的VXLAN头目的地IP 为leaf02,并发送该数据包。
3)在EVPN 多宿主实现中,当交换机失去主机连接时,也将撤销主机LACP 标识的ESI的可达性。这是通过 RT-1 和 RT-4 路由完成的。另一台交换机最终会收到这些撤销。当收到 RT-4 撤销信息后,另一台交换机指定自己为server102 的指定转发器。当收到 RT-1 撤销后,该消息告知交换机主机单独连接到该交换机上。因此当该交换机失去主机连接时,该交换机不能将数据包转发给其对等设备。在本示例中,当leaf02 接收到 leaf01 发起的撤销时,它知道如果自己丢失了到 server102 的链接,则不能将数据包转发到 leaf01。然而不进行路由就重新封装 VXLAN数据包违反了水平分割检查。因此该模型需要 Underlay 网络的交换芯片的额外支持。
避免重复的多目的地数据帧
使用公共 VTEPIP 模型和入口复制时,一对交换机中仅有一个交换机获得数据包。这是因为其他 VTEP 使用单个公共 VTEP IP 地址来表示该对交换机,会随机选择其中一个交换机来获取任播数据包。然而,对于没有共享公共 VTBP IP 地址的模型,两个交换机都将获得一个多目的地数据 (例如 BUM 数包)的副本。
为了确保一对交换机中只有一个交换机会发送数据包到终端,两个交换机节点使用RT-4 消息选择其中一个交换机节点在虚拟网络中传递多目的地数据,然而控制协议的更新需要时间。在选举指定的转发器的过程中或过渡期间,主机要么不能接收多目的地数据帧,要么会接收到重复的数据帧,我们对此无能为力。
ARP/ND 抑制
ARP 请求和GARP 数据包都是 BUM 数据包,因为这些数据包都发送到广播地址。在示例拓扑中,如果 server101 已经发送 ARP 请得了 server104的MAC 地址,那么server201 就不必再发送同样的 ARP 请来获得 erver104 的MAC 地址。因为leaf01 能够缓存 server104的ARP信息并直接响应,这将对减少网络中 BUM 流量有良好的效果。
NDP 等同于IPv6 地址的 ARP。ND 也会受益于leaf01 的缓存和响应。缓存远程主机的 ARP/ND 信息,并为该信息响应 ARP/ND 请求就是 ARPIND 抑制。
在虚拟网络中,ARP/ND 抑制使用 RT-2 消息来传递与 MAC 地址相关联的IP地址。具体实现将决定是分别发送 MAC 和MAC/IP 通告,还是使用单个消息来发送两个通告。对于 FRR,启用 ARP/ND 抑制后将使用单个消息的更新模型。
MAC转发表会对通过控制协议获知的条目进行标记,同样,ARP 缓存或Linux内核的IP邻居表也会对通过控制协议获知的条目进行标记。内核不会为该类条目执行ARP刷新。同样,内核也不会将标记为通过控制协议学习的条目设为失效。当远程条目被删除并已发送撤销通告时,协议将负责删除这些条目。FRR 也会在正常关闭或从崩溃中恢复时删除这些条目。
此功能需要能够通过配置来启用。一些实现是仅当 VTEP 也作为虚拟网络的网关路由器时,才可以配置该功能。思科是这类实现的例子。Linux (包括 Cumulus) 可以独立配置开启该功能,无论 VTEP 是否是网络的网关路由器。
Linux 内核从4.18 版本开始提供对 ARP/ND 抑制的支持
RT-2注意事项
RT-2是一个小而棘手的路由通告。
图16-9展示了RT-2的消息格式,该格式定义在RFC 7432的7.2节,基本EVPN标准中。在使用VXLAN的数据中心的用例中,Ethernet Tag ID 会被忽略,也就是说,会被设置为0。当将 EVPN 用于多宿主主机 (FRR的7.2 版本不支持此功能)时,会使用ESI(Ethernet Segment Identifier,以太网段标识符)字段。
当禁用ARP/ND抑制或路由功能时,消息体中仅RD、MAC Addr和MPLS Label1 字段被使用。MAC Addr Len 字段始终设置为6,MAC Addr 字段包含MAC地址,MPLS Label1 字段包含与MAC 地址关联的二层 VNI。
当启用ARP/ND 或路由后,与{VNI,MAC}
关联的IP Addr也将被通告。可以选择分别发送两个RT-2 通告,一个仅用于 MAC,另一个用于MAC/IP,或者选择仅发送一个MAC/IP 通告。FRR 只发送一个MAC/IP 通告。IPv4的IP地址长度设置为4,如果是IPv6 地址,则设置为 16。如果MAC地址同时具有IPv4和IPv6地址,则分别发送两个或三个RT-2 通告,因为 RT-2只能容纳一个IP地址。
在仅使用非对称路由时,MPLS Labell 会携带与MAC/IP 绑定关联的二层VNI,不会使用 MPLS Label2。在使用对称路由时,MPLS Label2 字段会携带三层 VNI。
EVPN 和路由
这里所讨论的 EVPN 路由是针对通过 VTEP 接收的原始数据包进行 VXLAN 封装后所得到的数据包的路由。
集中式与分布式路由
两种 Overlay 数据包路由的可能选项:集中式路由和分布式路由。
分布式路由应该是首选的方法,除了以下两种情况:
- 当前,你有很多不支持 RIOT的路由器,并且升级这些设备费用很高,令人望而却步。那么添加两个或更多支持 RIOT的新的路由器并使用集中式路由可能是更好的解决方案。
- 你仅在流量流出数据中心(南北向流量) 时需要路由,因此使用出口 leaf 节点作为路由器可以简化集中式路由。这样也能够保留推荐的服务部署模型,例如,在出口 leaf 节点部署防火墙服务。
在部署集中式路由时,使用入口复制的 VTEP 任播IP地址模型可以确保只有双接口之一会获得数据包。或者VRRP之类的协议可以确保只有它们中的一个会路由数据包。作者推荐使用 VTEP任播IP模型和入口复制。
使用分布式路由需要关注的主要问题是重新考虑部署防火墙和负载均衡器等服务的方式。在集中式路由模型中,这些服务位于 border leaf 节点处。如果这些服务仅用于进出数据中心的流量,那么仍然可以 border leaf 节点部署这些服务。但是,如果服务是数据中心内流量需要的,那么部署服务的最佳方法是在每个主机自身上部署。
对称与非对称路由
**在对称路由中,数据包从源主机发送到目的主机,以及返回路径上的数据包,使用的是相同的路由路径。**在非对称路由中,数据包从源到目的地的路径和从目的地返回到源的路径不同。
选择非对称路由模型的主要原因是考虑互操作性。如果你要部署集中式路由,非对称路由是自然的选择。如果要通告非 EVPN路由,例如,默认路由或其他和MAC无关的路由,那么对称路由是显而易见的选择。
作者建议选择对称路由模型。
路由通告
EVPN RT-2通告包含与{MAC,VNI}
元组相关联的IP地址。该信息用于填写路由表。但是,在某些情况下,我们需要一条汇总路由或通告学习的 IP 路由。考虑需要在路由表中填写通往外部世界的默认路由的情况。通常,出口leaf 节点通告该默认路由。新的路由类型 RT-5 被引入,以用于通告IP 路由。IP 路由不会自动被通告,而是需要进行配置才能被通告。同时,IP 路由始终与三层 VNI一起被通告。每个设备在填写路由表之前会将三层 VNI映射到本地 VRF。三层VNI映射到本地VRF 是为了在本地Leaf设备中隔离不同虚拟网络的路由信息,确保每个VNI都有独立的路由表。
非对称路由可以与 RT-2 通告一起正常工作,而对称路由则需要额外的支持才能与 RT-2 通告一起工作。
RT-2 消息中,对称路由还需要三个额外信息:入口/出口 VTEP 之间使用的 VNI,下一跳IP地址 (出口VTEP的IP地址)以及出口 VTEP 路由器的MAC地址。这些信息需要在 BGP UPDATE 消息中传递。出口 VTEP 的IP 地址始终包含在 BGP通告的 NEXTHOP 属性中。RT-2 消息规定可以携带其他两个信息。
RT-2 支持携带两个 VNI或两个原始EVPN标准中的MPLS (Multiprotocol Label Switching,多协议标签交换)标签。对于非对称路由,仅两个VNI字段之一用于通告二层VNI。对于对称路由,两个 VNI字段都被使用,一个用于二层 VNI,另一个用于中转或三层 VNI。
路由通告还需要携带出口 VTEP的MAC地址,该地址用于内层数据包的目的MAC地址。在通告中,该 MAC 地址作为一个新的 BGP 扩展团体属性被携带。该新的扩展团体称为路由器MAC扩展团体 (Router MAC Extended Communit)。
VRF的使用
在EVPN中,路由发生在 VRF的上下文中。Underlay 网络的路由表位于默认路由表或全局路由表,Overlay 路由表则位于 VRF 特定的路由表。非对称路由可以不使用 VRF,我们在“举例说明 VXLAN桥接和路由”中已讨论过这种情况。但是,如果节点需要跟外界通信,就需要使用 VRF,这涉及 RT-5 通告。RT-5 通告始终发生在 VRF 上下文中: 通告携带三层的 VNI。因此为了保持路由模型统一,作者强烈建议始终将VRF与EVPN路由一起使用。
在大型网络中部署EVPN
主机路由的使用:
- EVPN网络中的主机路由:除了 RT-5(用于通告 IP 路由的路由类型)外,EVPN 网络中大多数路由是
/32
主机路由。这意味着网络中的路由主要是针对特定的IP地址,而不是整个子网。 - 二层Clos网络的规模:在二层Clos拓扑中,网络可以扩展到大约 50000 至 80000 个节点,这个规模在正常情况下是可控的。这个数字是指单个故障域内的节点数量,表明网络设计和运营可以处理这么多节点,而不是硬件或软件本身的限制,也与供应商无关。
存在的问题:
随着网络规模的扩大和三层Clos网络的引入,缺乏有效的路由汇总能力开始成为问题。汇总能力不足影响:
- 转发表的大小
- 入口复制的节点数
- 系统VNI的总数
这些对整个系统的鲁棒性产生负面影响。如果系统故障可能导致整个网络瘫痪或自适应能力变得不足,则需要重新考虑设计。
设计建议:
- 限制Leaf节点数量:由于上述原因,作者建议在二层Clos网络中,leaf节点的数量不应超过 128。这是为了确保网络的稳定性和可管理性。
- 推荐三层Clos设计:对于更大的网络,建议使用三层Clos拓扑设计,这种设计可以提供更好的汇总能力和扩展性,从而提高网络的鲁棒性和可维护性。
图16-10 三层网络的EVPN部署
三层Clos 网络仅提供三层连接,不能被直接用于 EVPN 网络。
在纯三层 Clos 网络中,每个机架已经汇总了所有本地连接的子网因为每个子网只能连接单个leaf 节点或一对leaf节点,因此,与通告 /32 或/128 主机路由的 EVPN 相比,这样的网络能够更有效地扩展。
为了保持网络任务有效分发,建议为 pod添加出口leaf节点,在出口 leaf处进行汇总并提供pod 级服务 (例如防火墙)。现在每个 pod 都是独立的。
在这个网络中,出口 leaf 节点主要用于汇总该 pod的前缀路由,将其通告给 super spine 节点,并向pod通告默认路由。同时,出口leaf节点接收 super-spine 节点发送的其他 pod的前缀路由。
小结
在本章中,我们介绍了 EVPN部署的重要内容及网络虚拟化的控制平面。结合本章与“举例说明VXLAN桥接和路由”中描述的数据包转发,为理解数据中心的网络虚拟化部署奠定了理论基础。