vRouter 硬件卸载启用

https://blueprints.launchpad.net/nova/+spec/vrouter-hw-offloads

智能网卡允许在网卡上进行复杂的包处理。为了支持对它们的硬件加速,Nova 核心和 os-vif 需要进行修改,以支持它们所支持的 VIF 和 vRouter 插件组合。本规范提出了一种混合 SR-IOV 和 vRouter 模型来实现加速。

注意

在本规范中,Juniper ContrailOpenContrailTungsten Fabric 将可互换使用。

问题描述

智能网卡能够将数据包直接路由到单个 SR-IOV 虚拟功能。这些功能可以使用 IOMMU (vfio-pci 直通) 或低延迟 vhost-user virtio-forwarder 在计算节点上运行连接到实例。 vRouter 数据包处理流水线Contrail Agent 管理。如果 内核 vRouter 中的卸载钩子 存在,则数据平面匹配/动作规则可以完全卸载到智能网卡,而不是在 hypervisor 上执行。

为了更深入地讨论数据平面卸载,强烈建议阅读 Generic os-vif 数据平面卸载规范

vrouter VIF 类型尚未转换为 os-vif 插件模型。本规范建议将转换为 os-vif 插件作为第一阶段。

目前,Nova 支持多种 Contrail 插件:TAP 插件、vhost-user socket 插件或 VEB SR-IOV 插件。Neutron 和 Contrail 控制器会根据 Neutron 端口语义和计算节点的配置来决定将哪种 VIF 类型传递给 Nova。然后,该 VIF 类型会传递给 Nova

  • vrouter VIF 类型将 TAP 设备插入到内核 vrouter.ko 数据平面。

  • vhostuser VIF 类型与 vhostuser_vrouter_plug 模式一起插入到基于 DPDK 的 vRouter 数据平面。

  • hw_veb VIF 类型使用 vfio-pci 直通将 VM 插入到 NIC 的 VEB 数据平面。

为了启用 SmartNIC 的完整数据平面卸载,Nova 需要在用 vrouter VIF 类型插件 VM 时,支持额外的 VNIC 类型,同时消耗 PCIe 虚拟功能资源。

Open vSwitch 卸载 识别以下 VNIC 类型

  • normal (或默认) VNIC 类型表示实例已插入软件桥接。 vrouter VIF 类型当前仅支持此 VNIC 类型。

  • direct VNIC 类型表示 VF 已直通到实例。

此外,Agilio OVS VIF 类型实现了以下卸载模式

用例

  • 目前,最终用户可以使用以下方法之一,将端口附加到运行在支持插件 vRouter VIF 的 hypervisor 上的实例:

    • Normal:标准的基于内核的插件,或基于 vhost-user 的插件,具体取决于 hypervisor 上运行的数据平面。

    • Direct:PCI 直通插件到 SR-IOV NIC 的 VEB。

  • 此外,最终用户应该能够使用以下方法之一,将端口附加到运行在配置适当的 hypervisor 上的实例,该 hypervisor 配备了 SmartNIC:

    • Passthrough:加速 IOMMU 直通到卸载的 vRouter 数据平面,非常适合 NFV 类似的应用。

    • Virtio Forwarder:加速 vhost-user 直通,与标准 virtio 驱动程序具有最大的软件兼容性,并支持实时迁移。

  • 这使得 Juniper、Tungsten Fabric(以及 Netronome 等合作伙伴)能够与现有的 OVS VF Representor 数据平面卸载实现功能对等。

提议的变更

  • 阶段 1:vRouter 迁移到 os-vif。

    • vRouter os-vif 插件 已经使用主分支上的所需代码进行了更新。此阶段的更改取决于该项目发布的版本,以便在发布说明中反映所需的特定版本。

      此任务的进度在 vRouter os-vif 转换蓝图 上跟踪。

    • nova/virt/libvirt/vif.py

      删除遗留 vRouter 配置生成代码,LibvirtGenericVIFDriver.get_config_vrouter(),并将插件代码,LibvirtGenericVIFDriver.{plug,unplug}_vrouter(),迁移到外部 os-vif 插件。

      对于基于内核的插件,将使用 VIFGeneric。

    • privsep/libvirt.py

      删除 privsep 代码,{plug,unplug}_contrail_vif()

      将对 vrouter-port-control 的调用迁移到外部 os-vif 插件,并且进一步的更改将超出 Nova 的范围。

  • 阶段 2:扩展 os-vif 以更好地抽象 representor。

    os-vif 的对象模型需要使用更好的抽象模型进行更新,以允许 representor 适用于 vrouter 数据平面。

    通过实现 Generic os-vif 数据平面卸载规范 来涵盖此阶段。

  • 阶段 3:扩展 Nova 中的 vrouter VIF 类型。

    修改 _nova_to_osvif_vif_vrouter 以支持两个额外的 VNIC 类型

    • VNIC_TYPE_DIRECT:将使用 os-vif VIFHostDevice

    • VNIC_TYPE_VIRTIO_FORWARDER:将使用 os-vif VIFVHostUser

    Nova 的代码影响是通过使用阶段 2 中开发的扩展将 representor 信息传递给 os-vif 插件。

