公共范围的动态广告路由

蓝图链接

此蓝图的目标是为 OpenStack 部署添加动态路由功能。此功能将允许 Neutron 使用 BGP 协议向外部路由器宣告其自身的路由。

问题描述

这是一项新功能,本节将描述动态路由可能有所用的用例。

动态暴露外部网络

允许 Neutron 动态地向外部上行链路路由器宣告。

一个 OpenStack 云将针对每个上行网络提供商的至少一个路由器运行路由协议(例如 BGP)。通过向上行链路提供商宣告网络前缀,Neutron 网络将可以通过两条路径被互联网其余部分访问。如果到上行链路提供商的链接中断,故障信息将传播到更上游的路由器,从而通过剩余的健康链接保持云的可访问性。

示例拓扑

../../_images/bgp-sample-topology-1.png

请注意,在此图中,红色网关路由器实际上是一个带有软件 BGP speaker 和软件路由器的 Linux 机器。此蓝图建议通过 Neutron API 配置此 BGP speaker(见下文)。

对于内部云来说,这也将是一个有效的场景,其中上行路由器实际上是其提供商路由器,并且路由使用 iBGP 宣告。

外部网络上浮动 IP 的路由模型

此用例将允许具有大公共 IP 空间的外部网络可能跨越多个 L2 网络。这可以提高 AZ 之间的扩展性和隔离性,同时保持大型外部网络的出现,其中浮动 IP 和网络可以自由浮动。

此用例还可能包括向其上游路由器宣告 Neutron 路由器后面的公共网络。例如,当使用 subnet-allocation 机制为租户网络分配可路由的 IPv6 前缀时,这将对 IPv6 网络非常有用。它不需要从上游路由器学习路由。

地址范围 蓝图添加了一个新的 L3 上下文,以创建公共可路由的租户网络(以及其他优点)。地址范围可以利用此开发来向上行链路路由器宣告新的可路由子网。

示例拓扑

../../_images/bgp-sample-topology-2.png

此用例的拓扑可以看作是前一个用例的泛化,具有多宿主 OpenStack 安装并利用浮动 IP 可以被视为 /32 网络的事实。

提议的变更

概述

提议了一个新的系统,可以动态地向 OpenStack 部署之外的其他对等体宣告路由。从 Neutron API,云管理员应该能够定义这些对等体以及与它们交互的方式。

路由对等体

支持动态路由的系统必须能够向其对等体宣告自己的路由。为了实现此目标,系统必须知道其对等体列表并能够信任从它们接收到的信息。

路由宣告

管理员手动添加的路由将被宣告给外部动态路由对等体。

动态路由系统

在默认实现中,将使用一个新系统来管理 OpenStack 部署边缘的动态路由信息。由于扩展性问题,动态对等连接将不会由每个单独的 Neutron 路由器执行。这种方法可能会创建过多的对等关系。相反,提议的模型设置了一个 speaker 来代表整个 Neutron 部署给外部路由器。

该系统将允许不同的实现(例如,开发您自己的 BGP speaker 实现)以适应第三方要求。

IPv6 影响

该实现必须能够交换 IPv4 和 IPv6 路由。此蓝图对于 IPv6 甚至可能更重要,以完成从云外部到运行 IPv6 的租户网络的路由。

提出的解决方案

参考实现将采用动态路由代理(dr_agent)。此代理将与配置的对等体直接连接,并负责更新某些已定义路由器的动态路由。将填写另一个规范来定义此实现的详细信息。

因此,通过 Neutron API,云管理员应该能够根据其需求为每个代理定义对等连接。

云管理员将能够通过 Neutron API 执行以下新操作

  1. 创建具有 BGP 连接配置选项的 BGPSpeaker 实体。第一种方法只需要 local_as 属性。未来的实现,例如 动态路由的策略支持,将需要在此处添加更多属性。实现驱动程序需要读取这些配置选项并与其对等体建立 BGP 会话。

  2. 创建 RoutingPeer 实体。

  3. RoutingPeer 实体与 BGPSpeaker 关联。 BGPSpeaker 实现驱动程序将能够连接到此 RoutingPeer

  4. RouterBGPSpeaker 关联。这意味着路由器将具有动态路由功能,使其能够宣告其路由

  5. NetworkBGPSpeaker 关联。所有连接到此网络的带有外部网关的路由器都将使用相同的 BGPSpeaker 属性。

