重新分发邻居

重新分发邻居 提供了一种使 IP 子网能够跨机架的方式,而无需最终主机运行路由协议,方法是在路由结构中公布各个主机 /32 路由。结构上的其他主机可以使用此新路径来访问结构中的主机。如果 ECMP 可用,则流量可以在可用路径上以本机方式进行负载均衡。

主机在发送到 IPv4 地址时使用 ARP 来解析 MAC 地址。然后,主机在接收或响应 ARP 请求时,会构建已知 MAC 地址的 ARP 缓存表:IPv4 元组。

对于叶交换机,机架内的主机使用默认网关,ARP 缓存表包含 ARP 其默认网关的所有主机的列表。在大多数情况下,此表包含所有必要的第 3 层信息。“重新分发邻居”格式化此表并将其同步到路由协议中。

当前重新分发邻居的实现

  • 仅支持 IPv4。
  • 不支持 VRF
  • 最多支持 1024 个接口。
  • 不支持 EVPN。同时启用重新分发邻居和 EVPN 会导致 IPv4 ARP 和 IPv6 邻居条目不可达。

目标用例和最佳实践

在以下配置中使用重新分发邻居

  • 虚拟化集群
  • 具有在机架之间迁移的服务 IP 地址的主机
  • 双连接到两个叶节点而未使用专有协议(如 MLAG)的主机
  • 需要从多个主机进行动态通告的任播服务

遵循以下准则

  • 可以将主机连接到一个或多个叶。每个叶通告在其邻居表中看到的 /32。
  • 确保面向主机的网桥或 VLAN 在每个交换机上都是本地的。
  • 将带有重新分发邻居的叶直接连接到主机。
  • 确保 IP 地址不重叠,因为主机 IP 地址会直接通告到路由结构中。
  • 在基于 Linux 的主机上运行重新分发邻居。NVIDIA 不测试其他主机操作系统。

重新分发邻居如何工作?

重新分发邻居的工作方式如下

  1. 当主机发送 ARP 请求或 ARP 回复时,叶或 ToR 交换机了解有关连接主机的信息。
  2. 内核邻居表为每个叶的主机添加一个条目。
  3. 重新分发邻居守护程序 (rdnbrd) 监控内核邻居表,并为每个邻居条目创建一个 /32 路由。此 /32 路由位于内核表 10 中。
  4. FRR 从内核表 10 导入路由。
  5. 路由图控制要从表 10 导入哪些路由。
  6. FRR 将这些路由作为路由导入。
  7. 配置 BGPOSPF 以重新分发表 10 路由。

配置示例

以下配置示例使用以下拓扑。

配置叶

Cumulus Linux 不提供 NVUE 命令重新分发邻居配置。
  1. 编辑 /etc/network/interfaces 文件,以在面向主机的两个接口上配置具有 /32 前缀的相同 IP 地址。在此示例中,swp1 和 swp2 面向 server01 和 server02

    cumulus@leaf01:~$ sudo nano /etc/network/interfaces
    
    auto lo
    iface lo inet loopback
        address 10.0.0.1/32
    
    auto swp1
    iface swp1
        address 10.0.0.1/32
    
    auto swp2
    iface swp2
        address 10.0.0.1/32
    ...
    
  2. 启用守护程序在启动时启动,然后启动守护程序

    cumulus@leaf01:~$ sudo systemctl enable rdnbrd.service
    cumulus@leaf01:~$ sudo systemctl restart rdnbrd.service
    
  3. 配置路由

    1. 将表添加为路由到本地路由表

      cumulus@leaf01:~$ sudo vtysh
      
      leaf01# configure terminal
      leaf01(config)# ip import-table 10
      
    2. 定义与面向主机的接口匹配的路由图

      leaf01(config)# route-map REDIST_NEIGHBOR permit 10
      leaf01(config-route-map)# match interface swp1
      leaf01(config-route-map)# route-map REDIST_NEIGHBOR permit 20
      leaf01(config-route-map)# match interface swp2
      
    3. 将该路由图应用于导入到中的路由

      leaf01(config)# ip import-table 10 route-map REDIST_NEIGHBOR
      

      要设置用于路由的管理距离,请在路由图名称之前添加 distance 选项

      leaf01(config)# ip import-table 10 distance 20 route-map REDIST_NEIGHBOR
      
    4. 将导入的路由重新分发到适当的路由协议中。

      BGP

      leaf01(config)# router bgp 65001
      leaf01(config-router)# address-family ipv4 unicast
      leaf01(config-router-af)# redistribute table 10
      leaf01(config-router-af)# exit
      leaf01(config-router)# exit
      leaf01(config)# exit
      leaf01# write memory
      leaf01# exit
      cumulus@leaf01:~$
      

      OSPF

      leaf01(config)# router ospf
      leaf01(config-router)# redistribute table 10
      leaf01(config-router)# exit
      leaf01(config)# exit
      leaf01# write memory
      leaf01# exit
      cumulus@leaf01:~$
      

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

