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-0、az-1 和 az-2。
注意
指定“enable-chassis-as-gw”选项对于可用区**不是必需的**,但是 ML2/OVN 在调度 router 和 external 端口时,只会考虑作为网关的节点(即具有“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_zones 和 availability_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。