允许路由 VM 数据而非桥接的新 VIF 类型

https://blueprints.launchpad.net/nova/+spec/vif-type-tap

我们建议添加一种新的 VIF 类型,VIF_TYPE_TAP,其含义是 VM 的 VNIC 在主机侧 - 至少最初 - 是一个简单的 TAP 接口,未连接到桥接或 vSwitch。Neutron 代理可以继续处理如何处理来自该接口的数据以及如何向其传递数据 - 但这超出了 Nova 需要提供的初始 TAP 接口设置范围。

问题描述

对于 Project Calico (http://www.projectcalico.org/),我们希望进入 VM 的管道在主机侧是一个简单、未桥接的 TAP 接口,目前我无法使用任何 VIF_TYPE 来实现这一点。

VIF_TYPE_MIDONET、VIF_TYPE_IOVISOR 和 VIF_TYPE_IVS(没有防火墙或混合插头)都会创建一个未桥接的 TAP 接口,但随后对其进行额外的操作(在 Nova 代码中)以将该 TAP 接口连接到主机的网络系统。其他 VIF_TYPE 涉及桥接或 vSwitch,或直接连接到物理主机接口。

用例

一个应用是 VIF_TYPE_TAP 使来自/往 VM 的数据,以及同一主机上的 VM 之间的数据,可以通过其直接计算主机路由,而不是桥接。这在只需要第 3 层(IP)及以上服务的 VM 部署中很有趣,并且仍然可以通过 iptables 和路由分发过滤器来实现任何给定 OpenStack 网络、安全组和路由器配置所暗示的详细连接和安全策略。有关其工作原理的更多信息,请参阅 Project Calico (http://www.projectcalico.org/)。

然而,VIF_TYPE_TAP 的适用性应该比仅仅一个项目更广泛。它使 Neutron 中一类实验性的未来网络实现得以探索(通过插件、机制驱动程序和代理代码),而无需更改或修补任何 Nova 代码。

项目优先级

不适用。(应 John Garbutt 的建议)

提议的变更

在 nova/network/model.py 中添加 VIF_TYPE_TAP。

在 nova/virt/libvirt/vif.py 中添加 get_config_tap、plug_tap 和 unplug_tap 方法,其实现方式是简单地配置、创建和删除 TAP 设备。

VIF_TYPE_TAP 的 libvirt 配置将是一个 <interface type=”ethernet”> 元素,带有空脚本,就像现有的 VIF_TYPE_MIDONET 和 VIF_TYPE_IOVISOR 情况一样,通过调用 self.get_base_config 和 designer.set_vif_host_backend_ethernet_config 来准备。

当要使用 VIF_TYPE_TAP 启动 VM 时

  • Nova 通过调用 linux_net.create_tap_dev 在 plug_tap() 中创建 TAP 接口

  • libvirt 启动 VM,配置如上所述,以匹配创建的 TAP 接口。

备选方案

无。所有在 nova/virt/libvirt/vif.py 中实现插头的现有 VIF_TYPE 都不适用,如上述问题描述中所述。在 Juno 之前,可以配置使用树外 VIF 驱动程序(使用 virt_driver 设置),但已被弃用并已删除。

数据模型影响

无。

REST API 影响

无。

安全影响

计算主机可以通过安装 iptables 规则来防止 VM 在 VIF_TYPE_TAP 接口上进行 IP 地址欺骗,要求来自 VM 的每个数据包都具有预期的源 IP 地址。

如果 VIF_TYPE_TAP 接口未连接到桥接,VM 的 MAC 地址欺骗不会产生影响。如果 VIF_TYPE_TAP 接口_是_连接到桥接,则该桥接可以实现与现有桥接 VIF_TYPE 类似的 MAC 欺骗保护。

通知影响

无。

其他最终用户影响

无。

性能影响

除非显式请求 VIF_TYPE_TAP vif 类型(例如,由 Neutron/ML2 机制驱动程序类),否则对标准 OpenStack 系统不会产生任何性能影响。

其他部署者影响

此处提出的 Nova 扩展将不会影响现有或新部署的 OpenStack 系统,除非在某个地方显式请求 VIF_TYPE_TAP vif 类型(例如,由 Neutron/ML2 机制驱动程序类)。

开发人员影响

无。

实现

负责人

主要负责人

neil-jerram

其他贡献者

lukasaoz cliljenstolpe

工作项

基于 Icehouse 和 Juno 发布代码,我们已经实现了此规范所需的更改,并进行了广泛测试。

Kilo 周期提交的代码可以在 https://review.openstack.org/#/c/146914/ 上查看。

剩余的工作项目如下

  • 正式提交更改以供审查。

  • 参与随之而来的讨论、标记和重新审查过程。

  • 重复直到完成!

依赖项

无。

测试

在 OpenStack 生态系统中,此更改将在单元测试级别进行测试,方法是在 nova/tests/virt/libvirt/test_vif.py 中添加一个测试用例,该测试用例创建并验证具有 VIF_TYPE_TAP 类型的虚拟接口。

(它还将通过在 Project Calico (http://www.projectcalico.org/) 中继续相关的开发和测试,在系统级别进行广泛测试,该项目使用 VIF_TYPE_TAP,并且通常会在公开进行此类工作并报告。)

然而,我们理解这并不是 OpenStack 生态系统内正式可验证的测试;因此,此处仅供参考。

文档影响

预计不会对 Nova 进行任何文档更改。VIF_TYPE_TAP 将由相关的 Neutron/ML2 驱动程序在适当的时候自动启用。

参考资料

http://www.projectcalico.org/

https://github.com/Metaswitch/calico-nova

https://github.com/Metaswitch/calico-neutron