frr defaults datacenter
ip import-table 10 route-map REDIST_NEIGHBOR
username cumulus nopassword
!
service integrated-vtysh-config
!
log syslog informational
!
router bgp 65001
 !
 address-family ipv4 unicast
  redistribute table 10
 exit-address-family
!
route-map REDIST_NEIGHBOR permit 10
 match interface swp1
!
route-map REDIST_NEIGHBOR permit 20
 match interface swp2
!
router ospf
 redistribute table 10
!
line vty
!

配置主机

本文档介绍了具有静态 IP 地址的双连接 Linux 主机。

在其环回和上行链路上配置具有相同 /32 IP 地址的主机,以便无论接口如何,两个叶都通告相同的 /32。Cumulus Linux 依赖于 ECMP 来平衡南北向接口之间的负载,并依赖于等价静态路由(请参阅以下配置)来平衡北向负载。

环回托管主服务 IP 地址,您可以将服务绑定到该地址。

配置环回接口和物理接口。在上面的示例拓扑中

  • server01 通过 eth1 连接到 leaf01,并通过 eth2 连接到 leaf02。

  • lo、eth1 和 eth2 使用环回 IP 地址。

  • post-up arping 命令强制主机在其接口启动后立即发送 ARP。这使叶能够尽快了解主机。

  • 如果 swp1 和 swp2 都已启动,则 post-up ip route 命令通过一个或两个叶安装默认路由。

    配置

安装 ifplugd

安装并使用 ifplugd,它在接口经历链路转换(载波启动/关闭)时修改 Linux 路由表的行为。默认情况下,即使物理接口不可用(无载波),Linux 内核也会保持路由启动。

安装 ifplugd 后,按如下方式编辑 /etc/default/ifplugd,其中 eth1eth2 是主机用于连接到叶的接口名称。

user@server01:$ sudo nano /etc/default/ifplugd
INTERFACES="eth1 eth2"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u10 -d10 -w -I"
SUSPEND_ACTION="stop"

有关在 Ubuntu 上安装 ifplugd 的完整说明,请遵循本指南

故障排除

检查 rdnbrd 是否正在运行

rdnbrd 是重新分发邻居守护程序。要检查守护程序是否正在运行,请运行 systemctl status rdnbrd.service 命令

