Active-active L3 网关与多归属

为什么

默认情况下,Neutron 路由器设置为使用单个外部网关端口连接到单个二层广播域。为了允许三层连接到外部世界,会为每个地址族添加一个静态默认路由,指向网络管理员提供的 IP 地址。

在这种配置中,高可用性是通过确保所有网关机箱都可以使用相同的二层广播域来实现的,从而允许网络设备配置为提供由多个路由器服务的网关 IP 作为虚拟 IP 地址。

将单个二层广播域提供给大型数据中心网络中的许多主机可能不是期望的,此功能可能提供一种在三层实现外部网关高可用性的方法。

这两种方法都有其优点和缺点,因此请务必熟悉 限制规模考虑因素,然后再决定此功能是否满足您的要求。

先决条件

参与到云路由/从云路由的网络设备需要支持 双向转发检测 (BFD) 以进行静态路由。为了本文档的目的,我们将使用 FRR 对 BFD 静态路由监控的支持

作为边界网关的网络设备还有其他要求,可能包括提供直接链路、配置 IGP、重分发静态路由等,但是这些细节超出了本文档的范围。

支持的驱动程序和版本

  • OpenStack 2024.1 或更高版本。

  • OVN 22.03 或更高版本。

注意

截至撰写本文时,只有 ML2/OVN 驱动程序支持此功能。

限制

  • 此功能目前与动态路由协议(如 BGP)没有集成,跳点存活检测由 BFD 提供。

  • 此功能不能与 网络地址转换 (NAT) 一起使用。

警告

此功能不能与 NAT 一起使用,路由器和网关必须使用 --disable-snat 参数创建,并且实例必须使用站点或全局可路由地址。

规模考虑因素

  • 为默认路由启用 BFD 将为每个路由器网关端口建立一个 BFD 会话。每个 BFD 会话的参与者通常每秒传输一条消息。BFD 控制包受慢速路径处理的影响,建议确保网络设备中的控制平面容量与预期的路由器网关端口数量相符。

如何

Active-active L3 网关与多归属规范 中所述,实现三层高可用性的组件包括

还有一组 用例,下面附有示例。

向路由器添加多个网关端口

可以通过在路由器创建时传递多个 --external-gateway 参数来设置具有多个网关端口的路由器。您还可以通过传递包含 subnetip-address 键的 --fixed-ip 来指定要使用的 IP 地址。subnet 必须附加到提供给 --external-gateway 参数的网络之一。

可以使用 openstack router add gateway 命令,将路由器和网络作为参数来修改现有路由器,以使其具有多个网关端口,并可以选择通过传递 --fixed-ip 参数来指定 IP 地址。

默认情况下只会创建一个默认路由。

向路由器添加多个默认路由

是否创建多个默认路由由路由器的 enable-default-route-ecmp 属性控制。可以在路由器创建时通过传递 --enable-default-route-ecmp 参数或使用 openstack router set 命令来更新现有路由器来设置它。

可以使用 enable_default_route_ecmp 配置选项来控制新路由器的默认行为。

注意

在没有 启用跳点存活检测的 BFD 的情况下添加多个默认路由不建议这样做,因为在发生故障时会导致性能下降。

启用 BFD 进行跳点存活检测

是否为默认路由启用通过 BFD 监控跳点存活由路由器的 enable-default-route-bfd 属性控制。可以在路由器创建时通过传递 --enable-default-route-bfd 参数或使用 openstack router set 命令来更新现有路由器来设置它。

可以使用 enable_default_route_bfd 配置选项来控制新路由器的默认行为。

建议在 向路由器添加多个默认路由 时启用此功能,否则在发生故障时会导致性能下降。

避免使用 NAT

OVN 依赖于连接跟踪来保持 NAT 实现所需的持续连接的状态,并且该状态是本地的每个网关机箱。

当您在三层设置高可用性时,即使在单个流中,流量也可能采用多个路径。

单个流的包采用多个路径与网关机箱的本地状态不兼容。例如,如果来自流的流量退出机箱 A,然后返回流量在机箱 B 上进入,当启用 NAT 时,机箱 B 将不知道该包属于谁。

用例

网关的独立网络路径,无需共享 L2

                 +-------+
                 | spine |
                 +-------+
     +------+                +------+
     | leaf |                | leaf |
     +------+                +------+

+-----------------+     +-----------------+
|      rack       |     |      rack       |
| +-------------+ |     | +-------------+ |
| | hypervisor  | |     | | hypervisor  | |
| +-------------+ |     | +-------------+ |
| | network-gw1 | |     | | network-gw2 | |
| +-------------+ |     | +-------------+ |
|     | phy1:net1 |     |     | phy2:net2 |
| +------------+  |     | +------------+  |
| | Border GW1 |  |     | | Border GW2 |  |
| +------------+  |     | +------------+  |
+-----------------+     +-----------------+

示例

首先创建外部网络

$ source openrc admin

