ML2/OVN - OVN外部管理资源共存支持

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

目前使用ML2/OVN的两个独立的Neutron部署是分开的,并且只能使用正常的提供商网络进行通信。然而,OVN支持OVN 互连 (OVN-IC) 功能,允许多个独立的OVN部署连接在一起。这种互连使用正常的覆盖网络实现(就像计算节点之间的覆盖网络一样),因此可以在大规模环境中轻松创建(这对于提供商网络来说不一定成立)。

如今,Neutron OVN db 同步命令会通过从北向数据库中删除非Neutron资源来积极干扰OVN 互连。本规范的目标是消除这种干扰,并允许操作员使用OVN互连和其他由OVN外部管理的功能。本规范的范围不包括将OVN互连直接集成到Neutron(但是,这可能是未来规范的一部分)。

背景:OVN互连用例

OVN互连允许在Layer 3层互连多个集群。这对于具有多个可用区 (AZ) 的部署非常有用,需要允许在单独的区域中的工作负载之间进行连接。

在Layer 3互连的情况下,每个集群/可用区上的逻辑路由器可以通过传输覆盖网络连接。传输网络是互连层的抽象表示,负责此跨集群可见性的是传输交换机 (TS)。这些互连交换机是在全局数据库中创建的,并通过OVN-IC守护程序复制到每个AZ。因此,基本上,一个AZ中的逻辑路由器通过传输交换机连接到另一个AZ中的逻辑路由器。更多详细信息可以在ovn-architecture manpage中找到 [1]

以下描述了使用两个分离的OVN集群(北向和南向)的参考设计

+---------------------------------------------------------------------+
|OVN north cluster                                                    |
|                        +------------------------------------------+ |
|                        |OVN central node                          | |
| +---------------+      |  +-------------+        +-------------+  | |
| |network node   |      |  |ovsdb-server |        |ovsdb-server |  | |
| |ovn-controller +---------+southbound   |        |northbound   |  | |
| |               |      |  |             |        |             |  | |
| +---------------+      |  |             |        |             |  | |
|                        |  |             |        |             |  | |
| +---------------+      |  |             |        |             |  | |
| |compute node   |      |  |             |        |             |  | |
| |ovn-controller +---------+             |        |             |  | |
| |               |      |  |             |        |             |  | |
| +---------------+      |  +------+------+        +-------+-----+  | |
|                        |         |                       |        | |
|                        |         +---+---------------+---+        | |
|                        |             |               |            | |
|                        |  +----------+-----+   +-----+---------+  | |
|                        |  |ovn-ic          |   |ovn-northd     |  | |
|                        |  |                |   |               |  | |
|                        |  |                |   |               |  | |
|                        |  +-------+--------+   +---------------+  | |
|                        |          |                               | |
|                        +----------|-------------------------------+ |
|                                   |                                 |
+-----------------------------------|---------------------------------+
                                    |
            +-----------------------+---------------------+
            |Global DB - Transit switches                 |
            |ovsdb-server: northbound IC, southbound IC   |
            |                                             |
            +-----------------------+---------------------+
                                    |
+-----------------------------------|---------------------------------+
|OVN south cluster                  |                                 |
|                        +----------|-------------------------------+ |
|                        |          |                               | |
|                        |  +-------+--------+   +---------------+  | |
|                        |  |ovn-ic          |   |ovn-northd     |  | |
|                        |  |                |   |               |  | |
|                        |  |                |   |               |  | |
|                        |  +----------+-----|   +-----+---------+  | |
|                        |             |               |            | |
|                        |         +---+---------------+---+        | |
|                        |         |                       |        | |
| +---------------+      |  +------+------+        +-------+-----+  | |
| |network nodeer |      |  |ovsdb-server |        |ovsdb-server |  | |
| |ovn-controller +---------+southbound   |        |northbound   |  | |
| |               |      |  |             |        |             |  | |
| +---------------+      |  |             |        |             |  | |
|                        |  |             |        |             |  | |
| +---------------+      |  |             |        |             |  | |
| |compute node   |      |  |             |        |             |  | |
| |ovn-controller +---------+             |        |             |  | |
| |               |      |  |             |        |             |  | |
| +---------------+      |  +-------------+        +-------------+  | |
|                        |OVN central node                          | |
|                        +------------------------------------------+ |
+---------------------------------------------------------------------+

