NFV 的 VLAN trunking 网络

https://blueprints.launchpad.net/neutron/+spec/nfv-vlan-trunks

问题描述

许多常用的 Neutron 插件配置创建的网络不允许 VLAN 标记流量通过网络。这包括使用 OVS 驱动程序或 VLAN 驱动程序时的 ML2。相反,有些插件可以很好地传递所有形式的以太网帧。无法通过 API 确定正在使用哪种配置,也无法指示插件需要哪种类型的网络。

VLAN 对于许多 NFV 功能是必需的。本规范建议提供一种请求 VLAN 透明网络的方法——即,VLAN 标记流量将被转发到其他主机——在请求时,并确认网络实际上是 trunk 网络。

NFV 虚拟机的一个常见要求是通过许多单独的 L2 通道进行通信。通道数量远远超过虚拟机拥有的端口数量,并且可以随时间变化。VLAN 标签通常用于分隔这些通道,以便在保持端口数量静态的同时,仍然允许通道数量的灵活性。

在 Neutron 中,不同的网络插件创建具有不同属性的网络,并且没有“网络”一词的具体定义。大多数情况下,但并非总是如此,网络是具有学习交换行为的 L2 广播域,尽管只要反欺骗过滤器到位,网络就可以实现为 L2 或 L3 域。通常,只要网络满足 IPv4 和 IPv6 单播流量、ARP 和 ND 正常工作的最低要求,就不会有人批评插件。VLAN 透明性并非此当前最低要求的一部分,并且有些插件由于疏忽或设计原因,不允许 VLAN 数据包流动。无法通过 API 控制此行为或检测到它,本提案旨在改变这一点。

(其他蓝图提出了将 trunk 分解为单个 VLAN 的网络解决方案、trunk 网络的地址管理等。这不尝试解决除了网络的简单 L2 属性之外的任何问题。本规范解决了与 Openstack 管理端口不同的用例——具体来说,是两个 VLAN 感知虚拟机希望通过多个 VLAN 进行通信的情况,这些 VLAN 可能随时间变化,并且无需在每个阶段告知 Openstack 使用哪些 VLAN 和地址。)

提议的变更

本提案建议实施一种请求-发现机制,以便

  • 现有的能够传递 VLAN 标记流量的插件可以识别自己

  • 现有的无法传递 VLAN 标记流量的插件也可以识别自己

  • 可以识别尚未适应报告其行为的旧插件

  • 未来的插件可以具有选择性行为,网络可能或可能不传递 VLAN 流量,具体取决于用户请求——这允许插件在不需要该功能时做出有利于效率的决策(例如使用 L3 域)。

此外,端口防火墙行为——当前未为 VLAN 标记数据包定义——将被定义为一致地应用于数据包的最外层封装。也就是说,详细说明匹配 IP 端口的反欺骗和安全组将应用于具有 IP 以太网类型的包,但不会应用于包含 IP 以太网类型的 VLAN 以太网类型的包。这是因为 VLAN 极不可能具有与 VM 在同一 vNIC 上的未标记接口相同的地址并提供相同的服务,因此使用相同的过滤几乎肯定会使 VLAN 标记对于实际用途毫无用处。

请求

在 net-create 期间,用户可以选择请求创建一个 VLAN 透明 trunk 网络,方法是在 net-create 请求中传递一个“vlan-transparent”布尔属性,将其设置为“true”。(将属性设置为“false”等效于在下面的描述中不指定该属性。)

尚未适应以理解该属性的插件将忽略此标志并无论如何创建网络。

了解该属性的含义但无法理解该标志,或无法提供 VLAN 透明 trunk 网络的插件将拒绝创建网络并向用户返回适当的错误。

了解此标志并能够提供 VLAN 透明网络的插件将这样做。

插件可以根据此标志更改行为

  • 如果设置了该标志,它们可以创建一个 VLAN 透明网络(可能以更高的资源成本),并且在未设置该标志时节省资源

  • 它们可能拒绝将某些类型的端口附加到网络(例如,某些外部附加端口本身可能不是 VLAN 透明的,因此不应附加到透明网络)

插件也可能仅实现一种类型的网络,即透明或不透明,并在请求控制器无法实现的网络时拒绝创建网络。

如果缺少该标志,则了解的插件没有义务提供 VLAN 透明网络(并且未知的插件自然会忽略其缺失);返回的网络可能或可能不透明。

请注意,该标志无法通过 net-update 更改。VLAN 透明性必须在创建时声明,并且在此之后无法更改,因为这可能会影响网络的放置甚至 VM 连接到的端点选择。

