vRouter 硬件卸载启用¶
https://blueprints.launchpad.net/nova/+spec/vrouter-hw-offloads
智能网卡允许在网卡上进行复杂的包处理。为了支持对它们的硬件加速,Nova 核心和 os-vif 需要进行修改,以支持它们所支持的 VIF 和 vRouter 插件组合。本规范提出了一种混合 SR-IOV 和 vRouter 模型来实现加速。
注意
在本规范中,Juniper Contrail、OpenContrail 和 Tungsten 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
vrouterVIF 类型将 TAP 设备插入到内核 vrouter.ko 数据平面。vhostuserVIF 类型与vhostuser_vrouter_plug模式一起插入到基于 DPDK 的 vRouter 数据平面。hw_vebVIF 类型使用 vfio-pci 直通将 VM 插入到 NIC 的 VEB 数据平面。
为了启用 SmartNIC 的完整数据平面卸载,Nova 需要在用 vrouter VIF 类型插件 VM 时,支持额外的 VNIC 类型,同时消耗 PCIe 虚拟功能资源。
Open vSwitch 卸载 识别以下 VNIC 类型
normal(或默认) VNIC 类型表示实例已插入软件桥接。vrouterVIF 类型当前仅支持此 VNIC 类型。directVNIC 类型表示 VF 已直通到实例。
此外,Agilio OVS VIF 类型实现了以下卸载模式
virtio-forwarderVNIC 类型表示 VF 通过 virtio-forwarder 附加。
用例¶
目前,最终用户可以使用以下方法之一,将端口附加到运行在支持插件 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 中的
vrouterVIF 类型。修改
_nova_to_osvif_vif_vrouter以支持两个额外的 VNIC 类型VNIC_TYPE_DIRECT:将使用 os-vifVIFHostDevice。VNIC_TYPE_VIRTIO_FORWARDER:将使用 os-vifVIFVHostUser。
Nova 的代码影响是通过使用阶段 2 中开发的扩展将 representor 信息传递给 os-vif 插件。
插件方法摘要¶
Contrail 支持的现有方法
VIF 类型:
hw_veb(遗留)VNIC 类型:
direct
VIF 类型:
vhostuser(os-vif 插件:contrail_vrouter)VNIC 类型:
normal详细信息: vhostuser_vrouter_plug: Trueos-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: Trueos-vif 对象:
VIFVHostUser
VIF 类型:
vrouter(os-vif 插件:vrouter)VNIC 类型:
normalos-vif 对象:
VIFGeneric
额外的加速插件模式(阶段 3)
VIF 类型:
vrouter(os-vif 插件:vrouter)VNIC 类型:
directos-vif 对象:
VIFHostDeviceport_profile.datapath_offload: DatapathOffloadRepresentor
VIF 类型:
vrouter(os-vif 插件:vrouter)VNIC 类型:
virtio-forwarderos-vif 对象:
VIFVHostUserport_profile.datapath_offload: DatapathOffloadRepresentor
其他说明¶
阶段 1 和阶段 2 可以并行完成和验证。抽象层将在 Open vSwitch 卸载上进行测试。
在 Contrail Controller 中进行 VEB 直通模式和卸载的 vRouter 数据平面直通模式之间的选择。这取决于与 Neutron 端口关联的提供商网络。
vRouter os-vif 插件 已更新为采用
vrouter作为新的 os-vif 插件名称。contrail_vrouter,保留为向后兼容的别名。这可以防止命名空间碎片化。 Tungsten Fabric、OpenContrail 和 Juniper Contrail 可以使用单个 os-vif 插件来处理 vRouter 数据平面。Neutron 中不需要相应的更改。Contrail Neutron 插件和代理只需要进行最少的更改,以便语义能够正确传播。
此更改与 SmartNIC 数据平面无关:如果 Contrail 切换到基于 TC 的卸载、eBPF 或第三方方法,Nova 插件逻辑将保持不变以进行完全卸载。
部署者/管理员仍然需要在 hypervisor 上使用
pci_passthrough_whitelist在nova.conf中注册 PCI 设备。启用 SmartNIC 的节点和标准计算节点可以并排运行。标准的调度过滤器会根据端口类型和驱动程序功能分配和放置实例。
备选方案¶
提出的替代方案需要对 Nova 进行更多侵入性的补丁
创建一个新的 VIF 类型
这将为 Contrail 添加三个 VIF 类型进行维护。这并不是理想的。
添加 glance 或 flavor 注解
这将强制实例具有一种类型的加速。代码可能会移动到更多的 VIF 类型,并且虚拟功能预留仍然需要更新。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
os-vif 插件以提升的权限运行。
通知影响¶
无
其他最终用户影响¶
最终用户将能够使用 normal、direct 或 virtio-forwarder VNIC 类型将端口插入到已启用硬件的 Nova 节点上运行的 Contrail 的实例中。
性能影响¶
此代码可能会在 VIF 插件和断开连接时调用。预计性能不会下降。
在加速端口上,实例之间的数据平面性能预计会提高。
其他部署者影响¶
部署者仍然需要配置 Contrail 的 SmartNIC 组件并在 Nova 部署中配置 PCI 白名单。
开发人员影响¶
核心 Nova 语义将略有改变。vrouter VIF 将支持更多的 VNIC 类型。
升级影响¶
新的 VNIC 类型语义将在具有此补丁的计算节点上可用。
部署者必须安装 os-vif 插件才能保留 Nova 中的现有功能。预计这将由 Contrail 中的最低必需版本来处理。
实现¶
负责人¶
- 主要负责人
Jan Gutter <jan.gutter@netronome.com>
工作项¶
contrail-controller 审查实施语义已合并并正在等待发布标签:https://review.opencontrail.org/42850
OpenContrail os-vif 参考插件已更新并正在等待发布标签:https://review.opencontrail.org/43399
阶段 1:os-vif 端口 vRouter VIF 已提交:https://review.openstack.org/571325
阶段 2:需要实现 Generic os-vif 数据平面卸载规范。
阶段 3:需要使用阶段 2 中添加到 os-vif 的接口来修改 OpenContrail os-vif 参考插件。
阶段 3:需要在 Nova 中添加
vrouterVNIC 支持:https://review.openstack.org/572082
依赖项¶
以下对 Tungsten Fabric 的依赖项已合并到主分支并正在等待发布标签
Contrail/Tungsten Fabric 控制器需要进行次要更新才能启用所提出的语义。这已合并到:https://review.opencontrail.org/42850
os-vif 参考插件已在:https://review.opencontrail.org/43399 中更新
以下项目可以并行进行
需要发布用于加速数据平面插件模式的 os-vif 扩展。有关更多详细信息,请参阅 Generic os-vif 数据平面卸载规范。os-vif 库更新计划在 Stein 版本中进行。
在 Contrail os-vif 插件上发布待定标签后,可以完成 vRouter os-vif 转换蓝图。目前计划在 Tungsten Fabric 5.1 版本中完成此操作。
一旦实施了上述两个任务,以下项目就可以并行进行
Nova 可以实施
contrailos-vif 插件的 VNIC 支持。可以更新
contrailos-vif 插件以使用新的 os-vif 接口。
测试¶
单元测试已刷新,现在更全面地涵盖了 VIF 操作。
需要进行第三方 CI 测试以验证 Contrail 和 Tungsten Fabric 的兼容性。
文档影响¶
由于此规范影响非参考 Neutron 插件,因此 Nova 中的发布说明就足够了。需要提及 Contrail / Tungsten Fabric 的特定版本,才能提供新的插件以提供现有功能。Contrail / Tungsten Fabric 方面应驱动配置和使用新插件模式的外部文档。