OVN Neutron Agent 和硬件卸载 QoS 扩展¶
Launchpad bug: https://bugs.launchpad.net/neutron/+bug/1998608
该 RFE 的目标是定义一个新的通用 OVN agent 的架构,该 agent 将执行任何所需的功能,并且像任何其他 ML2 agent 一样可扩展。要实现的首个功能将是硬件卸载 QoS 扩展。
问题描述¶
ML2/OVN 是一种机制驱动程序,没有后端 agent。此机制驱动程序暴露两种 agent 类型:OVN 控制器 agent 和元数据 agent。OVN 控制器 agent 是节点上 ovn-controller 服务状态的表示;元数据 agent 是向虚拟机提供元数据的服务。
但是,ML2/OVN 机制驱动程序没有 agent 来执行本地 Open vSwitch 服务配置,就像 ML2/OVS 一样,使用扩展驱动程序(如 QoS 或 Trunk)。ovn-controller 读取 OVN 南向数据库以配置本地 OVS 数据库。
缺乏运行在本地节点上、由 Neutron 拥有的 agent,阻止我们实现 OVN 或驱动程序当前不支持的一些功能。例如,这将是 OVN agent 将要实现的第一个功能,由于驱动程序的限制,硬件卸载端口无法应用 OVS QoS 规则,特别是针对 NVIDIA Mellanox ConnectX-5 网络卡 [0]。
提议的变更¶
此 RFE 建议创建一个在计算节点上运行的通用 agent。该 agent 将被称为“OVN Neutron Agent”。此 agent 的执行是可选的,仅当特定计算节点上请求其实现的功能时才需要。换句话说,最初此服务将是必需的,如果计算节点具有硬件卸载端口并且需要 QoS(未来可以实现新功能)。
与其他机制驱动程序 agent(如 ML2/OVS 或 ML2/SRIOV)不同,此 agent 不实现 RPC 客户端。所需的信息将从本地 OVS 数据库、OVN 北向数据库和 OVN 南向数据库中检索。在未来的 RFE 中讨论包含 RPC 功能以与 Neutron 服务器和 Neutron 数据库建立直接连接。
可扩展的功能¶
新的 agent 功能将通过扩展定义。它将使用 neutron.agent.agent_extensions_manager.AgentExtensionsManager 类来加载配置的 OVN Neutron Agent 扩展。它将使用其他 ML2 agent 使用的相同的配置变量“agent.extensions”。OVN Neutron Agent 扩展将继承自 neutron_lib.agent.extensions.AgentExtension,并在 agent 启动时由 agent 扩展管理器加载。
如前所述,OVN agent 将具有活动的 OVN 北向、OVN 南向和本地 OVS 数据库连接,使用相应的 IDL 类。这些类将监视一组表并注册一组事件。每个扩展都必须报告启动过程中需要哪些表和事件。扩展将继承自特定的 OVN Neutron Agent 扩展类(从上述 AgentExtension 派生),该类将提供 API 方法来检索此信息。
OVN agent 状态报告¶
需要在 Neutron 服务器中跟踪这个新的 OVN Neutron Agent。当前有两种类型的 agent:“OVN Controller agent”/“OVN Controller Gateway agent”和“OVN metadata agent”。此 RFE 将引入“OVN Neutron Agent”类型。这是一个通用名称,符合此规范的目标,即创建一个通用的 OVN agent 来实现 OVN 控制器无法提供的所有所需功能(元数据将是下一个要实现的特性,从当前的“OVN metadata agent”迁移)。
报告机制将与 OVN 元数据 agent 中实现的一样。当南向表“SB_Global”更新时,agent 将更新“external_ids”字典中的一个键。请查看 neutron.agent.ovn.metadata.agent.SbGlobalUpdateEvent 以获取实现示例。服务器将读取此变量,检查时间戳并确定 agent 状态。
硬件卸载端口的 QoS¶
此 agent 将要实现的第一个功能(扩展)是硬件卸载端口的 QoS 扩展。由于当前驱动程序的限制,这些端口无法使用当前的 QoS 规则正确配置。
此 RFE 建议使用相应的“ip-link” [1] 命令(或其“pyroute2”等效命令)来配置端口代表虚拟功能速率(最大值和最小值)。这类似于 ML2/SRIOV 为虚拟功能 (VF) 所做的事情。
端口代表(或 devlink 端口 [2])是一种暴露设备信息的 API;它不是物理端口,而是硬件端口的代表。devlink 端口连接到本地 OVS 交换机;使用“devlink”工具(或“pyroute2”等效工具),可以检索端口信息,包括物理功能 (PF) PCI 地址。例如:
$ devlink port show enp4s0f1_5 -jp
"port": {
"pci/0000:04:00.1/65542": {
"type": "eth",
"netdev": "enp4s0f1_5",
"flavour": "pcivf",
"pfnum": 1,
"vfnum": 5,
"splittable": false,
"function": {
"hw_addr": "fa:16:3e:f8:7b:10"
}
}
}
有了 PF PCI 地址,就可以检索 PF 名称,该名称将存储在
$ cat /sys/bus/pci/devices/$pf_pci_address/net
使用 ML2/SRIOV 类 PciDeviceIPWrapper,可以设置 VF 的最大和最小速率,了解 VF 索引和 PF 名称。
OVN QoS 信息位置¶
OVN QoS 信息存储在两个不同的位置(由于 ML2/OVN 和核心 OVN 中 QoS 的当前实现方式)
最大带宽(“rate”)和最大突发(“burst”)限制存储在“Qos:bandwidth”字典中
$ ovn-nbctl list Qos
_uuid : 376303c4-5290-4c4e-a489-d35894315199
action : {}
bandwidth : {rate=1000, burst=800}
direction : to-lport
external_ids : {"neutron:port_id"="89a81cc0-7b3e-473d-8c01-2539cf2a9a6a"}
match : "outport == \"89a81cc0-7b3e-473d-8c01-2539cf2a9a6a\""
priority : 2002
最小带宽速率存储在“Logical_Switch_Port:options”字典中
$ ovn-nbctl list Logical_Switch_Port
_uuid : 502b3852-4a46-4fcb-9b49-03063cfc0b34
addresses : ["fa:16:3e:c4:b8:29 10.0.0.8"]
dhcpv4_options : a7e4cfb1-ef22-490a-9ffe-fea04de3fe1c
dhcpv6_options : []
dynamic_addresses : []
enabled : true
external_ids : {...(skipped)}
ha_chassis_group : []
name : "e6808371-c9ac-4015-94a3-7f16ac3fbb2d"
options : {mcast_flood_reports="true", qos_min_rate="1000",
requested-chassis=u20ovn}
parent_name : []
port_security : ["fa:16:3e:c4:b8:29 10.0.0.8"]
tag : []
tag_request : []
type : ""
up : true
OVN QoS 事件¶
硬件卸载 QoS 扩展将通过响应以下事件来配置 QoS 设置(请查看工作 POC [3] 以获取更多信息)
本地 OVS 接口创建:使用此事件,OVN 监视器将存储哪些端口绑定到本地实例。它将存储 Neutron 端口 ID(存储在“Interface.external_ids:iface-id”字符串中)和 OVS 端口名称。
本地 OVS 接口删除:此事件将触发 QoS 重置和接口本地缓存删除。
OVN 南向“Port_Binding”创建事件:在本地 OVS 中创建端口后接收此事件。如果接收到此事件,将触发本地端口的 QoS 更新。值得注意的是,此事件始终在本地 OVS 接口创建之后发生;这意味着 OVN 监视器已经注册了该端口已本地绑定。
OVN 北向“Logical_Switch_Port”注册更改:如果本地绑定 LSP 的最小带宽发生变化,则此事件会触发 QoS 更新。
OVN 北向“QoS”注册更改:类似于前一个,但影响最大带宽限制。
REST API 影响¶
此 RFE 不引入任何 API 更改。
数据模型影响¶
此 RFE 不引入任何模型更改。
安全影响¶
无。
性能影响¶
每个监视器将具有到本地 OVS 数据库以及远程 OVN 北向和南向数据库的连接。连接到远程 OVN 数据库可能会对 OVN 数据库节点(通常是 OpenStack 控制器)的负载产生严重影响。此初始实现将订阅以下表
北向:QoS、Logical_Switch_Port 和 Logical_Switch
南向:Chassis、Encap、Port_Binding、Datapath_Binding 和 SB_Global
应通过以下方式减少此性能影响
减少节点上的 agent 数量。下一步要实现(在本 RFE 范围之外)是将 OVN 元数据 agent 功能移动到这个新的 OVN Neutron agent。这将把南向数据库连接减少到一个 agent。
找到一种将最小带宽信息存储在 Logical Switch Port 之外的方法。通过不订阅此表,北向连接将显著减少负载。Logical Switch Port 是最繁忙和最活跃的表之一;不本地缓存或接收其更新将减少对 OVN 数据库的影响。
其他影响¶
无。
实现¶
负责人¶
- 主要负责人
Rodolfo Alonso Hernandez <ralonsoh@redhat.com> (IRC: ralonsoh)
工作项¶
OVN 监视器实现和硬件卸载 QoS 扩展。
测试和 CI 相关更改。
测试¶
单元/功能测试。
注意
硬件卸载 QoS 扩展需要特定的硬件来测试此功能。目前无法在 CI 上实现任何 tempest 测试。
文档影响¶
用户文档¶
有关如何配置和启动 OVN 监视器的信息。
有关硬件卸载 QoS 扩展的信息。