响应

网络创建后,网络可能具有一个属性“vlan-transparent”。

如果不存在此属性,则插件是旧插件,无法确定网络是否能够传递 VLAN 标记数据包。

如果属性存在并且标志设置为 true,则插件是 VLAN 感知插件,并且(无论请求如何)已创建能够传递 VLAN 标记数据包的网络。

如果属性存在并且标志设置为 false,则插件是 VLAN 感知插件,请求未传递“vlan-transparent”标志,并且出于自身原因,插件选择创建一个没有 VLAN 透明性的网络(通常是因为它正在提高效率或它根本无法做到)。

如“请求”中的描述,正确的响应可能是指示无法执行请求的错误。

防火墙

VLAN 标记将被视为不透明的封装。

VLAN 标记数据包将不会被安全组或其他基于端口的安全措施(例如反欺骗)进行防火墙保护,因为该数据包不是 IP 数据包。(对于能够传递 VLAN 标记数据包的驱动程序,这至少有时是行为的改变。)这是一个故意的选择:安全组通常会过滤它们理解的数据包并传递它们不理解的数据包,因此它是一致的(IP-in-MPLS 的行为将是这样的),并且 IP-in-VLAN 数据包极有可能具有与同一接口上的未标记地址不同的地址,并且彼此不同,因此 Openstack 端口安全将不会起到任何有用的作用。

这需要在 IPTables 防火墙驱动程序中进行验证,以确保这是当前看到的行为。

备选方案

存在一个基于端口的 VLAN 规范,允许将一组网络作为 VLAN trunk 提供给指定的端口。它解决了其他用例,并且不是直接替代方案。

数据模型影响

将“vlan-transparent”属性添加到网络,一个三态布尔值。

REST API 影响

在网络上

属性名称

类型

访问

默认值

验证/转换

vlan-transparent

三态

在创建时写入,之后全部只读,全部

缺失

布尔值或缺失

安全影响

在当前通过 VLAN 的实现中,标记数据包的内容会被防火墙保护。这没有明确记录,但用户可能会合理地期望这种行为。

此更改建议将 VLAN 标签视为不透明的封装,因此 VLAN 标记数据包将不会被其内容进行防火墙保护。此外,安全组仅提供基于 IP 的防火墙,因此不可能阻止 VLAN 标记数据包。也就是说,可以预期来宾操作系统在未配置接收 VLAN 时会忽略标记数据包,因此不应产生任何影响。

这与对其他非 IP 数据包类型的行为保持一致。

通知影响

IPv6 影响

其他最终用户影响

python-neutronclient 应进行调整,以考虑 net-create 的新选项以及 net-show 中的新属性。

性能影响

可能会使某些插件更有效地使用网络资源。

其他部署者影响

无。

开发人员影响

无。

社区影响

无。

实现

负责人

ijw-ubuntu

工作项

  • 实现新的 net-create 参数

  • 实现新的网络属性,包括数据库迁移脚本

  • 更改一些插件的采样,包括 ML2 插件,以实现属性的使用

  • 在 ML2 驱动程序上实现一个新的属性,指示当驱动程序在使用中并可能负责网络的某个部分时,是否能够在该网络上传递 VLAN 数据包。驱动程序可以实现 true 或 false 设置,或者属性可以在旧驱动程序中缺失。如果任何驱动程序没有该属性或该属性设置为 false,ML2 将拒绝创建 VLAN 透明网络。

  • 在核心驱动程序中,VLAN 和 OVS 驱动程序将被标记为不支持 VLAN 透明网络,而 LB、VXLAN 和 GRE 驱动程序将被标记为支持 VLAN 透明网络。其他驱动程序将具有旧行为。

  • 其他插件将具有旧行为,直到更新,并且不需要对其进行任何更改。

不是在更改任何驱动程序实现,而只是报告现有驱动程序的已知行为。因此,代理不受影响。

依赖项

测试

Tempest 测试

Tempest 应确认对于已知的良好网络设置,可以从 ML2 请求 VLAN 透明网络,并且它们可以工作。此类测试应理想情况下是主机到主机,以测试软件交换机和硬件配置。

API 测试

API 测试应确认属性在 net-create、net-update 和 net-show 上表现如描述的那样。

功能测试

功能测试应确认 ML2 正确批准和拒绝创建。

文档影响

用户文档

需要记录新的标志。

开发人员文档

需要记录插件和 MechanismDriver 行为以及支持 VLAN 透明网络的要求。

参考资料