$ openstack network create \
    --external \
    --provider-network-type flat \
    --provider-physical-network phy1 \
    net1

$ openstack network create \
    --external \
    --provider-network-type flat \
    --provider-physical-network phy2 \
    net2

然后为外部网络创建子网

$ source openrc admin

$ openstack subnet create \
    --subnet-range 192.0.2.0/24 \
    --no-dhcp \
    --network net1 \
    --gateway 192.0.2.2 \
    subnet1

$ openstack subnet create \
    --subnet-range 198.51.100.0/24 \
    --no-dhcp \
    --network net2 \
    --gateway 198.51.100.2 \
    subnet2

然后使用两个外部网络中的网关端口创建路由器

$ source openrc admin

$ openstack router create \
    --disable-snat \
    --external-gateway net1 \
    --fixed-ip subnet=subnet1,ip-address=192.0.2.100 \
    --external-gateway net2 \
    --fixed-ip subnet=subnet2,ip-address=198.51.100.100 \
    --enable-default-route-bfd \
    --enable-default-route-ecmp \
    router1

然后,最终用户可以创建一个供项目使用的子网

$ source openrc demo

$ openstack network create project-network

$ openstack subnet create \
    --subnet-range 203.0.113.0/24 \
    --network project-network \
    project-subnet

最后将项目子网附加到路由器

$ source openrc demo

$ openstack router add subnet router1 project-subnet

边界路由器配置可能如下所示

hostname border-router-1
!
ip route 203.0.113.0/24 192.0.2.100 bfd
!
bfd
 profile default
  transmit-interval 1000
  receive-interval 1000
 exit
 !
 peer 192.0.2.100 local-address 192.0.2.2 interface eth2
  profile default
 exit
 !
exit
!
end
hostname border-router-2
!
ip route 203.0.113.0/24 198.51.100.100 bfd
!
bfd
 profile default
  transmit-interval 1000
  receive-interval 1000
 exit
 !
 peer 198.51.100.100 local-address 198.51.100.2 interface eth2
  profile default
 exit
 !
exit
!
end

在成功配置中,BFD 状态可能如下所示

$ sudo ovn-nbctl find bfd dst_ip=192.0.2.2
_uuid               : b7efc8ac-cfd0-4f43-9dd2-2d38baa43571
detect_mult         : []
dst_ip              : "192.0.2.2"
external_ids        : {}
logical_port        : lrp-ad4ab4e8-1353-4230-8525-5e22fab7277e
min_rx              : []
min_tx              : []
options             : {}
status              : up

$ sudo ovn-nbctl find bfd dst_ip=198.51.100.2
_uuid               : 905f1f69-0901-4d19-bfcb-40729532ff85
detect_mult         : []
dst_ip              : "198.51.100.2"
external_ids        : {}
logical_port        : lrp-7fd315dc-a76f-4468-86a5-2c65f55153e4
min_rx              : []
min_tx              : []
options             : {}
status              : up
border-router-1# sh bfd peer
BFD Peers:
  peer 192.0.2.100 local-address 192.0.2.2 vrf default interface eth2
    ID: 2436324418
    Remote ID: 300179009
    Active mode
    Status: up
    Uptime: 25 minute(s), 25 second(s)
    Diagnostics: ok
    Remote diagnostics: ok
    Peer Type: configured
    RTT min/avg/max: 0/0/0 usec
    Local timers:
        Detect-multiplier: 3
        Receive interval: 1000ms
        Transmission interval: 1000ms
        Echo receive interval: 50ms
        Echo transmission interval: disabled
    Remote timers:
        Detect-multiplier: 5
        Receive interval: 1000ms
        Transmission interval: 1000ms
        Echo receive interval: disabled
border-router-2# sh bfd peer
BFD Peers:
  peer 198.51.100.100 local-address 198.51.100.2 vrf default interface eth2
    ID: 3137653350
    Remote ID: 35580729
    Active mode
    Status: up
    Uptime: 26 minute(s), 2 second(s)
    Diagnostics: ok
    Remote diagnostics: ok
    Peer Type: configured
    RTT min/avg/max: 0/0/0 usec
    Local timers:
        Detect-multiplier: 3
        Receive interval: 1000ms
        Transmission interval: 1000ms
        Echo receive interval: 50ms
        Echo transmission interval: disabled
    Remote timers:
        Detect-multiplier: 5
        Receive interval: 1000ms
        Transmission interval: 1000ms
        Echo receive interval: disabled

负载均衡

在上面的示例基础上,负载均衡也可以通过在每个子网中添加多个网关端口来实现。

假设有足够多的机箱可用,Neutron 将确保为单个路由器安排多个逻辑路由器端口 (LRP),以便不同的机箱充当主网关机箱。

$ openstack router add gateway \
    --fixed-ip subnet=subnet1,ip-address=192.0.2.101 \
    router1 \
    net1

 $ openstack router add gateway \
     --fixed-ip subnet=subnet2,ip-address=198.51.100.101 \
     router1 \
     net2
