Physical Network Awareness

https://bugs.launchpad.net/ironic/+bug/1666009

Ironic 端口和端口组对应于裸机节点上可用的物理网卡。Neutron 端口是连接到租户和提供商网络的逻辑端口。在具有多个物理网络的系统中启动裸机节点时,逻辑端口和物理端口之间的映射必须考虑系统的物理网络连接性。

此功能旨在使 ironic 了解 neutron 网络和网络段的 physical_network 属性。

问题描述

物理网络

提供商网络或网络段上的 neutron 端口与物理网络相关联。物理网络概念用于指定系统中网络和网络段的物理连接性。

运营商可能使用多个物理网络的原因有很多,包括

  • 路由的提供商网络 [1]

  • 通过物理隔离流量来实现安全性

  • 通过多个网络的独立性来实现冗余

  • 流量隔离(例如,存储与应用程序)

  • 不同的特性(带宽、延迟、可靠性)

  • 不同的技术(以太网、Infiniband、Omnipath 等)

可能有些或所有节点都连接到多个物理网络。OpenStack 在科学计算社区中的采用正在迅速增长,在该领域,连接到多个物理网络的节点的使用非常普遍。

作为参考,我们提供一些关于物理网络属性在其他 OpenStack 组件中使用的示例。neutron ML2 Open vSwitch 代理通过 [OVS] bridge_mappings 配置选项来实现物理网络感知。此选项将物理网络名称映射到具有物理网络接口作为端口的 Open vSwitch 桥接器。此选项用于 flat 和 VLAN 网络类型,并在 neutron 服务器 ML2 驱动程序中将端口绑定到网络段时加以考虑。这既可以确保物理连接性允许请求的逻辑拓扑,又支持主机连接到多个物理网络。

nova 中也存在类似的映射,用于通过 [DEFAULT] pci_passthrough_whitelist 配置选项传递 PCI 物理设备或 SR-IOV 虚拟功能。

Ironic 中的物理网络

ironic 端口连接到物理网络。由于端口组是第二层构造,因此端口组中的所有端口应位于同一物理网络中。如果 neutron 端口映射到端口或端口组,并且连接到不同物理网络上的 neutron 网络或网络段,则裸机节点的网卡与其他网络上的 neutron 端口之间将没有连接性。当导致接口无法获取 DHCP 租约时,这一点最为明显。

neutron 中的逻辑端口与 ironic 中的物理端口和端口组之间的映射一直有些不可预测 [2]。ironic-neutron 集成工作增加了对端口的本地链路信息的支持 [3]。在接口 attach/detach API 工作中 [4] ironic 将虚拟接口的附加责任从 nova 转移到 ironic。在这两个特性中,物理网络感知都被视为范围之外。

当前,当虚拟接口附加到节点时,用于将其映射到 ironic 端口或端口组的过程如下

  • 如果存在空闲端口组,则选择一个

  • 否则,如果存在启用 PXE 的空闲端口,则选择一个

  • 否则,如果存在禁用 PXE 的空闲端口,则选择一个

  • 否则失败

此算法不考虑端口和端口组连接到的物理网络,因此可能导致无效的映射。此外,目前 ironic 中没有标准方法来指定端口或端口组连接到的物理网络。

配置和清理网络

ironic 可插拔网络提供程序 [5] 工作增加了对在配置和清理操作期间将节点连接到专用配置和清理网络的支持。当前,所有启用 PXE 的 ironic 端口和端口组都连接到配置或清理网络。虽然这确保了节点在配置或清理物理网络上有一个端口,但如果 ironic 的某些端口或端口组连接到不同的物理网络,则可能会导致不必要地创建 neutron 端口。在实践中,可以通过禁用不需要的端口上的 PXE 来避免这种情况。

调度

在具有多个物理网络的系统中,并非所有节点都连接到每个物理网络,因此用户可能会请求无法实现的逻辑网络拓扑。由于缺乏对每个 ironic 节点连接的物理网络的了解,nova 无法可靠地将实例调度到 ironic 节点。这个问题超出了本规范的范围。

提议的变更

有四个部分构成了针对此问题的提议解决方案。

  1. 必须能够指定 ironic 端口连接到的物理网络。

  2. ironic 网络接口必须在附加租户虚拟接口时考虑 ironic 节点端口和端口组的物理网络。

  3. 在将节点连接到配置或清理网络时,应仅为与配置或清理网络相同的物理网络上的 ironic 端口和端口组创建 neutron 端口。

  4. 附加的 neutron 端口的绑定配置文件应使用 ironic 端口或端口组的物理网络进行更新,该端口或端口组映射到该端口。

标记端口

端口可以通过以下几种方式与物理网络关联

  1. local_link_connection 字段的新属性

  2. extra 字段的新属性

  3. 新的第一类字段

重用现有字段当然比添加新字段更容易实现,但 OpenStack 历史表明,埋藏的字段经常最终需要成为第一类公民。一个相关的例子是 neutron 网络上的 provider:physical_network 扩展字段,后来成为网络段上的第一类字段 [1]。此外,如果 ironic 打算在未来支持物理网络感知调度,则能够有效地按物理网络过滤端口可能会有利。因此,本规范建议向 ironic 的 Port 对象添加一个新的第一类 physical_network 字段。为了保持向后兼容性,此字段将是可选的。

