显式管理默认路由

RFE: https://launchpad.net/bugs/1921126

本文档提出允许显式管理 Neutron 路由器的默认路由。这对于用户安装多个用于等价成本多路径 (ECMP) 的默认路由并统一管理这些路由非常有用。

问题描述

目前 extraroute API 允许显式添加默认路由,这里的默认路由指的是目标地址为 0.0.0.0/0 且具有任意(已连接)下一跳的路由。但是路由器已经具有从其外部网关设置派生的隐式默认路由(其下一跳是网关端口的第一个子网的 gateway_ip)。据我所知,这两种来源的默认路由之间的交互存在问题。例如,我们的 api-ref 中对此有警告 [1]。另一些不熟悉这些警告的人认为这种行为完全是错误的 [2]

我们已经合并了一个关于 ECMP 的规范 [3]。ECMP 对于默认路由与任何其他路由一样有意义。但是,如果您想管理多个默认路由条目以实现默认路由上的 ECMP,那么您必须管理隐式默认路由和通过 extraroute API 的其他默认路由的混合。

提议的变更

本文档提出将路由器默认路由的隐式管理与显式管理分离。路由器要么具有一个传统的隐式默认路由,要么所有默认路由都通过 extraroute API 显式管理。但绝不会是这两种方式的混合。

我们建议添加一个新的 API 扩展:default-route-management。它引入了一个新的路由器属性:explicit_default_routes。这是一个布尔值,默认值为 False。它可以在创建和更新路由器时设置。

explicit_default_routes 设置为 False(隐式模式)时,路由器的默认路由将像以前一样从其外部网关派生。此默认路由无法通过 extraroute API 查看(同样,像以前一样)。为了保持向后兼容性,我们不应该拒绝 extraroute API 上的默认路由。但是,我们可以记录在隐式模式下,不建议通过 extraroute API 管理默认路由。

更新路由器的 explicit_default_routes(无论方向)都会被拒绝,除非路由器的 routes 属性包含

  • 要么没有默认路由,

  • 要么恰好一个默认路由,其下一跳与隐式模式中的下一跳相同。

explicit_default_routes 设置为 True(显式模式)时,Neutron 路由器将不会安装任何隐式默认路由。但是,如果满足上述允许的额外路由(即:恰好一个默认路由,其下一跳与隐式模式中的下一跳相同),则可以从隐式模式更新到显式模式,而不会造成流量丢失。在这种情况下,默认路由将在更新过程中保留。

在显式模式下,可以通过 extraroute API 管理默认路由。并且可以正确管理它们 - 例如,设置的所有默认路由都可以通过 extraroute API 查看。

数据库影响

routers 表中添加一个布尔列 explicit_default_routes,默认值为 False

REST API 影响

新的 API 扩展:default-route-management 引入新的路由器属性:explicit_default_routes

客户端影响

osc 和 openstacksdk 中的相关更改。

测试

  • 单元测试。

  • neutron-tempest-plugin 中的 Tempest 测试。

负责人

参考资料