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_ids 或 other_config 寄存器中没有Neutron键。
操作员拥有的资源示例
Logical_Switch_Port external_ids 或 other_config 具有任何值
Logical_Router_Port external_ids 或 other_config 具有任何值
对于操作员创建的资源,external_ids 或 other_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中;
实现¶
负责人¶
主要负责人:Felix Huettner <felix.huettner@mail.schwarz> Roberto Bartzen Acosta <rbartzen@gmail.com>
工作项¶
向 neutron-ovn-db-sync-util 添加排除项
使用Neutron中现有的设施实现相关的单元和功能测试。
编写文档。
文档影响¶
管理员文档¶
需要包含管理员文档来描述操作员如何在构建互连的OpenStack集群时使用OVN互连。
测试¶
单元/功能测试 [2]。