将物理网络映射到 ironic 端口的过程不在 ironic 的范围内。这可以通过手动过程或通过使用硬件内省过程中收集的信息的自动化过程来完成。例如,如果使用 ironic inspector 执行内省,则可以创建一个内省插件 [6],该插件将通过 LLDP 发现的交换机 ID 映射到物理网络。

端口组

端口组的物理网络将通过其组成端口的物理网络确定。端口组中的所有端口必须具有相同的物理网络,这将在 ironic API 中创建和更新端口时强制执行。

这有一个不幸的后果,即更新端口组中端口的物理网络会比较麻烦,因为必须在更新物理网络时将端口从端口组中删除。未来可以通过在端口组 API 中使用虚拟物理网络字段来改进,该字段允许同时更新组中所有端口的物理网络字段。

将逻辑端口映射到物理端口

为了考虑物理网络连接性,虚拟接口附加算法必须确定 neutron 端口可以绑定到的物理网络。此信息通过 neutron API 作为端口网络中的网络段上的 physical_network 字段或作为端口网络上的 provider:physical_network 提供。

虚拟接口附加映射算法将被修改为使用以下按降序排列的标准

  1. 拒绝物理网络与网络的所有物理网络不同的非空物理网络端口和端口组

  2. 优先选择具有非空物理网络的端口和端口组,而不是具有空物理网络的端口

  3. 优先选择端口组而不是端口

  4. 优先选择启用 PXE 的端口而不是禁用 PXE 的端口

此算法为环境中 ironic 端口和/或端口组没有配置 physical_network 属性的情况提供向后兼容性。

配置和清理网络

支持配置和清理操作的网络翻转的 ironic 网络驱动程序将仅为启用 PXE 并且位于与配置或清理网络相同的物理网络上的 ironic 端口和端口组或没有指定物理网络的 ironic 端口和端口组创建 neutron 端口。

Neutron 端口绑定配置文件

在将虚拟接口附加到 PCI 网络设备的物理或虚拟功能时,nova 在 neutron 端口的 binding:profile 字段中设置 physical_network 属性。需要进一步研究以确定 ironic 执行相同的操作会产生什么影响。

备选方案

我们可以继续使用逻辑端口和物理端口之间的不可预测的映射。这将限制 ironic 的使用范围,仅限于只有一个物理网络的环境。

我们可以继续使用 ironic 中现有的映射算法,但向 neutron 提供确定映射是否从 local_link_connection 绑定信息中有效的信息。然后,ironic 将被修改为如果 neutron 确定映射无效,则使用不同的 neutron 端口重试接口附加。这种方法由于必要的重试将效率低下。

我们可以通过提供一种从 local_link_connection 字段中的信息映射到物理网络来避免标记 ironic 端口的物理网络的需求。这将需要 ironic 数据模型中的一个补充,以支持交换机对象,或一个新的 neutron API,提供从交换机 ID 到物理网络的查找。

数据模型影响

将在 Port 对象中添加一个新的 physical_network 字段。在 neutron 中,Segment 对象的 physical_network 字段定义为 sqlalchemy.String(64),因此 ironic 中将使用相同的值。

状态机影响

REST API 影响

将修改端口 REST API 以支持新的 physical_network 字段。该字段将可供具有 baremetal observer 角色的用户读取,可供具有 baremetal admin 角色的用户写入。如果端口是端口组的成员,则 API 将强制端口组中的所有端口在其物理网络字段中具有相同的值。

端口的物理网络字段的更新将以与其它连接相关字段(链路本地连接等)相同的方式限制 - 它们将限制为处于 enrollinspectingmanageable 状态的节点。

API 微版本将被提升。

客户端 (CLI) 影响

“ironic” CLI

ironic CLI 将不会更新。

“openstack baremetal” CLI

openstack baremetal CLI 将被更新以支持获取和设置端口上的 physical_network 字段。

RPC API 影响

驱动程序 API 影响

Nova 驱动程序影响

Ramdisk 影响

安全影响

此更改应通过支持多个隔离的物理网络和遵守运营商分配的物理网络限制来提高 ironic 裸机云的潜在安全级别。

其他最终用户影响

可扩展性影响

性能影响

其他部署者影响

为了利用此功能,部署者必须使用其连接到的物理网络标记 ironic 端口和端口组。这意味着他们必须有一种正确确定此信息的方法。

开发人员影响

实现

负责人

mgoddard

工作项

  • 修改 ironic 端口模型以包含 physical_network 字段。

  • 修改 ironic ports REST API 以支持 physical_network 字段。

  • 修改 openstack baremetal CLI 以支持 physical_network 字段。

  • 修改 ironic VIFPortIDMixin 插件,采用新的端口映射算法。

  • 修改 ironic NeutronNetwork 网络驱动程序,使其在创建 neutron 端口进行清理和配置时能够感知物理网络。

  • 修改 ironic 网络驱动程序,将物理网络添加到 neutron 端口的绑定配置文件中。

  • 为 DevStack 添加对多个(虚拟)物理网络的支持。

  • 更新 ironic 开发者文档,涵盖物理网络的使用。

依赖项

测试

DevStack 将添加对具有多个(虚拟)物理网络的 ironic 环境的支持。

升级和向后兼容性

建议的数据模型和算法更改与旧版本兼容。将提供数据库迁移,以将 physical_network 字段添加到现有端口,其值为 null。

文档影响

ironic 开发者文档将更新,涵盖此功能的使用。

参考资料