ML2/OVN L3 插件中路由器对功能/服务提供商的支持

https://bugs.launchpad.net/neutron/+bug/2020823

多 L3 后端中,ML2/OVS 机制驱动程序增加了功能,以支持由不同后端驱动程序实现的 L3 路由器。最近,电信/5G 行业的 OpenStack 部署者表示强烈希望 ML2/OVN 机制驱动程序也能提供相同的支持。本规范提议实现该功能。

问题描述

自 Neutron 开发早期以来,社区就认识到需要提供框架,以使云部署的运营商和用户能够配置和选择一系列选项,实现 VPN、防火墙、路由器等服务的不同实现。多年来,这导致了 Neutron 的提案和添加,例如Neutron/服务类型框架服务功能框架以及前面提到的多 L3 后端。所有这些都在 API 中由网络功能框架服务提供商L3 功能扩展表示。

截至本规范撰写之时,使用 ML2/OVN 的运营商无法利用所有这些现有框架向其用户提供不同实现(此后称为“功能”)的虚拟路由器。因此,Neutron 无法满足电信运营商希望同时提供不同等级虚拟路由器的用例,例如:

  • 用于其 IT / 后台工作负载的 OVN 虚拟路由器。

  • OVN 之外的专用虚拟路由器,用于其 5G 移动网络。

  • OVN 之外的专用虚拟路由器,用于其 4G 移动网络。

  • 其他类型的专用虚拟路由器。

提议的变更

该提案旨在为 ML2/OVN L3 插件添加处理不同类型虚拟路由器的能力。默认类型将是原生的 OVN 虚拟路由器。

为了实现这一点,ML2/OVN L3 插件中所有与虚拟路由器和浮动 IP 相关的 OVN 特定功能都将重构到一个单独的驱动程序中。一旦完成,L3 插件将只负责执行与虚拟路由器和浮动 IP 相关的 Neutron 数据库处理步骤,而让单独的驱动程序负责所有后端处理。这些驱动程序将侦听并响应由重构后的 L3 插件发送的关于虚拟路由器和浮动 IP 的创建、更新和删除事件通知。每个驱动程序将只负责处理与其类型相关的事件。

云管理员将为与 OVN 不同的后端配置、加载驱动程序并将其与类型名称关联。下图说明了拟议的场景

+--------+          +------------+               +------------+    +------+    +------+    +-----------------+
|        |          |            |     Event     |            |--->| NBDB |--->| SBDB |--->| OVN Controllers |
|        |          |            | Notifications | Driver for |    +------+    +------+    +-----------------+
|        |          |            |-------------->| flavor OVN |
|        |          |            |               |            |
|        |          |            |               +------------+
|        |          |            |
|        |          |            |               +------------+    +-----------+
|        |          |            |     Event     |            |--->| Backend A |
|  ReST  | Requests |     L3     | Notifications | Driver for |    +-----------+
|  API   |--------->|   plugin   |-------------->|  flavor A  |
|        |          |            |               |            |
|        |          |            |               +------------+
|        |          |            |
|        |          |            |               +------------+    +-----------+
|        |          |            |     Event     |            |--->| Backend B |
|        |          |            | Notifications | Driver for |    +-----------+
|        |          |            |-------------->|  flavor B  |
|        |          |            |               |            |
+--------+          +------------+               +------------+
                          |                             |
                          |       +-------------+       |
                          |       |             |       |
                  Updates +------>|   Neutron   |<------+ Reads
                                  |   database  |
                                  |             |
                                  +-------------+

在此图中,后端指驱动程序需要在数据平面中实例化路由器和浮动 IP 的代理和数据库(在 Neutron 范围之外)的任何组合。此规范实现将包含一个 OVN 驱动程序和必要的脚手架,以使其他驱动程序能够在 Neutron 部署中进行配置,但驱动程序本身及其关联的数据库和代理将由第三方提供。

一旦配置了驱动程序,用户将在创建虚拟路由器时指定所需的类型。OVN 类型将是默认值,并通过在创建请求中不指定类型来表示。以下命令演示了如何创建第三方类型虚拟路由器

$ openstack network flavor list
+--------------------------------------+----------------------------+---------+---------------+------------------------------------------------------+
| ID                                   | Name                       | Enabled | Service Type  | Description                                          |
+--------------------------------------+----------------------------+---------+---------------+------------------------------------------------------+
| e47c1c5c-629b-4c48-b49a-78abe6ac7696 | user-defined-router-flavor | True    | L3_ROUTER_NAT | User defined flavor for routers in the L3 OVN plugin |
+--------------------------------------+----------------------------+---------+---------------+------------------------------------------------------+