cumulus@leaf01:~$ systemctl status rdnbrd.service
* rdnbrd.service - Cumulus Linux Redistribute Neighbor Service
 Loaded: loaded (/lib/systemd/system/rdnbrd.service; enabled)
 Active: active (running) since Wed 2016-05-04 18:29:03 UTC; 1h 13min ago
 Main PID: 1501 (python)
 CGroup: /system.slice/rdnbrd.service
 `-1501 /usr/bin/python /usr/sbin/rdnbrd -d

更改 rdnbrd 配置

要更改 rdnbrd 的默认配置,请编辑 /etc/rdnbrd.conf 文件,然后运行 systemctl restart rdnbrd.service

cumulus@leaf01:~$ sudo nano /etc/rdnbrd.conf
# syslog logging level CRITICAL, ERROR, WARNING, INFO, or DEBUG
loglevel = INFO

# TX an ARP request to known hosts every keepalive seconds
keepalive = 1

# If a host does not send an ARP reply for holdtime consider the host down
holdtime = 3

# Install /32 routes for each host into this table
route_table = 10

# Uncomment to enable ARP debugs on specific interfaces.
# Note that ARP debugs can be very chatty.
# debug_arp = swp1 swp2 swp3 br1
# If we already know the MAC for a host, unicast the ARP request. This is
# unusual for ARP (why ARP if you know the destination MAC) but we will be
# using ARP as a keepalive mechanism and do not want to broadcast so many ARPs
# if we do not have to. If a host cannot handle a unicasted ARP request, set
#
# Unicasting ARP requests is common practice (in some scenarios) for other
# networking operating systems so it is unlikely that you will need to set
# this to False.
unicast_arp_requests = True
cumulus@leaf01:~$ sudo systemctl restart rdnbrd.service

设置路由表 ID

Linux 内核支持多个路由表,可以使用 0 到 255 的表 ID;但是,它保留表 0、253、254 和 255,并首先使用 1。因此,rdnbrd 只允许您指定介于 2 和 252 之间的值。Cumulus Linux 使用表 ID 10,但是您可以将 ID 设置为 2 到 252 之间的任何值。您可以在此处查看所有指定的表

cumulus@leaf01:~$ cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1  inr.ruhep

有关更多信息,请参阅 Linux 路由表,或者您可以阅读 Ubuntu ip route 手册页

检查 /32 重新分发邻居通告的路由

对于 BGP,运行 vtysh show ip bgp neighbor <interface> advertised-routes 命令。例如

cumulus@leaf01:~$ show ip bgp neighbor swp51 advertise-routes
BGP table version is 5, local router ID is 10.0.0.11
Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
              i internal, r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete

    Network         Next Hop            Metric LocPrf Weight Path
*> 10.0.0.11/32     0.0.0.0                  0         32768 i
*> 10.0.0.12/32     ::                                     0 65020 65012 i
*> 10.0.0.21/32     ::                                     0 65020 i
*> 10.0.0.22/32     ::                                     0 65020 i

Total number of prefixes 4

验证内核路由表

使用以下工作流程来验证内核路由表是否正确填充,以及路由是否正确导入和通告

  1. 验证 ARP 邻居条目是否填充到内核路由表 10 中。

    cumulus@leaf01:~$ ip route show table 10
    10.0.1.101 dev swp1 scope link
    

    如果未生成这些路由,请验证 rdnbrd 守护程序是否正在运行,并检查 /etc/rdnbrd.conf 文件是否包含正确的表号。

  2. 验证路由是否从内核路由表 10 导入到 FRR 中。

    cumulus@leaf01:~$ sudo vtysh
    leaf01# show ip route table
    Codes: K - kernel route, C - connected, S - static, R - RIP,
            O - OSPF, I - IS-IS, B - BGP, A - Babel, T - Table,
            > - selected route, * - FIB route
    T[10]>* 10.0.1.101/32 [19/0] is directly connected, swp1, 01:25:29
    

    必须同时存在 > 和 *,以便将表 10 路由作为首选路由安装到路由表中。如果未安装路由,请使用 ip import 10 distance X 命令(其中 X 小于路由协议的管理距离)验证本地导入的内核路由的导入距离。如果距离太小,则从协议中学习的路由可能会覆盖本地导入的路由。此外,还要验证路由是否在内核路由表中。

  3. 确认路由在 BGP/OSPF 数据库中,并且它们已通告。

    leaf01# show ip bgp
    

注意事项

路由规模

重新分发邻居将每个 ARP 条目作为 /32 主机路由添加到汇总域中所有交换机的路由表中。确保主机数量加上结构路由数量小于正在使用的转发资源配置文件中分配的硬件 LPM 表大小。

流量分布不均

Linux 仅使用第 3 层地址在大多数较旧的发行版上进行负载均衡。

沉默主机永远不会接收流量

有时,尚未发送流量的新配置主机不会 ARP 其默认网关。主机上 /etc/network/interfaces 文件中的 post-up arping 命令可以解决此问题。如果主机不发送 ARP,则叶上的 rdnbrd 不会了解主机。