插件方法摘要

  • Contrail 支持的现有方法

    • VIF 类型:hw_veb(遗留)

      • VNIC 类型:direct

    • VIF 类型:vhostuser(os-vif 插件:contrail_vrouter

      • VNIC 类型:normal

      • 详细信息: vhostuser_vrouter_plug: True

      • os-vif 对象 VIFVHostUser

    • VIF 类型:vrouter(遗留)

      • VNIC 类型:normal

  • 迁移到 os-vif 后(阶段 1)

    • VIF 类型:hw_veb(遗留)

      • VNIC 类型:direct

    • VIF 类型:vhostuser(os-vif 插件:contrail_vrouter

      • VNIC 类型:normal

      • 详细信息: vhostuser_vrouter_plug: True

      • os-vif 对象:VIFVHostUser

    • VIF 类型:vrouter(os-vif 插件:vrouter

      • VNIC 类型:normal

      • os-vif 对象:VIFGeneric

  • 额外的加速插件模式(阶段 3)

    • VIF 类型:vrouter(os-vif 插件:vrouter

      • VNIC 类型:direct

      • os-vif 对象:VIFHostDevice

      • port_profile.datapath_offload: DatapathOffloadRepresentor

    • VIF 类型:vrouter(os-vif 插件:vrouter

      • VNIC 类型:virtio-forwarder

      • os-vif 对象:VIFVHostUser

      • port_profile.datapath_offload: DatapathOffloadRepresentor

其他说明

  • 阶段 1 和阶段 2 可以并行完成和验证。抽象层将在 Open vSwitch 卸载上进行测试。

  • Contrail Controller 中进行 VEB 直通模式和卸载的 vRouter 数据平面直通模式之间的选择。这取决于与 Neutron 端口关联的提供商网络。

  • vRouter os-vif 插件 已更新为采用 vrouter 作为新的 os-vif 插件名称。contrail_vrouter,保留为向后兼容的别名。这可以防止命名空间碎片化。 Tungsten FabricOpenContrailJuniper Contrail 可以使用单个 os-vif 插件来处理 vRouter 数据平面。

  • Neutron 中不需要相应的更改。Contrail Neutron 插件和代理只需要进行最少的更改,以便语义能够正确传播。

  • 此更改与 SmartNIC 数据平面无关:如果 Contrail 切换到基于 TC 的卸载、eBPF 或第三方方法,Nova 插件逻辑将保持不变以进行完全卸载。

  • 部署者/管理员仍然需要在 hypervisor 上使用 pci_passthrough_whitelistnova.conf 中注册 PCI 设备。

  • 启用 SmartNIC 的节点和标准计算节点可以并排运行。标准的调度过滤器会根据端口类型和驱动程序功能分配和放置实例。

备选方案

提出的替代方案需要对 Nova 进行更多侵入性的补丁

  • 创建一个新的 VIF 类型

    • 这将为 Contrail 添加三个 VIF 类型进行维护。这并不是理想的。

  • 添加 glance 或 flavor 注解

    • 这将强制实例具有一种类型的加速。代码可能会移动到更多的 VIF 类型,并且虚拟功能预留仍然需要更新。

数据模型影响

REST API 影响

安全影响

os-vif 插件以提升的权限运行。

通知影响

其他最终用户影响

最终用户将能够使用 normaldirectvirtio-forwarder VNIC 类型将端口插入到已启用硬件的 Nova 节点上运行的 Contrail 的实例中。

性能影响

此代码可能会在 VIF 插件和断开连接时调用。预计性能不会下降。

在加速端口上,实例之间的数据平面性能预计会提高。

其他部署者影响

部署者仍然需要配置 Contrail 的 SmartNIC 组件并在 Nova 部署中配置 PCI 白名单。

开发人员影响

核心 Nova 语义将略有改变。vrouter VIF 将支持更多的 VNIC 类型。

升级影响

新的 VNIC 类型语义将在具有此补丁的计算节点上可用。

部署者必须安装 os-vif 插件才能保留 Nova 中的现有功能。预计这将由 Contrail 中的最低必需版本来处理。

实现

负责人

主要负责人

Jan Gutter <jan.gutter@netronome.com>

工作项

依赖项

以下对 Tungsten Fabric 的依赖项已合并到主分支并正在等待发布标签

以下项目可以并行进行

  • 需要发布用于加速数据平面插件模式的 os-vif 扩展。有关更多详细信息,请参阅 Generic os-vif 数据平面卸载规范。os-vif 库更新计划在 Stein 版本中进行。

  • 在 Contrail os-vif 插件上发布待定标签后,可以完成 vRouter os-vif 转换蓝图。目前计划在 Tungsten Fabric 5.1 版本中完成此操作。

一旦实施了上述两个任务,以下项目就可以并行进行

  • Nova 可以实施 contrail os-vif 插件的 VNIC 支持。

  • 可以更新 contrail os-vif 插件以使用新的 os-vif 接口。

测试

  • 单元测试已刷新,现在更全面地涵盖了 VIF 操作。

  • 需要进行第三方 CI 测试以验证 Contrail 和 Tungsten Fabric 的兼容性。

文档影响

由于此规范影响非参考 Neutron 插件,因此 Nova 中的发布说明就足够了。需要提及 Contrail / Tungsten Fabric 的特定版本,才能提供新的插件以提供现有功能。Contrail / Tungsten Fabric 方面应驱动配置和使用新插件模式的外部文档。

参考资料