此时,Neutron 将比较分配的路由器(步骤 5 意味着外部网络的所有路由器)的子网的地址范围,其外部网关连接到租户的内部子网,以查看它们是否属于相同的地址范围。如果是,BGP speaker 实现将把这些租户子网宣告给其配置的 RoutingPeers。浮动 IP 将隐式包含在内,因为它们是从外部网络分配的。

注意事项

备选方案

多宿主云可以使用经典的联网基础设施来处理,在 OpenStack 部署之外手动配置带有 BGP 的供应商路由器。这是有限制的。它无法处理上述提出的路由浮动 IP 模型。

数据模型影响

本文档建议以下列方式修改数据对象和模式。有关数据对象模型的快速概览,请查看此 etherpad

数据对象更改

将添加三个新的数据模型类:BGPSpeakerRoutingPeerAdvertiseRoute

我们将需要绑定实体

  • RoutingPeerBGPSpeakerBinding 用于将对等体与 BGPSpeaker 关联。

  • RouterBGPSpeakerBinding 用于将路由器与 BGPSpeaker 关联。

  • NetworkBGPSpeakerBinding 用于将网络与 BGPSpeaker 关联。

新的 BGPSpeaker 类将包含以下属性

  • id:实体的 UUID。

  • local_as:本地 AS 值。

现在我们只需要这些值。将来,可以将 BGPSpeaker 的更高级配置选项添加到此处。

表示对等连接的新 RoutingPeer 类将包含以下属性

  • id:实体的 UUID

  • ip:对等体的 IP 地址。

  • remote_as:远程对等体的 AS 值。

  • auth:可以序列化为字典的连接认证数据。

    例如,{type:'MD5',password:'234a23d10234'} 可能是一个简单的示例和首次尝试。

将创建一个名为 AdvertiseRoute 的数据对象,它扩展了 Route 实体并与路由器关联。它将具有以下属性

  • nexthop:下一跳的 IP 地址。

  • destination:CIDR 前缀。

  • router_id:路由实例的 UUID。

RoutingPeerBGPSpeakerBinding 是 BGP 对等体和 BGP speaker 之间的多对多关系,并且只会有

  • peer_id:BGP 对等体的 UUID

  • bgpspeaker_id:动态路由代理的 UUID

RouterBGPSpeakerBinding 是一个多对一关系,具有以下属性

  • router_id:路由器的 UUID

  • bgpspeaker_id:动态路由代理的 UUID。

NetworkBGPSpeakerBinding 是一个多对一关系,具有以下属性

  • network_id:网络的 UUID

  • bgpspeaker_id:动态路由代理的 UUID。

RouterBGPSpeakerBinding 将在您希望传播单个路由器的 AdvertiseRoutes 时使用。此选项适用于上述解释的 动态暴露外部网络 用例。它可以看作是为路由器添加动态路由功能

NetworkBGPSpeakerBinding外部网络上浮动 IP 的路由模型 用例:在这种情况下,您将租户路由 (IPv6) 或浮动 IP 传播到上游路由器。这些路由的分配更具动态性,因为它们取决于租户的使用。您会希望任何连接到网络的路由器都自动被添加以传播其路由。

REST API 影响

API 端点应根据“解决方案建议”部分实现。

安全影响

此功能将允许外部系统操纵 Neutron 网络内的路由信息。外部系统应受信任,并可以使用共享密钥进行身份验证。

动态路由只能由系统管理员配置。

通知影响

当路由交换的控制通道连接中断时,应提供通知

其他最终用户影响

