OVN 的可用区指南

本页的目的是描述可用区如何与 OVN 协同工作。在阅读本文档之前,建议先阅读 ML2/OVS 驱动程序的可用区指南

Neutron 中有两种类型的可用区:路由器和网络。对于 ML2/OVS,这与 L3 代理和 DHCP 代理的调度相关。对于 ML2/OVN,这与逻辑路由器端口和“外部”端口的调度相关。

有关每种类型可用区的更多详细信息,请稍后在本文档中查找,但首先让我们回顾一下它们之间的共同部分

如何配置它

与 Neutron 的 ML2/OVS 驱动程序不同,OVN 驱动程序的可用区不是通过配置文件配置的。由于 ML2/OVN 不依赖于外部代理(例如 L3 代理),因此某些节点(例如网关/网络节点)将不存在任何 Neutron 配置文件。因此,OVN 使用本地 OVSDB 来配置运行在该超visor上的 ovn-controller 实例所属的可用区。

配置是通过本地 Open_vSwitch 表中的 ovn-cms-options 条目完成的

$ ovs-vsctl set Open_vSwitch . external-ids:ovn-cms-options="enable-chassis-as-gw,availability-zones=az-0:az-1:az-2"

上面的命令将两个配置添加到 ovn-cms-options 选项中,即 enable-chassis-as-gw 选项,它告诉 OVN 驱动程序这是一个网关/网络节点,以及 availability-zones 选项,指定三个可用区:az-0az-1az-2

注意

指定“enable-chassis-as-gw”选项对于可用区**不是必需的**,但是 ML2/OVN 在调度 routerexternal 端口时,只会考虑作为网关的节点(即具有“enable-chassis-as-gw”选项的节点)。因此,即使可以单独设置“availability-zones”选项,ML2/OVN 驱动程序目前对此没有用例。

请注意,用于指定可用区的语法是 availability-zones 单词,后跟等号 (=) 和一个**冒号**分隔的可用区列表,该列表属于本地 ovn-controller 实例。

要确认特定的 ovn-controller 可用区,请查看以下命令输出中的“**可用区**”列

$ openstack network agent list
+--------------------------------------+------------------------------+----------------+-------------------+-------+-------+----------------+
| ID                                   | Agent Type                   | Host           | Availability Zone | Alive | State | Binary         |
+--------------------------------------+------------------------------+----------------+-------------------+-------+-------+----------------+
| 2d1924b2-99a4-4c6c-a4f2-0be64c0cec8c | OVN Controller Gateway agent | gateway-host-0 | az0, az1, az2     | :-)   | UP    | ovn-controller |
+--------------------------------------+------------------------------+----------------+-------------------+-------+-------+----------------+

注意

如果您知道代理的 UUID,也可以使用“openstack network agent show <UUID>”命令。

要确认系统中定义的可用区

$ openstack availability zone list --network
+-----------+-------------+
| Zone Name | Zone Status |
+-----------+-------------+
| az0       | available   |
| az1       | available   |
| az2       | available   |
+-----------+-------------+

路由器可用区

为了创建具有可用区的路由器,应将 --availability-zone-hint 传递给 create 命令,请注意,如果路由器属于多个可用区,则可以多次指定此参数。例如

$ openstack router create --availability-zone-hint az-0 --availability-zone-hint az-1 router-0
+-------------------------+--------------------------------------+
| Field                   | Value                                |
+-------------------------+--------------------------------------+
| admin_state_up          | UP                                   |
| availability_zone_hints | az-0, az-1                           |
| availability_zones      |                                      |
| created_at              | 2020-06-04T08:29:33Z                 |
| description             |                                      |
| external_gateway_info   | null                                 |
| flavor_id               | None                                 |
| id                      | 8fd6d01a-57ad-4e91-a788-ebe48742d000 |
| name                    | router-0                             |
| project_id              | 2a364ced6c084888be0919450629de1c     |
| revision_number         | 1                                    |
| routes                  |                                      |
| status                  | ACTIVE                               |
| tags                    |                                      |
| updated_at              | 2020-06-04T08:29:33Z                 |
+-------------------------+--------------------------------------+