$ openstack router create router-of-user-defined-flavor --flavor e47c1c5c-629b-4c48-b49a-78abe6ac7696
+-------------------------+--------------------------------------+
| Field                   | Value                                |
+-------------------------+--------------------------------------+
| admin_state_up          | UP                                   |
| availability_zone_hints |                                      |
| availability_zones      |                                      |
| created_at              | 2023-06-08T20:26:01Z                 |
| description             |                                      |
| enable_ndp_proxy        | None                                 |
| external_gateway_info   | null                                 |
| flavor_id               | e47c1c5c-629b-4c48-b49a-78abe6ac7696 |
| id                      | fe110d50-f994-4593-86a4-fc2ecca34c38 |
| name                    | router-of-user-defined-flavor        |
| project_id              | b807321af03f44dc808ff06bbc845804     |
| revision_number         | 1                                    |
| routes                  |                                      |
| status                  | ACTIVE                               |
| tags                    |                                      |
| tenant_id               | b807321af03f44dc808ff06bbc845804     |
| updated_at              | 2023-06-08T20:26:01Z                 |
+-------------------------+--------------------------------------+

截至本规范撰写之时,openstack 客户端不允许在创建虚拟路由器时指定类型 ID。将此功能添加到客户端将是本规范实现的一部分。

L3 插件启动时,OVN 类型驱动程序将默认加载。以下是云管理员配置和加载其他类型驱动程序将遵循的步骤示例

  1. 将服务提供商添加到 neutron.conf

    [service_providers]
    service_provider = L3_ROUTER_NAT:user-defined:neutron.services.ovn_l3.service_providers.user_defined.UserDefined
    
  2. 重新启动 neutron 服务器并验证用户定义的提供商已加载

    $ openstack network service provider list
    +---------------+--------------+---------+
    | Service Type  | Name         | Default |
    +---------------+--------------+---------+
    | L3_ROUTER_NAT | user-defined | False   |
    | L3_ROUTER_NAT | ovn          | True    |
    +---------------+--------------+---------+
    
  3. 为路由器类型创建服务配置文件

    $ openstack network flavor profile create --description "User defined router flavor profile" --enable --driver neutron.services.ovn_l3.service_providers.user_defined.UserDefined
    +-------------+--------------------------------------------------------------------+
    | Field       | Value                                                              |
    +-------------+--------------------------------------------------------------------+
    | description | User defined router flavor profile                                 |
    | driver      | neutron.services.ovn_l3.service_providers.user_defined.UserDefined |
    | enabled     | True                                                               |
    | id          | a717c92c-63f7-47e8-9efb-6ad0d61c4875                               |
    | meta_info   |                                                                    |
    | project_id  | None                                                               |
    +-------------+--------------------------------------------------------------------+
    
  4. 创建路由器类型

    $ openstack network flavor create --service-type L3_ROUTER_NAT --description "User defined flavor for routers in the L3 OVN plugin" user-defined-router-flavor
    +---------------------+------------------------------------------------------+
    | Field               | Value                                                |
    +---------------------+------------------------------------------------------+
    | description         | User defined flavor for routers in the L3 OVN plugin |
    | enabled             | True                                                 |
    | id                  | e47c1c5c-629b-4c48-b49a-78abe6ac7696                 |
    | name                | user-defined-router-flavor                           |
    | service_profile_ids | []                                                   |
    | service_type        | L3_ROUTER_NAT                                        |
    +---------------------+------------------------------------------------------+
    
  5. 将服务配置文件添加到路由器类型

    $ openstack network flavor add profile user-defined-router-flavor a717c92c-63f7-47e8-9efb-6ad0d61c4875
    

REST API 影响

预计不会对 REST API 产生影响。

数据库影响

预计不会对数据库产生影响。

实现

负责人

工作项

  • 将嵌入在 L3 插件中的 OVN 虚拟路由器和浮动 IP (NAT) 功能重构为一个单独的驱动程序。

  • 为 L3 插件实现一个驱动程序控制器,该控制器将自动加载 OVN 路由器和浮动 IP 的驱动程序。

  • 更新 ML2/OVN 维护任务,使第三方类型的虚拟路由器不同步到 NBDB。

  • 为 openstack 客户端添加功能,使用户能够在创建虚拟路由器时指定类型。

  • 实施测试。

  • 编写文档。

参考资料

在上述文本中已提供。