将添加以下 CLI 命令来管理连接 OpenStack 到外部网络的动态路由规范

  • bgp-speaker-list:列出已配置的 BGP Speaker。

  • bgp-speaker-show:显示详细的 BGP Speaker 配置。

  • bgp-speaker-create:创建新的 BGP Speaker 连接。

  • bgp-speaker-update:更新 BGP Speaker 规范。

  • bgp-speaker-delete:删除 BGP Speaker 规范。

  • bgp-speaker-peer-add:将对等体关联到 BGP Speaker。

  • bgp-speaker-peer-list:列出 BGP Speaker 上的对等体

  • bgp-speaker-peer-remove:从 BGP Speaker 上移除对等体。

  • bgp-speaker-network-add:将网络关联到 BGP Speaker。

  • bgp-speaker-network-list:列出 BGP Speaker 上的网络

  • bgp-speaker-network-remove:从 BGP Speaker 上移除网络。

  • bgp-speaker-router-add:将对等体关联到 BGP Speaker。

  • bgp-speaker-router-list:列出 BGP Speaker 上的路由器

  • bgp-speaker-router-remove:从 BGP Speaker 上移除路由器。

  • bgp-peer-list:列出已配置的对等体。

  • bgp-peer-show:显示详细的对等体配置。

  • bgp-peer-create:创建新的对等体连接。

  • bgp-peer-update:更新对等体规范。

  • bgp-peer-delete:删除对等体规范。

  • router-advertiseroutes-list:列出宣告路由。

Horizon 要求

将添加一个新屏幕以配置连接 OpenStack 到外部网络的网关配置。此屏幕将允许将路由和对等配置添加到网关配置中。

外部网络将有一个选项可以链接到路由实例。

使用示例

为服务于外部网络的路由实例配置 2 个上行链路,以宣告其路由并更新已发现的路由。

使用 Neutron CLI 命令的示例配置

neutron bgp-speaker-create --local-as 12345

neutron bgp-peer-create --ip 123.23.43.4 --remote-as=1234

neutron bgp-speaker-peer-add peer1 (previous step created peer. should be an
uuid, but modified for the sake of understanding)

neutron bgp-speaker-network-add bgpspeaker1 network1 (same here, with uuids)

性能影响

此功能描述了一种带外机制来协商路由配置。此功能不应对 Neutron 网络产生性能影响。

其他部署者影响

此功能必须在生效前明确启用和配置。配置文件没有更改。

开发人员影响

此更改不影响当前的开发或任何插件开发。

公开的 Neutron API 与使用的交换路由协议无关。如果另一个开发者想提供除 BGP with exabgp 之外的其他驱动程序,则只有 dr_agent 部分会受到新代码的影响。

社区影响

此更改不影响社区。

替代方案

考虑到用例(BGP 连接),我们认为代理方法是唯一适合 Neutron 的方法。尽管功能可能可以通过使用其他实体和工作流来解决。

实现

负责人

这是一个初步贡献者列表

主要负责人

tidwellr vikram

其他贡献者

devvesa YAMAMOTO

工作项

  • 创建 dr_agent,公开 API 并使用选定的 BGP speaker 实现。( BGP 比较 )

  • 模型表和 API 资源。

  • 定期调度的进程与 dr_agent 通信。

  • 测试。

  • Devstack。

  • 文档。

依赖项

根据实现的不同,可能需要安装新的系统库或 Python 库。

测试

Tempest 测试

动态路由测试可以在隔离环境中进行。外部自治系统可以通过 BGP 软件路由器(例如 quagga)实例进行模拟。

可以测试以下动态路由场景

验证当在网关上启用 BGP 并配置一个对等体时,代理会与对等体建立 BGP 会话,接收路由列表,并向对等体提交宣告的路由。

验证当在网关上禁用 BGP 并配置一个对等体时,dr_agent 不会建立 BGP 会话。

验证当在代理上启用 BGP 并配置 3 个 BGP 对等连接时,代理会建立 3 个 BGP 会话,每个会话连接到已配置的每个对等体。

当配置 2 个或更多对等体时,验证 BGP 实现能够检测到 BGP 会话中断时,从该 BGP 会话接收到的路由会自动从路由表中删除。

功能测试

必须通过模拟代理来开发完整的自上而下的 Neutron API 内部逻辑。

API 测试

必须测试 Neutron 扩展公开的所有 API 端点。

文档影响

关于整个功能的新文档。

用户文档

必须提供解释该功能的用户文档。

开发人员文档

必须提供有关如何为 dr_agent 开发新驱动程序的开发人员文档。

参考资料

以前的工作

链接和帮助