通过 ironic-discoverd 进行机内硬件属性内省

https://blueprints.launchpad.net/ironic/+spec/inband-properties-discovery

本规范增加了对使用 ironic-discoverd 项目进行硬件属性内省的支持,用于不支持带外内省的驱动程序。

ironic-discoverd [1] 是一个 StackForge 项目,用于通过启动特殊的发现 ramdisk [2] 并从其中查询硬件来进行硬件属性检查。

注意

在本规范中,“硬件发现”一词与“硬件内省”或“硬件检查”同义,不同于“新硬件自动发现”,本规范不涉及后者。

问题描述

目前,Ironic 中没有通用的方法来检查给定硬件的调度属性。虽然提出了多种带外方法,但它们都限制于特定的供应商(目前是 HP 和 DELL)。本提案将使硬件内省对于可以打开和关闭机器的每个驱动程序都成为可能。

未来的一些用例可能需要在支持带外发现的硬件上使用机内发现,例如:

  • 自动发现节点。虽然目前超出范围,但以后可能会考虑,并且可能需要机内发现,具体取决于特定供应商是否支持带外发现。

  • 特定于供应商的内省扩展,发现通过带外方式不可用的属性等。

注意

本规范不直接涉及这些用例。

提议的变更

本规范建议通过使用 ironic-discoverd 实现父规范 [3] 中定义的 InspectInterface

注意

ironic-discoverd 1.0.0(预计二月初发布)将是必需的,因此例如,当前稳定版 0.2 发布文档中的某些客户端函数可能缺失。有关详细信息,请参阅 依赖项

  • 添加 [discoverd] 配置部分

    • 添加配置选项 service_url(字符串,无默认值)。这是 Ironic 将联系以启动内省过程的 ironic-discoverd 的 URL。例如 http://127.0.0.1:5050/v1

      注意

      端口可以通过 ironic-discoverd 配置文件更改。

    • 添加配置选项 enabled(布尔值,默认 False),这将启用或禁用 discoverd 内省。默认情况下,它将被禁用,并且 DiscoverdInspect.inspect_hardware 将引发新的 DiscoverdDisabled 异常并附带说明。

      注意

      此选项不影响其他检查实现。

  • 创建 DiscoverdInspect 类,以以下方式实现 InspectInterface

    • 在驱动程序初始化期间,构造函数(__init__)验证是否提供了 inspection_service_url 并且可以导入 ironic_discoverd.client 模块,否则将失败。它还将检查我们是否具有所需的 ironic-discoverd 版本 - 请参阅 依赖项。如果通过配置禁用 ironic-discoverd 支持,则显然会跳过这些检查 - 参见上文。

    • inspect_hardware 会释放节点上的任务管理器锁(以便 ironic-discoverd 可以在其上运行),并调用 ironic_discoverd.client.introspect,提供节点 UUID。

      注意

      如果未释放通用检查代码为创建 task 获取的锁,则 ironic-discoverd 将无法操作节点。

    • ironic-discoverd 将在成功内省后更新调度数据。

    • DiscoverdInspect 还会通过客户端 API ironic_discoverd.client.get_status 轮询 ironic-discoverd 的状态端点 [4]。它将使用类似于 [5] 中建议的驱动程序特定的定期任务。

      如果成功,节点将进入下一个状态。如果发生错误,Node.last_error 将更新,并且节点将移动到 INSPECTFAIL 状态。

      注意

      如果决定不为 Kilo 周期实现驱动程序特定的定期任务,则将在 inspect_hardware() 方法的末尾使用 LoopingCall 代替。

  • DiscoverdInspect 作为 InspectInterface 实现添加到 pxe_ipmitoolpxe_ipminativepxe_ssh 驱动程序(后者为了更轻松地进行测试)。

内省工作方式的高级模式

  • DiscoverdInspect 调用 ironic-discoverd API

  • ironic-discoverd 通过常规 API 与 Ironic 通信,以检查当前节点状态。

  • ironic-discoverd 要求 Ironic 使用电源接口重新启动机器。

  • 机器通过 PXE 服务器(通常是与 ironic-discoverd 一起安装的 dnsmasq)进行 PXE 启动。

    注意

    有人建议 ironic-discoverd 使用带外启动方法,如虚拟介质,如果驱动程序支持的话。虽然这是一个有趣的特性,但它不在 ironic-discoverd 的近期计划中,因此本规范不涉及。

    注意

    ironic-discoverd 不使用 Neutron,因为 Neutron 无法为所有 未知 机器(即 MAC 地址没有端口的机器)应用特定的 DHCP 选项。如果有一天它提供了这样的功能,ironic-discoverd 将切换到它并停止直接管理 dnsmasq。请参阅 README [1] 以获取详细信息。

    注意

    ironic-discoverd 通过管理 PXE 端口的防火墙访问来避免与 Neutron 的冲突。只有 Ironic 不知道的 MAC 地址才允许通过 ironic-discoverd 管理的 dnsmasq 实例进行 PXE 启动。

  • ramdisk 回调到 ironic-discoverd

  • ironic-discoverd 通过常规 API 与 Ironic 通信以更新节点状态并关闭节点