以下示例将概述OVN互连在OVN范围内的工作方式。因此,它遵循OVN的命名,而不是Neutron的命名(如果两者不同)。

示例设置

+-------------------------------------------------------------+
|                     Logical_Switch                          |
|                     ts1                                     |
+----------+----------------------------------+---------------+
           |                                  |
   +-------+-----------+              +-------+-----------+
   |Logical_Switch_Port|              |Logical_Switch_Port|
   |lsp_ts1_lr1        |              |lsp_ts1_lr2        |
   +-------+-----------+              +-------+-----------+
           |                                  |
   +-------+------------+             +-------+------------+
   |Logical_Router_Port |             |Logical_Router_Port |
   |lrp_lr1_ts1         |             |lrp_lr2_ts1         |
   |172.24.0.10/24      |             |172.24.0.20/24      |
   +-------+------------+             +-------+------------+
           |                                  |
   +-------+------------+             +-------+------------+
   |Logical_Router      |             |Logical_Router      |
   |lr1                 |             |lr2                 |
   +-------+------------+             +-------+------------+
           |                                  |
   +-------+------------+             +-------+------------+
   |Logical_Router_Port |             |Logical_Router_Port |
   |lrp_lr1_ls1         |             |lrp_lr2_ls2         |
   |192.168.0.1/24      |             |192.168.1.1/24      |
   +-------+------------+             +-------+------------+
           |                                  |
   +-------+------------+             +-------+------------+
   |Logical_Switch_Port |             |Logical_Switch_Port |
   |lsp_ls1_lr1         |             |lsp_ls2_lr2         |
   +-------+------------+             +-------+------------+
           |                                  |
   +-------+------------+             +-------+------------+
   |Logical_Switch      |             |Logical_Switch      |
   |ls1                 |             |ls2                 |
   +-------+------------+             +-------+------------+
           |                                  |
   +-------+------------+             +-------+------------+
   |Logical_Switch_Port |             |Logical_Switch_Port |
   |lsp_ls1_vm1         |             |lsp_ls2_vm2         |
   +--------------------+             +--------------------+

上面的示例是互连过程中涉及的元素的逻辑表示。在每一侧,我们都有一个具有本地管理资源的OVN集群/AZ:用于VM的LSP,LS,将VM连接到路由器的LSP以及LR。OVN互连如何添加到标准拓扑中以使其工作?Tenant逻辑路由器和传输交换机之间的连接。

OVN IC的全局数据库动态地在互连域(集群/AZ)的所有成员之间复制TS,并且需要做的是将这个动态创建的TS添加到OVN北向数据库中,与Tenant逻辑路由器一起。

资源所有权

使用OVN互连后,Neutron不再是每个OVN部署中资源的唯一所有者。

因此,我们首先需要定义哪个组件拥有哪种类型的资源。以下将列出来自上述示例的左侧OVN部署的资源。

Neutron拥有的资源

  • lr1

  • lrp_lr1_ls1

  • lsp_ls1_lr1

  • ls1

  • lsp_ls1_vm1

所有这些都代表:* Tenant网络 (ls1) * VM或其他事物的端口 (lsp_ls1_vm1) * Tenant的路由器 (lr1, lrp_lr1_ls1, lsp_ls1_lr1)

OVN-IC拥有的资源

  • ts1

  • lsp_ts1_lr2 (在左侧OVN部署中创建)

  • 可能附加到lr1的Logical_Router_Static_Routes(如果启用了路由学习)

OVN-IC拥有的资源由OVN-IC守护程序动态创建和删除,当该过程在互连域元素之间同步北向数据库时。

