隧道网络严格最小带宽支持

Launchpad bug: https://bugs.launchpad.net/neutron/+bug/1991965

RFE 的目标是改进先前实现的 RFE 严格最小带宽支持 [1]

问题描述

[1] 以来,Neutron 具有模拟物理接口(入站和出站)可用带宽的能力,这些接口连接到物理网络(扁平网络和 VLAN 网络)。Placement 会收集此信息,并使用它在具有足够带宽的计算节点上生成具有网络端口的虚拟机。这保证了最小的端口吞吐量。

此功能目前在三个后端中实现:ML2/SR-IOV、ML2/OVS 和 ML2/OVN。完整的相关补丁列表可以在 [2] 中查看。

然而,大多数当前的部署不使用物理支持的网络(扁平网络或 VLAN 网络),而是使用叠加网络(VXLAN 和 Geneve)。当然,这些部署使用 ML2/OVS 和 ML2/OVN;ML2/SR-IOV 不支持隧道网络。这导致当前实现的功能存在差距:无法模拟隧道网络。

提议的变更

此 RFE 提出了一种在计算节点中模拟隧道网络可用带宽的方法。此实现将限制在 ML2/OVS 和 ML2/OVN 后端。

所参考的后端处理叠加流量,通过从主机接口发送和接收此流量,该接口充当 VTEP [3]。此主机接口由 IP 地址标识,在 ML2 插件配置文件中称为“local_ip” [4]

此 RFE 建议使用在 [1] 中提供的相同配置选项,添加一个静态字符串常量来定义 Placement 中的资源提供程序,该资源提供程序可以由管理员配置。该字符串将是资源提供程序名称的后缀,就像 Neutron 使用物理网桥名称来构建其资源提供程序名称一样。例如“u20ovn:OVN Controller agent:rp_tunnelled”,其中“rp_tunnelled”是提供的字符串。默认值将是“rp_tunnelled”。此配置变量将存储在 [ml2] 部分,并且可以从 Neutron 服务器和 OVS 代理访问

[ml2]
tunnelled_network_rp_name = custom_rp_name  # "rp_tunnelled" by default.

ML2/OVS 配置部分的示例

[ovs]
resource_provider_bandwidths = br0:EGRESS:INGRESS,rp_tunnelled:EGRESS:INGRESS

ML2/OVN 配置示例,存储在 OVS 服务的本地数据库中

root@u20ovn:~# ovs-vsctl list open_vswitch .
...
external_ids : {hostname=u20ovn,
                ovn-bridge=br-int,
                ovn-bridge-mappings="public:br-ex",
                ovn-cms-options="enable-chassis-as-gw,
                                 resource_provider_bandwidths=br-ex:4001:5001;rp_tunnelled:4001:5001,
                                 resource_provider_inventory_defaults=allocation_ratio:1.0;min_unit:5,
                                 resource_provider_hypervisors=br-ex:u20ovn;rp_tunnelled:u20ovn",
                ovn-encap-ip="192.168.10.40",
                ovn-encap-type=geneve,
                ovn-remote="tcp:192.168.10.40:6642",
                system-id="a55c8d85-2071-4452-92cb-95d15c29bde7"}

请注意,在 ML2/OVN 中,必须将隧道资源提供程序分配给主机定义在“resource_provider_hypervisors”列表中。

此新字符串常量不能用作物理网桥名称。为了避免任何可能的冲突,在解析物理网络桥接映射时将进行新的检查。

具有 ML2/OVN 后端的宿主机,具有物理网络(映射到物理网桥“br-ex”)和隧道网络,将报告以下资源提供程序树

$ openstack resource provider list
+--------------------------------------+------------------------------------------+------------+--------------------------------------+--------------------------------------+
| uuid                                 | name                                     | generation | root_provider_uuid                   | parent_provider_uuid                 |
+--------------------------------------+------------------------------------------+------------+--------------------------------------+--------------------------------------+
| 8f0e060d-bf63-42a1-85e6-710c8b2fccc8 | u20ovn                                   |         10 | 8f0e060d-bf63-42a1-85e6-710c8b2fccc8 | None                                 |
| cb101b60-527b-5264-8e7f-213c7b88e9e1 | u20ovn:OVN Controller agent              |          1 | 8f0e060d-bf63-42a1-85e6-710c8b2fccc8 | 8f0e060d-bf63-42a1-85e6-710c8b2fccc8 |
| 521f53a6-c8c0-583c-98da-7a47f39ff887 | u20ovn:OVN Controller agent:br-ex        |         20 | 8f0e060d-bf63-42a1-85e6-710c8b2fccc8 | cb101b60-527b-5264-8e7f-213c7b88e9e1 |
| dfdbf43f-f60b-577c-bae8-3dcea448c735 | u20ovn:OVN Controller agent:rp_tunnelled |          6 | 8f0e060d-bf63-42a1-85e6-710c8b2fccc8 | cb101b60-527b-5264-8e7f-213c7b88e9e1 |
+--------------------------------------+------------------------------------------+------------+--------------------------------------+--------------------------------------+

