BGP 加权等价多路径

您在数据中心网络中使用 W-ECMP,这些网络依赖任播路由来提供基于网络的负载均衡。Cumulus Linux 通过使用 BGP 链路带宽扩展团体来支持 BGP W-ECMP,以便在 3 层部署中为 IPv4 和 IPv6 路由以及在 EVPN 部署中为前缀(类型 5)路由向任播服务负载均衡流量。

W-ECMP 路由

ECMP 中,到目的地的路由有多个下一跳,流量在它们之间平均分配。基于流的哈希确保与特定流关联的所有流量使用相同的下一跳和网络中的相同路径。

在 W-ECMP 中,除了 ECMP 基于流的哈希之外,Cumulus Linux 还为每个下一跳关联一个权重,并根据权重比例在下一跳之间分配流量。BGP 链路带宽扩展团体携带有关通过网络进行的任播服务器分配的信息,这映射到相应下一跳的权重。映射将特定路径的带宽值与所有可能路径的总带宽值进行比较,映射到 1 到 100 的范围。BGP 最佳路径选择算法和确定可以用于负载均衡的路径的多路径计算算法不会改变。

W-ECMP 示例

上面的示例展示了当您使用 W-ECMP 路由时, направленный к 192.168.10.1/32 的流量如何进行负载均衡

  • leaf01 有两条到 192.168.10.1/32 的 ECMP 路径(通过 server01 和 server03),而 leaf03 和 leaf04 只有一条到 server04 的路径。
  • leaf01、leaf02、leaf03 和 leaf04 基于前缀的 BGP 多路径数量生成 BGP 链路带宽。
  • 当向 spine 宣告前缀时,leaf01 和 leaf02 生成链路带宽为 2,而 leaf03 和 leaf04 生成链路带宽为 1。
  • 每个 spine 向边界 leaf 宣告 192.168.10.1/32 前缀,累积带宽为 6。这结合了来自 leaf01 的值 2、来自 leaf02 的值 2、来自 leaf03 的值 1 和来自 leaf04 的值 1。

现在,每个 spine 都有四条 W-ECMP 路由

  • 通过 leaf01,权重为 2
  • 通过 leaf02,权重为 2
  • 通过 leaf03,权重为 1
  • 通过 leaf04,权重为 1

边界 leaf 也有四条 W-ECMP 路由

  • 通过 spine01,权重为 6
  • 通过 spine02,权重为 6
  • 通过 spine03,权重为 6
  • 通过 spine04,权重为 6

边界 leaf 平均分配流量;所有权重都等于 spine。只有 spine 基于权重值进行不均等的负载分担。

配置 W-ECMP

在路由映射中,针对所有前缀、特定前缀或一组前缀设置 BGP 链路带宽扩展团体,使用路由映射的 match 子句。在第一个接收到前缀的设备上应用路由映射;针对生成此此前缀的 BGP 邻居。

BGP 链路带宽扩展团体使用字节/秒。为了转换 ECMP 路径的数量,Cumulus Linux 使用 1024Kbps 的参考带宽。例如,如果到任播 IP 有四条 ECMP 路径,则扩展团体中编码的带宽为 512,000。实际值并不重要,只要所有始发链路带宽的路由器以相同的方式转换 ECMP 路径的数量即可。

默认情况下,Cumulus Linux 接受带宽扩展团体。您无需配置未始发 W-ECMP 路由的 transit 设备。

  • 扩展团体中使用的带宽对端口带宽没有影响或关系。
  • 您只能在出站方向对等体应用路由权重信息;您不能在入站方向从向交换机宣告路由的对等体应用路由权重信息。

以下示例针对所有前缀设置 BGP 链路带宽扩展团体。

cumulus@switch:~$ nv set router policy route-map ucmp-route-map rule 10 action permit 
cumulus@switch:~$ nv set router policy route-map ucmp-route-map rule 10 set ext-community-bw multipaths
cumulus@switch:~$ nv set vrf default router bgp neighbor swp51 address-family ipv4-unicast policy outbound route-map ucmp-route-map 
cumulus@switch:~$ nv config apply
cumulus@leaf01:~$ sudo vtysh
...
leaf01# configure terminal
leaf01(config)# route-map ucmp-route-map permit 10
leaf01(config-route-map)# set extcommunity bandwidth num-multipaths
leaf01(config-route-map)# exit
leaf01(config)# router bgp 65011
leaf01(config-router)# address-family ipv4 unicast
leaf01(config-router)# neighbor 10.1.1.1 route-map ucmp-route-map out
leaf01(config-router)# end
leaf01# write memory
leaf01# exit

vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

...
address-family ipv4 unicast
 neighbor 10.1.1.1 route-map ucmp-route-map out
!
route-map ucmp-route-map permit 10
 set extcommunity bandwidth num-multipaths
...

以下示例针对 192.168/16 IP 地址范围中的任播服务器设置 BGP 链路带宽扩展团体。

cumulus@switch:~$ nv set router policy prefix-list anycast_ip type ipv4
cumulus@switch:~$ nv set router policy prefix-list anycast_ip rule 1 match 192.168.0.0/16 max-prefix-len 30
cumulus@switch:~$ nv set router policy prefix-list anycast_ip rule 1 action permit
cumulus@switch:~$ nv set router policy route-map ucmp-route-map rule 1 action permit 
cumulus@switch:~$ nv set router policy route-map ucmp-route-map rule 1 match ip-prefix-list anycast_ip
cumulus@switch:~$ nv set router policy route-map ucmp-route-map rule 1 set ext-community-bw multipaths
cumulus@switch:~$ nv set vrf default router bgp neighbor swp51 address-family ipv4-unicast policy outbound prefix-list anycast_ip 
cumulus@switch:~$ nv config apply
cumulus@leaf01:~$ sudo vtysh
...
leaf01# configure terminal
leaf01(config)# ip prefix-list anycast_ip seq 10 permit 192.168.0.0/16 le 32
leaf01(config)# route-map ucmp-route-map permit 10
leaf01(config-route-map)# match ip address prefix-list anycast_ip
leaf01(config-route-map)# set extcommunity bandwidth num-multipaths
leaf01(config-route-map)# router bgp 65011
leaf01(config-router)# address-family ipv4 unicast
leaf01(config-router-af)# neighbor swp51 prefix-list anycast_ip out
leaf01(config-router-af)# end
leaf01# write memory
leaf01# exit

vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

...
address-family ipv4 unicast
 neighbor 10.1.1.1 route-map ucmp-route-map out
!
ip prefix-list anycast-ip permit 192.168.0.0/16 le 32
route-map ucmp-route-map permit 10
 match ip address prefix-list anycast-ip
 set extcommunity bandwidth num-multipaths
...

EVPN 配置

对于 EVPN 配置,请确保您在 EVPN 地址族下激活命令。以下示例显示了一个 EVPN 配置示例,该示例针对所有前缀设置 BGP 链路带宽扩展团体。

cumulus@switch:~$ nv set vrf turtle router bgp autonomous-system 65011
cumulus@switch:~$ nv set vrf turtle router bgp address-family ipv4-unicast route-export to-evpn route-map ucmp-route-map
cumulus@switch:~$ nv set router policy route-map ucmp-route-map rule 10 action permit
cumulus@switch:~$ nv set router policy route-map ucmp-route-map rule 10 set ext-community-bw cumulative
cumulus@switch:~$ nv config apply
cumulus@leaf01:~$ sudo vtysh
...
leaf01# configure terminal
leaf01(config)# route-map ucmp-route-map permit 10
leaf01(config-route-map)# set extcommunity bandwidth num-multipaths
leaf01(config-route-map)# router bgp 65011 vrf turtle
leaf01(config-router)# address-family l2vpn evpn
leaf01(config-router-af)# advertise ipv4 unicast route-map ucmp-route-map
leaf01(config-router-af)# end
leaf01# write memory
leaf01# exit

vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

...
router bgp 65011 vrf turtle
 !
 address-family ipv4 unicast
  maximum-paths 64
  maximum-paths ibgp 64
 exit-address-family
 !
 address-family l2vpn evpn
  advertise ipv4 unicast route-map ucmp-route-map
 exit-address-family

控制接收交换机上的 W-ECMP

要控制接收交换机上的 W-ECMP,您可以

  • 为 W-ECMP 路由设置默认值。
  • 禁用在特定对等连接上通告所有 BGP 扩展团体。

为 W-ECMP 路由设置默认值