操作员拥有的资源

  • lsp_ts1_lr1

  • lrp_lr1_ts1

将传输交换机连接到用户路由器所需的资源需要由操作员创建(手动或通过某种自动化)。在本规范的范围内,在Neutron中管理这些资源不在范围内。

问题描述

操作员已经可以创建上述设置。但是,neutron-ovn-db-sync-util 工具将删除由OVN-IC和操作员拥有的资源,因为Neutron不知道它们。

OVN-IC创建的资源示例

  • Logical_Switch other_config:interconn-ts 具有任何值

  • Logical_Router_Static_Route external_ids:ic-learned-route 具有任何值

  • Logical_Switch_Port type 设置为 remote

这些字段由OVN-IC自动设置,因此它们在 external_idsother_config 寄存器中没有Neutron键。

操作员拥有的资源示例

  • Logical_Switch_Port external_idsother_config 具有任何值

  • Logical_Router_Port external_idsother_config 具有任何值

对于操作员创建的资源,external_idsother_config 没有预定义的选项。

提议的变更

为了解决上述问题,建议引入一个新的过滤规则来检查 neutron-ovn-db-sync-util 方法中的Neutron键,并且不删除由OVN外部管理的资源。

此实现被命名为 OVN外部管理资源共存支持,因为它不属于将任何类型的OVN外部管理资源集成到Neutron的范围。此实现的建议是在检查Neutron创建的资源时创建过滤器,并且它是未来任何打算将OVN互连或其他OVN功能集成到Neutron的实现的基础。

为了实现共存支持,neutron-ovn-db-sync-util 工具只需要检查Neutron管理的资源。此建议的主要思想如下所述。

对于Neutron创建的资源,建议的解决方案通过检查外部ID中的特定Neutron签名来实现这些资源。Neutron在OVN NB数据库中以 neutron: 键的形式创建资源,位于 external_ids 寄存器中

  • Logical_Switch external_ids:”neutron:” 具有任何值

_uuid               : 5bf82c8e-fa49-4b46-bc4f-737311359f44
acls                : []
copp                : []
dns_records         : []
external_ids        : {"neutron:availability_zone_hints"="",
                       "neutron:mtu"="1442",
                       "neutron:network_name"=self_network_az1_tenant1,
                       "neutron:revision_number"="2"}
forwarding_groups   : []
load_balancer       : []
load_balancer_group : []
name                : neutron-2979fcc1-9540-4012-88a2-5f83738b5b6f
other_config        : {mcast_flood_unregistered="false", mcast_snoop="false",
                       vlan-passthru="false"}
ports               : [8e128001-5d9a-41eb-a84b-052dc28a74bc,
                       98555f1c-1a12-4703-8dcb-67f44900f6b8,
                       abeca18e-5706-4a2d-871d-5514ba20f554,
                       ba0e5d5e-5571-4f8c-b15c-dfa5115ba61c]
qos_rules           : []
  • Logical_Switch_Port, Logical_Router, Logical_Router_Port 等 external_ids:”neutron:” 具有任何值

这些 neutron:… 键在external_ids中由Neutron自动设置,因此我们可以依赖它们的存在。我们需要确保 neutron-ovn-db-sync-util 调用中的所有方法都检查external_ids中的Neutron签名,并在Neutron和OVN NB数据库之间同步时过滤/忽略所有其他外部管理的资源。

数据库影响

Rest API 变更

OVN驱动程序更改

如上所述更新 neutron-ovn-db-sync-util

超出范围

  • 以任何方式将ovn-interconnect或其他OVN外部管理功能集成到Neutron中;

实现

负责人

工作项

  • neutron-ovn-db-sync-util 添加排除项

  • 使用Neutron中现有的设施实现相关的单元和功能测试。

  • 编写文档。

文档影响

管理员文档

需要包含管理员文档来描述操作员如何在构建互连的OpenStack集群时使用OVN互连。

测试

  • 单元/功能测试 [2]

参考资料