将添加一个新的静态特征来表示此资源提供程序:“CUSTOM_NETWORK_TUNNEL_PROVIDER”。这是识别此资源提供程序用于隧道网络的内容。例如:

$ openstack resource provider trait list $rp_tun
+----------------------------------+
| name                             |
+----------------------------------+
| CUSTOM_VNIC_TYPE_NORMAL          |
| CUSTOM_VNIC_TYPE_DIRECT          |
| CUSTOM_VNIC_TYPE_DIRECT_PHYSICAL |
| CUSTOM_VNIC_TYPE_MACVTAP         |
| CUSTOM_VNIC_TYPE_VDPA            |
| CUSTOM_VNIC_TYPE_REMOTE_MANAGED  |
| CUSTOM_VNIC_TYPE_BAREMETAL       |
| CUSTOM_NETWORK_TUNNEL_PROVIDER   |
+----------------------------------+

这是在创建虚拟机时发送到 Nova 的端口资源请求的示例。该端口具有 500 kbps 的最小带宽规则,出站方向

port['resource_request'] = {
    'request_groups': [
        {'id': 'c51c6f07-8e01-548c-9756-d5e54a780bb6',
         'required': ['CUSTOM_NETWORK_TUNNEL_PROVIDER', 'CUSTOM_VNIC_TYPE_NORMAL'],
         'resources': {'NET_BW_EGR_KILOBIT_PER_SEC': 500}
        }
    ],
    'same_subtree': ['c51c6f07-8e01-548c-9756-d5e54a780bb6']
}

注意

此规范不考虑共享资源提供程序的情况。例如,当相同的接口在 VLAN/扁平网络和叠加网络之间共享时。此规范提出的是为叠加网络中的端口提供调度功能。在具有共享资源的情况下,管理员需要将带宽分配在资源提供程序之间拆分。当前 Placement API 也不 Neutron 无法提供建模共享资源的方式。

REST API 影响

此 RFE 不引入任何 API 更改。

数据模型影响

此 RFE 不引入任何模型更改。

安全影响

无。

性能影响

无。

其他影响

目前,Placement 内部或 ML2 后端(OVS、OVN)中都不支持隧道网络的最小带宽 QoS 规则。但是,端口可能具有这些类型的 QoS 规则(可能从网络 QoS 策略继承而来)。有了此功能,当构建端口资源请求时(即请求特定网络中特定带宽的 Placement blob),最小带宽 QoS 规则将不会被丢弃,就像现在一样。

将添加一个新的检查来告知位于具有最小带宽 QoS 规则的隧道网络上的那些端口。此检查的输出将是包含端口列表、网络和 QoS 策略的日志。此规范考虑了当前的 Neutron 实现

  • ML2/OVS 拒绝分配具有最小带宽规则的 QoS 策略,并防止绑定具有它们的端口。

  • ML2/OVN 机制驱动程序最近实现了最小带宽规则支持,并且不会阻止此场景。但是,此功能是在 Zed 版本中实现的;不太可能许多部署处于这种状态(位于具有 QoS 策略和最小带宽规则的叠加网络中的端口)。

此规范不考虑重建当前分配。任何已经存在于主机中的端口,创建隧道网络的新的资源提供程序,都不会被分配。一旦有标准的执行此操作的程序,将创建一个新的规范/bug 来跟踪此改进,但这不在本规范的范围内。

此 RFE 的一部分将是记录用户在启用此功能之前,如果具有最小带宽规则的端口,可以创建所需分配的替代方法

  • 迁移具有该端口的 VM。这将触发 Placement 调度和分配创建。

  • 分离然后重新连接端口到 VM。这将产生相同的效果。此功能是在 Wallaby 中添加到 Nova 中的。

实现

负责人

主要负责人

Rodolfo Alonso Hernandez <ralonsoh@redhat.com> (IRC: ralonsoh)

工作项

  • ML2 插件更新。

  • 迁移脚本,用于记录隧道网络中具有最小带宽规则的现有端口。

  • 文档,包括重新创建预先创建端口的分配的方法。

  • 测试和 CI 相关更改。

测试

  • 单元/功能测试。

  • 全栈测试:增加当前全栈测试覆盖率,以检查此新功能。

  • Tempest 测试:创建一个具有最小带宽端口的 VM,更新 QoS 策略和最小带宽规则限制,取消设置 QoS 策略,迁移 VM。

文档影响

用户文档

修改“严格最小带宽支持” [1] 文档,添加此新改进。

参考资料