默认情况下,如果某些多路径没有链路带宽,Cumulus Linux 会忽略任何多路径中的 bestpath 带宽值并执行 ECMP。但是,您可以改为设置以下选项之一

  • 忽略链路带宽并执行 ECMP。
  • 跳过没有链路带宽的路径,并在其他路径之间执行 W-ECMP(如果至少某些路径具有链路带宽)。
  • 为没有链路带宽的路径分配低默认权重(值 1)。

针对 BGP 实例中的 IPv4 和 IPv6 单播路由,为每个 BGP 实例更改此设置。对于 EVPN,在租户 VRF 上设置选项。

运行 NVUE nv set vrf <vrf> router bgp path-selection multipath bandwidth ignorenv set vrf <vrf> router bgp path-selection multipath bandwidth skip-missingnv set vrf <vrf> router bgp path-selection multipath bandwidth default-weight-for-missing 命令。

以下示例将链路带宽处理设置为跳过没有链路带宽的路径,并在其他路径之间执行 W-ECMP

cumulus@switch:~$ nv set vrf default router bgp path-selection multipath bandwidth skip-missing
cumulus@switch:~$ nv config apply

运行 vtysh bgp bestpath bandwidth ignorebgp bestpath bandwidth skip-missingbgp bestpath bandwidth default-weight-for-missing 命令。

以下示例将链路带宽处理设置为跳过没有链路带宽的路径,并在其他路径之间执行 UCMP

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# router bgp 65011
switch(config-router)# bgp bestpath bandwidth skip-missing
switch(config-router)# end
switch# write memory
switch# exit

vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

router bgp 65011
  bgp bestpath as-path multipath-relax
  neighbor LEAF peer-group
  neighbor LEAF remote-as external
  neighbor swp1 interface peer-group LEAF
  neighbor swp2 interface peer-group LEAF
  neighbor swp3 interface peer-group LEAF
  neighbor swp4 interface peer-group LEAF
  bgp bestpath bandwidth skip-missing
!
  address-family ipv4 unicast
    network 10.0.0.1/32
  exit-address-family
 ...

BGP 链路带宽扩展团体与前缀自动传递到 eBGP 对等体。如果您不想在特定域外传递 BGP 链路带宽扩展团体,您可以禁用在特定对等连接上通告所有 BGP 扩展团体。

您不能仅禁用 BGP 链路带宽扩展团体向邻居通告;您要么发送所有 BGP 扩展团体,要么都不发送。

以下示例禁用对等体上的所有 BGP 扩展团体

cumulus@switch:~$ nv set vrf default router bgp neighbor swp51 address-family ipv4-unicast community-advertise extended off
cumulus@switch:~$ nv config apply
cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# router bgp 65011
switch(config-router)# no neighbor 10.10.0.2 send-community extended
switch(config-router)# end
switch# write memory
switch# exit

权重归一化

NVIDIA Spectrum 交换机通过重复每个单独的路径来支持 ECMP 的权重编程,这会消耗资源。为了减少 ECMP 资源的硬件利用率,您可以启用权重归一化。

启用权重归一化

cumulus@leaf01:mgmt:~$ nv set system forwarding ecmp-weight-normalisation mode enabled
cumulus@leaf01:mgmt:~$ nv config apply

要禁用权重归一化,请运行 nv set system forwarding ecmp-weight-normalisation mode disabled 命令。

您还可以通过运行 nv set system forwarding ecmp-weight-normalisation max-hw-weight 命令来调整加权 ECMP 的最大硬件条目数。您可以指定介于 8 到 4096 之间的值。默认值为 32。

cumulus@leaf01:mgmt:~$ nv set system forwarding ecmp-weight-normalisation max-hw-weight 100
cumulus@leaf01:mgmt:~$ nv config apply

在调整最大硬件条目数时要谨慎。将设置配置得太低会消耗更少的资源,但提供的权重粒度更小。将设置配置得太高会消耗更多资源,但提供的权重粒度更大。

带有自适应路由的 BGP W-ECMP

Cumulus Linux 支持带有自适应路由的 BGP W-ECMP,用于高性能以太网拓扑,在这些拓扑中,您使用自适应路由来实现最佳和高效的流量分配。您无需执行除上述配置之外的任何其他配置。

  • NVIDIA 建议在 spine 和 leaf 交换机之间具有相等数量链路的网络上以及链路的端口速度在所有交换机上都相同的网络上使用带有自适应路由的 W-ECMP。
  • 自适应路由合格流量和非自适应路由合格流量都通过同一个 ECMP 组,该组根据 W-ECMP 权重进行调整。非自适应路由流量继续遵循下一跳更新列表之间的基于哈希的流量分配。