hostname border-router-1
!
ip route 203.0.113.0/24 192.0.2.101 bfd
!
bfd
 peer 192.0.2.101 local-address 192.0.2.2 interface eth2
  profile default
 exit
 !
exit
!
end
hostname border-router-2
!
ip route 203.0.113.0/24 198.51.100.101 bfd
!
bfd
 peer 198.51.100.101 local-address 198.51.100.2 interface eth2
  profile default
 exit
 !
exit
!
end
$ sudo ovn-nbctl find bfd dst_ip=192.0.2.2
_uuid               : b7efc8ac-cfd0-4f43-9dd2-2d38baa43571
detect_mult         : []
dst_ip              : "192.0.2.2"
external_ids        : {}
logical_port        : lrp-ad4ab4e8-1353-4230-8525-5e22fab7277e
min_rx              : []
min_tx              : []
options             : {}
status              : up

_uuid               : efbcf3c2-0c34-4fbc-89ed-b742baa25f9b
detect_mult         : []
dst_ip              : "192.0.2.2"
external_ids        : {}
logical_port        : lrp-7aa481e9-732f-4700-acfb-37de5eb1984a
min_rx              : []
min_tx              : []
options             : {}
status              : up

$ sudo ovn-nbctl find bfd dst_ip=198.51.100.2
_uuid               : 905f1f69-0901-4d19-bfcb-40729532ff85
detect_mult         : []
dst_ip              : "198.51.100.2"
external_ids        : {}
logical_port        : lrp-7fd315dc-a76f-4468-86a5-2c65f55153e4
min_rx              : []
min_tx              : []
options             : {}
status              : up

_uuid               : 2214892e-5df3-47a4-b8e0-24fe7446129c
detect_mult         : []
dst_ip              : "198.51.100.2"
external_ids        : {}
logical_port        : lrp-2f0aae53-8561-46af-a741-13963368ef2a
min_rx              : []
min_tx              : []
options             : {}
status              : up
border-router-1# sh bfd peer
BFD Peers:
  peer 192.0.2.101 local-address 192.0.2.2 vrf default interface eth2
     ID: 2436324418
     Remote ID: 300179009
     Active mode
     Status: up
     Uptime: 37 minute(s), 54 second(s)
     Diagnostics: ok
     Remote diagnostics: ok
     Peer Type: configured
     RTT min/avg/max: 0/0/0 usec
     Local timers:
         Detect-multiplier: 3
         Receive interval: 1000ms
         Transmission interval: 1000ms
         Echo receive interval: 50ms
         Echo transmission interval: disabled
     Remote timers:
         Detect-multiplier: 5
         Receive interval: 1000ms
         Transmission interval: 1000ms
         Echo receive interval: disabled

  peer 192.0.2.101 local-address 192.0.2.2 vrf default interface eth2
     ID: 295648861
     Remote ID: 877647437
     Active mode
     Status: up
     Uptime: 37 minute(s), 55 second(s)
     Diagnostics: ok
     Remote diagnostics: ok
     Peer Type: configured
     RTT min/avg/max: 0/0/0 usec
     Local timers:
         Detect-multiplier: 3
         Receive interval: 1000ms
         Transmission interval: 1000ms
         Echo receive interval: 50ms
         Echo transmission interval: disabled
     Remote timers:
         Detect-multiplier: 5
         Receive interval: 1000ms
         Transmission interval: 1000ms
         Echo receive interval: disabled
border-router-2# sh bfd peer
BFD Peers:
  peer 198.51.100.100 local-address 198.51.100.2 vrf default interface eth2
     ID: 90369368
     Remote ID: 3549983429
     Active mode
     Status: up
     Uptime: 37 minute(s), 57 second(s)
     Diagnostics: ok
     Remote diagnostics: ok
     Peer Type: configured
     RTT min/avg/max: 0/0/0 usec
     Local timers:
         Detect-multiplier: 3
         Receive interval: 1000ms
         Transmission interval: 1000ms
         Echo receive interval: 50ms
         Echo transmission interval: disabled
     Remote timers:
         Detect-multiplier: 5
         Receive interval: 1000ms
         Transmission interval: 1000ms
         Echo receive interval: disabled

  peer 198.51.100.101 local-address 198.51.100.2 vrf default interface eth2
     ID: 3137653350
     Remote ID: 35580729
     Active mode
     Status: up
     Uptime: 37 minute(s), 57 second(s)
     Diagnostics: ok
     Remote diagnostics: ok
     Peer Type: configured
     RTT min/avg/max: 0/0/0 usec
     Local timers:
         Detect-multiplier: 3
         Receive interval: 1000ms
         Transmission interval: 1000ms
         Echo receive interval: 50ms
         Echo transmission interval: disabled
     Remote timers:
         Detect-multiplier: 5
         Receive interval: 1000ms
         Transmission interval: 1000ms
         Echo receive interval: disabled