也可以通过 /etc/neutron/neutron.conf 配置文件设置默认可用区

[DEFAULT]
default_availability_zones = az-0,az-2
...

在调度路由器的网关端口时,OVN 驱动程序将考虑路由器的可用区,并确保端口在属于这些可用区的节点上进行调度。

请注意,在路由器对象中,我们有两个与可用区相关的属性:availability_zonesavailability_zone_hints

| availability_zone_hints | az-0, az-1                           |
| availability_zones      |                                      |

这种区别在 ML2/OVS 驱动程序中更有意义,后者依赖于 L3 代理进行路由器放置(有关更多信息,请参阅 ML2/OVS 驱动程序的可用区指南)。在 ML2/OVN 中,ovn-controller 服务将在集群的所有节点上运行,因此 availability_zone_hints 将始终与 availability_zones 属性匹配,如下所示

| availability_zone_hints | az-0, az-1                           |
| availability_zones      | az-0, az-1                           |

OVN 数据库信息

为了通过 OVN 北向数据库检查路由器的可用区,可以查找 neutron:availability_zone_hints 键在 Logical_Router 表中的其条目的 external_ids 列中

$ ovn-nbctl list Logical_Router
_uuid               : 4df68f1e-17dd-4b9a-848d-b6152ae19203
external_ids        : {"neutron:availability_zone_hints"="az-0,az-1", "neutron:gw_port_id"="", "neutron:revision_number"="1", "neutron:router_name"=router-0}
name                : neutron-8fd6d01a-57ad-4e91-a788-ebe48742d000
...

要检查 Chassis 的可用区,请查看 OVN 南向数据库中 Chassis 表的 ovn-cms-options 键(或对于旧版本的 OVN,external_ids)的 other_config

$ ovn-sbctl list Chassis
_uuid               : abaa9f07-9988-40c0-bd1a-8d8326af08b0
name                : "2d1924b2-99a4-4c6c-a4f2-0be64c0cec8c"
other_config        : {..., ovn-cms-options="enable-chassis-as-gw,availability-zones=az-0:az-1:az-2"}
...

路由器可用区 部分所述,网关路由器端口的调度将考虑路由器所属的可用区。我们可以通过查看 OVN 北向数据库中的 Gateway_Chassis 表来确认此行为

$ ovn-nbctl list Gateway_Chassis
_uuid               : ac61b70f-ff51-43d9-830b-f9bc6d74090a
chassis_name        : "2d1924b2-99a4-4c6c-a4f2-0be64c0cec8c"
external_ids        : {}
name                : lrp-5a40eeca-5233-4029-a470-9018aa8b3de9_2d1924b2-99a4-4c6c-a4f2-0be64c0cec8c
options             : {}
priority            : 2

_uuid               : c1b7763b-1784-4e5a-a948-853662faeddc
chassis_name        : "1cde2542-69f9-4598-b20b-d4f68304deb0"
external_ids        : {}
name                : lrp-5a40eeca-5233-4029-a470-9018aa8b3de9_1cde2542-69f9-4598-b20b-d4f68304deb0
options             : {}
priority            : 1

此表中的每个条目代表网关端口的一个实例(L3 HA,有关更多信息,请参阅 OVN 中的路由),chassis_name 列指示该端口实例被调度到的 Chassis。如果我们将每个条目及其 chassis_name 相关联,我们会看到该端口仅被调度到与路由器可用区匹配的 Chassis,并优先在每个区域内进行分配。

网络可用区

由于 OVN 具有分布式 DHCP 服务器模型(有关更多信息,请参阅 ovn-architecture 文档),因此有人可能会认为 ML2/OVN 无需支持网络可用区,因为无需将 DHCP 代理放置在同一区域内为 VM 提供服务,但是,在 ML2/OVN 中,有一种特殊情况是 external 端口,这些端口需要了解可用区才能进行调度。

这些 external 端口位于与运行 VM 的节点不同的节点上。目前,ML2/OVN 仅支持一种使用这些端口的案例,即 SR-IOV 支持

为了创建具有可用区的网络,应将 --availability-zone-hint 传递给 create 命令,请注意,如果网络属于多个可用区,则可以多次指定此参数。例如