故障排除

要显示接收到的或本地路由中的扩展团体,请运行 vtysh show bgp 命令。

以下示例显示交换机从两个对等体接收带有 BGP 链路带宽属性的 IPv4 单播路由。链路带宽扩展团体以字节/秒为单位,并以兆比特/秒为单位显示:Extended Community: LB:65002:131072000 (1000.000 Mbps) 和 Extended Community: LB:65001:65536000 (500.000 Mbps)

cumulus@switch:~$ sudo vtysh
...
switch# show ip bgp ipv4 unicast 192.168.10.1/32
BGP routing table entry for 192.168.10.1/32
Paths: (2 available, best #2, table default)
  Advertised to non peer-group peers:
  l1(swp1) l2(swp2) l3(swp3) l4(swp4)
  65002
    fe80::202:ff:fe00:1b from l2(swp2) (10.0.0.2)
    (fe80::202:ff:fe00:1b) (used)
      Origin IGP, metric 0, valid, external, multipath, bestpath-from-AS 65002
      Extended Community: LB:65002:131072000 (1000.000 Mbps)
      Last update: Thu Feb 20 18:34:16 2020

  65001
    fe80::202:ff:fe00:15 from l1(swp1) (110.0.0.1)
    (fe80::202:ff:fe00:15) (used)
      Origin IGP, metric 0, valid, external, multipath, bestpath-from-AS 65001, best (Older Path)
      Extended Community: LB:65001:65536000 (500.000 Mbps)
      Last update: Thu Feb 20 18:22:34 2020

W-ECMP 使用的带宽值仅用于确定到给定下一跳的负载百分比,对实际链路或流带宽没有影响。

要显示 EVPN 类型 5 路由,请运行 vtysh show bgp l2vpn evpn route type prefix 命令。

带宽以字节/秒(无符号 32 位)以及 Gbps、Mbps 或 Kbps 为单位显示。例如

cumulus@switch:~$ sudo vtysh
...
switch# show bgp l2vpn evpn route type prefix
BGP table version is 1, local router ID is 10.0.0.11
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
...
*> [5]:[0]:[32]:[192.168.10.1]
            10.0.0.5                           0 65100 65050 65200 i
            RT:65050:104001 LB:65050:134217728 (1.000 Gbps) ET:8 Rmac:36:4f:15:ea:81:90

要查看与具有多条路径的路由的下一跳关联的权重,请运行 vtysh show ip route 命令。例如

cumulus@switch:~$ sudo vtysh
...
switch# show ip route 192.168.10.1/32
Routing entry for 192.168.10.1/32
  Known via "bgp", distance 20, metric 0, best
  Last update 00:00:32 ago
  * fe80::202:ff:fe00:1b, via swp2, weight 66
  * fe80::202:ff:fe00:15, via swp1, weight 33

注意事项

带有 BGP 链路带宽的 W-ECMP 仅适用于 BGP 学习的路由。

下一跳组更新期间的 ECMP 资源共享

在网络事件(如重启、链路 flap)和任何瞬态场景中,下一跳组的 churn 可能会创建更多的 ECMP 容器。此外,当 FRR 为每个源分配单个下一跳组时,需要更多的 ECMP 硬件资源。

要配置交换机在权重更改的情况下在下一跳组更新期间共享 ECMP 资源,请创建 /etc/cumulus/switchd.d/switchd_misc.conf 文件并添加 nhg_update_ecmp_sharing_enable = TRUE

cumulus@leaf01:mgmt:~$ sudo nano /etc/cumulus/switchd.d/switchd_misc.conf
nhg_update_ecmp_sharing_enable = TRUE 

要禁用在权重更改的情况下在下一跳组更新期间共享 ECMP 资源,请将 nhg_update_ecmp_sharing_enable 选项设置为 FALSE

NVUE 不提供启用或禁用在权重更改的情况下在下一跳组更新期间共享 ECMP 资源的命令。

IETF 草案 - BGP 链路带宽扩展团体