通过 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还会通过客户端 APIironic_discoverd.client.get_status轮询 ironic-discoverd 的状态端点 [4]。它将使用类似于 [5] 中建议的驱动程序特定的定期任务。如果成功,节点将进入下一个状态。如果发生错误,
Node.last_error将更新,并且节点将移动到 INSPECTFAIL 状态。注意
如果决定不为 Kilo 周期实现驱动程序特定的定期任务,则将在 inspect_hardware() 方法的末尾使用 LoopingCall 代替。
将
DiscoverdInspect作为InspectInterface实现添加到pxe_ipmitool、pxe_ipminative和pxe_ssh驱动程序(后者为了更轻松地进行测试)。
内省工作方式的高级模式
DiscoverdInspect调用 ironic-discoverd APIironic-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 的 URLironic-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接口。
依赖项¶
测试¶
目前使用模拟
ironic_discoverd.client进行单元测试作为后续步骤,我希望将 ironic-discoverd 添加到 devstack,然后进行功能测试。但是,这将消耗大量时间,并且取决于正在进行的功能测试讨论。
如上所述,ironic-discoverd 默认情况下将被禁用。
升级和向后兼容性¶
无
文档影响¶
应记录如何在 Ironic 中启用机内内省。文档应指向 ironic-discoverd README 以获取安装说明。