备选方案

  • 我们可以只使用带外发现。如上所述,它并不能涵盖所有硬件。

  • 机内发现可以在 Ironic 本身内实现,而无需第三方服务。这被认为是对 Ironic 代码库的不必要的复杂化。

数据模型影响

预计没有直接影响。ironic-discoverd 将在 Node.properties 字段中设置调度属性。

REST API 影响

没有直接的 REST API 影响。

RPC API 影响

驱动程序 API 影响

Nova 驱动程序影响

安全影响

Ironic 内的代码没有安全影响。ironic-discoverd 的存在本身有一个安全问题

  • 接收来自 ramdisk 的数据的端点未经过身份验证。因此,ironic-discoverd 将在更新节点之前验证节点是否在其内部缓存中。

    由于此原因,当前策略是永远不要覆盖现有属性,而只设置缺失的属性。可以通过 ironic-discoverd 配置文件更改此行为。请参阅父规范 [3] 以获取讨论。

其他最终用户影响

操作员将能够从不支持带外内省的硬件中收集属性,通过特定于供应商的驱动程序。

可扩展性影响

  • ironic-discoverd 当前需要一个 PXE 启动服务器和一个 TFTP 服务器来服务所有启动发现 ramdisk 的请求。这是严重限制 ironic-discoverd 可扩展性的唯一因素。

    将来我们将研究如何使 ironic-discoverd 在冗余设置中工作,但目前不支持。

  • ironic-discoverd 可能比带外检查需要更多的网络调用。

我相信这些问题并不关键,如果发现不经常发生并且以合理的节点批量进行。

性能影响

ironic-discoverd 的调用主要是异步的,只有基本的合理性检查才以同步方式完成,然后将控制权返回给 conductor。

其他部署者影响

  • 新的选项 discoverd.enabled(布尔值,默认 False)- 是否启用通过 ironic-discoverd 进行内省

  • 新的选项:discoverd.service_url(字符串,无默认值),其中包含 ironic-discoverd 的 URL

  • ironic-discoverd 和所需的服务(如 dnsmasq 和 TFTP 服务器)应单独部署和管理,请参阅 README [1] 以获取详细信息。

    ironic-discoverd 将确保这些服务不会干扰现有的管理节点 DHCP 的 Neutron 安装。

    应构建一个特殊的 ramdisk [2](例如,使用 diskimage-builder)并位于 TFTP 根目录中 - 再次参见 README [1]

  • ironic-discoverd 支持是可选的并且默认情况下被禁用,因此对全新或升级的安装没有影响。

开发人员影响

驱动程序开发人员可以使用 DiscoverdInspect 为其驱动程序提供机内硬件发现。

实现

负责人

主要负责人

Dmitry Tantsur, LP: divius, IRC: dtantsur

工作项

  • 添加新的配置选项。

  • 实现 DiscoverdInspect 接口。

依赖项

  • 发现的通用部分 [3]

  • ironic-discoverd 包应从 PyPI 或 RDO 安装以启用此功能。版本 1.0.0 [6](预计二月初发布)是新接口的要求。如果将 discoverd.enabled 设置为 true,则使用它的驱动程序将在没有它时拒绝加载。

  • 建议使用类似于 [5] 中指定的驱动程序特定的定期任务。如果未接受该规范,我们将回退到使用循环调用。

测试

  • 目前使用模拟 ironic_discoverd.client 进行单元测试

  • 作为后续步骤,我希望将 ironic-discoverd 添加到 devstack,然后进行功能测试。但是,这将消耗大量时间,并且取决于正在进行的功能测试讨论。

    如上所述,ironic-discoverd 默认情况下将被禁用。

升级和向后兼容性

文档影响

应记录如何在 Ironic 中启用机内内省。文档应指向 ironic-discoverd README 以获取安装说明。

参考资料