$ openstack network create --availability-zone-hint az-0 --availability-zone-hint az-1 network-0
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   | az-0, az-1                           |
| availability_zones        |                                      |
| created_at                | 2021-04-26T14:04:51Z                 |
| description               |                                      |
| dns_domain                |                                      |
| id                        | ba584cdb-b866-4744-85d3-6e38718055cc |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | False                                |
| is_vlan_transparent       | None                                 |
| mtu                       | 1442                                 |
| name                      | network-0                            |
| port_security_enabled     | True                                 |
| project_id                | ffd9e4a60af34b0599f1d50aed20dde0     |
| provider:network_type     | None                                 |
| provider:physical_network | None                                 |
| provider:segmentation_id  | None                                 |
| qos_policy_id             | None                                 |
| revision_number           | 1                                    |
| router:external           | Internal                             |
| segments                  | None                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      |                                      |
| updated_at                | 2021-04-26T14:04:52Z                 |
+---------------------------+--------------------------------------+

OVN 数据库信息

创建设置了可用区的第一个 external 端口后,OVN 北向数据库中也会创建一个与该网络对应的 HA Chassis 组

$ openstack port create --network network-0 --vnic-type direct port-0
+-------------------------+--------------------------------------+
| Field                   | Value                                |
+-------------------------+--------------------------------------+
| id                      | 2523d7f5-c7ca-40b8-83c5-ac37e5b126ea |
| name                    | port-0                               |
| network_id              | ba584cdb-b866-4744-85d3-6e38718055cc |
...
+-------------------------+--------------------------------------+

要找到相应的 HA Chassis 组,我们需要查找名为 neutron-<Neutron 网络 UUID> 的组,例如

$ ovn-nbctl list HA_Chassis_Group neutron-ba584cdb-b866-4744-85d3-6e38718055cc
_uuid               : f6a49abb-dc97-4e2a-955a-6f8e8be4865e
external_ids        : {"neutron:availability_zone_hints"="az-0,az-1"}
ha_chassis          : [46850075-7383-4da9-b0b2-5ded2858f681, ce1da6a5-77d3-4945-b218-c0ae35403b80]
name                : neutron-ba584cdb-b866-4744-85d3-6e38718055cc

在上面的输出中,可以看到 Neutron 网络 ba584cdb-b866-4744-85d3-6e38718055cc 的 HA Chassis 组包含两个 Chassis(ha_chassis 列),它们是该网络也所属的可用区的一部分。

我们可以检查这些成员,以查看哪个具有**最高**优先级,这意味着当 external 端口绑定时,它将首先绑定到组中具有**最高**优先级 HA Chassis。如果该 Chassis 发生故障,端口将移动到下一个具有**最高**优先级 Chassis,依此类推。要检查这些 HA Chassis,请执行

$ ovn-nbctl list HA_Chassis 46850075-7383-4da9-b0b2-5ded2858f681
_uuid               : 46850075-7383-4da9-b0b2-5ded2858f681
chassis_name        : "2c5c4479-0e2b-4742-a1d7-df10be020143"
external_ids        : {}
priority            : 32766

$ ovn-nbctl list HA_Chassis ce1da6a5-77d3-4945-b218-c0ae35403b8
_uuid               : ce1da6a5-77d3-4945-b218-c0ae35403b80
chassis_name        : "159970f0-71f7-4d3d-9a9e-92e37c5f03c5"
external_ids        : {}
priority            : 32767

在这种情况下,**活动** Chassis 是 159970f0-71f7-4d3d-9a9e-92e37c5f03c5

最后,要查找外部端口属于的 HA Chassis 组,请查看 OVN 北向数据库

$ sudo ovn-nbctl list Logical_Switch_Port 2523d7f5-c7ca-40b8-83c5-ac37e5b126ea
_uuid               : 382d8cd8-575f-4a3f-93ba-a01cb9c2c265
ha_chassis_group    : f6a49abb-dc97-4e2a-955a-6f8e8be4865e
name                : "2523d7f5-c7ca-40b8-83c5-ac37e5b126ea"
type                : external
...

ha_chassis_group 列将指向 OVN 数据库中它所属的 HA Chassis 组的 UUID。