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 类型驱动程序将默认加载。以下是云管理员配置和加载其他类型驱动程序将遵循的步骤示例
将服务提供商添加到 neutron.conf
[service_providers] service_provider = L3_ROUTER_NAT:user-defined:neutron.services.ovn_l3.service_providers.user_defined.UserDefined
重新启动 neutron 服务器并验证用户定义的提供商已加载
$ openstack network service provider list +---------------+--------------+---------+ | Service Type | Name | Default | +---------------+--------------+---------+ | L3_ROUTER_NAT | user-defined | False | | L3_ROUTER_NAT | ovn | True | +---------------+--------------+---------+
为路由器类型创建服务配置文件
$ 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 | +-------------+--------------------------------------------------------------------+
创建路由器类型
$ 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 | +---------------------+------------------------------------------------------+
将服务配置文件添加到路由器类型
$ openstack network flavor add profile user-defined-router-flavor a717c92c-63f7-47e8-9efb-6ad0d61c4875
REST API 影响¶
预计不会对 REST API 产生影响。
数据库影响¶
预计不会对数据库产生影响。
实现¶
负责人¶
Miguel Lavalle irc: mlavalle, email: mlavalle@redhat.com
工作项¶
将嵌入在 L3 插件中的 OVN 虚拟路由器和浮动 IP (NAT) 功能重构为一个单独的驱动程序。
为 L3 插件实现一个驱动程序控制器,该控制器将自动加载 OVN 路由器和浮动 IP 的驱动程序。
更新 ML2/OVN 维护任务,使第三方类型的虚拟路由器不同步到 NBDB。
为 openstack 客户端添加功能,使用户能够在创建虚拟路由器时指定类型。
实施测试。
编写文档。
参考资料¶
在上述文本中已提供。