路由通告¶
BGP¶
本页讨论了 BGP 动态路由的行为,关于如何通告路由以及在项目中显示路由详情。
BGP 动态路由可以通告 3 类路由
托管在非 DVR 路由器上的浮动 IP 地址的主机路由,由于浮动 IP 地址设置在路由器命名空间中,它知道如何将消息路由到正确的方式,因此下一跳应该是路由器网关端口的 IP 地址。
托管在 DVR 路由器上的浮动 IP 地址的主机路由。使用启用 DVR 的路由器,浮动 IP 可以在托管给定实例的计算节点上直接访问。因此,浮动 IP 地址的主机路由应通告计算节点上的 FIP 代理网关作为下一跳,而不是集中式路由器。这将防止入站浮动 IP 流量遇到集中式路由器的瓶颈。
具有地址范围的可以直接路由的租户网络的前缀路由,下一跳是集中式路由器,DVR 和 CVR 相同。BGP 动态路由可以将租户网络前缀通告给物理网络设备(支持 BGP 协议的路由器),称为
Prefixes advertisement(前缀通告)。
当路由器上启用分布式虚拟路由 (DVR) 时,浮动 IP 和固定 IP 的下一跳不会被通告为位于集中式路由器。具有设置为适当计算节点上的下一跳的主机路由会被通告。
逻辑模型¶
+--------+ 1 N +---------------------+
| Router |---------| BgpAdvertisedRoute |
+--------+ +---------------------+
| N
|
| 1
+---------+ N N +------------+ N N +---------+
| BgpPeer |-----------| BgpSpeaker |-----------| Network |
+---------+ +------------+ +---------+
| N
|
| 1
+--------------+
| AddressScope |
+--------------+
注意
一个 BGP 扬声器仅支持一个地址族来使用 BGP。一个双栈 IPv4 和 IPv6 网络需要两个 BGP 扬声器来通告路由,一个用于 IPv4,另一个用于 IPv6。因此,一个网络可以绑定 N 个 BGP 扬声器。
BgpAdvertisedRoute 代表派生数据。由于 BgpAdvertisedRoutes 的数量可能非常大,因此将其存储在数据库表中不可行。BgpAdvertisedRoute 信息可以通过连接 Neutron 数据库中已有的数据来派生。现在 BGP 动态路由项目处理应该通告给外部路由器的 Bgpadvertiseroutes 是基于现有的 Neutron DB 表。Neutron 查看每个网关网络是否有路由器在该网络上具有网关端口。对于每个识别的路由器,Neutron 找到每个可以通过路由器网关端口访问的浮动 IP 和租户网络。然后,Neutron 使用路由器网关端口的 IP 地址作为下一跳通告每个浮动 IP 和租户网络。
当启动 BGP 插件时,它将注册回调函数。所有回调函数都用于处理浮动 IP、路由器接口和路由器网关的创建或更新,这些函数监听这些资源的事件,以便调用 Dragent 来更改通告路由。
现在我们只关注可能导致路由更改的资源,以下回调函数执行此操作。
floatingip_update_callback 此函数监听浮动 IP 的 AFTER_UPDATE 事件,它判断关联的路由器是否已更改,并根据该更改更改通告路由和下一跳。
router_interface_callback 此函数监听租户网络路由的更改,它监听路由器接口资源的 AFTER_CREATE 和 AFTER_DELETE 事件。它调用 Dragent 在接口连接到路由器后通告或停止前缀路由。
router_gateway_callback 此函数监听路由器网关端口的创建或删除。它还关注租户网络路由的更改。
您可以获取特定 BGP 扬声器的通告路由,如下所示:neutron bgp-speaker-advertiseroute-list <created-bgp-speaker> 它执行一个复杂的数据库查询来生成通告路由的列表。有关更多详细信息,请参阅 路由通告数据库查找