无法关机的硬件

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

问题描述

关机是裸机配置的一个非常基础的操作。它不仅作为 API 原语可用,Ironic 经常也会使用关机和开机序列,而不是单个的重启操作。这种情况发生有三个原因

  • 通过等待机器先关机,我们可以确保关机请求确实已送达。某些 IPMI 实现以在特定条件下忽略电源请求而臭名昭著。

  • 某些操作要求机器必须处于关机状态才能正常工作,或者根本无法工作。例如,有报告称某些硬件拒绝在开机状态的机器上挂载虚拟介质设备。

  • 当使用多租户网络时,在机器关机的情况下切换网络至关重要,否则在机器上运行的代码将暴露于两个网络(例如,IPA 将继续在租户网络上运行)。

不幸的是,在某些情况下,关机机器是不可能的

  • 某些 NC-SI 技术的实现存在一个严重的缺点:当机器关机时,与 BMC 共享的网卡也会关机。当发生这种情况时,将无法远程开机。

  • DPU 可能根本不支持关机操作,而是依赖于父机器的电源状态。它们可能支持重启/复位。

虽然第二种情况与新兴技术有关,但第一种情况已经出现在实际环境中,并导致 Ironic 的采用出现问题。

提议的变更

添加一个新的可选节点标志 disable_power_off。当设置为 True 时,Ironic 将永远避免发出显式的关机请求。具体来说

  • 所有 电源接口 都将使用显式的重启请求(或在不可用时失败),即使通常它们会使用关机/开机配对(例如 redfish)。为了检测重启,我们将插入一个硬编码的睡眠,然后等待机器开机。

  • tear_down_agent 部署步骤将不再尝试关机。相反,在收集 ramdisk 日志后,它将发出新的 lockdown IPA 命令来禁用 IPA(参见 Ramdisk impact)。

  • boot_instance 部署步骤将无条件地使用硬带外复位,而不是带内关机命令。先前发出的 lockdown 命令将确保磁盘缓存已经刷新。

  • tear_down_inband_cleaning 函数将在通过 clean_up_ramdisk 停用 IPA 后发出重启请求。同样适用于 tear_down_inband_service

  • 在部署、清理、检查或服务失败时,机器将保持开机状态,IPA 正在运行。

  • 对于包含显式关机命令的任何请求的部署、清理或服务步骤,验证将失败。

缺点

  • 使用 disable_power_off 可能会在多租户网络中打开一个潜在的漏洞,因为 IPA 将在租户网络上可用一段时间。为了减轻此问题,将向 IPA 引入一种新的 锁定模式,以确保它至少不再可操作 - 参见 Ramdisk impact

  • 同样,在清理期间,实例操作系统将在 IPA 启动之前切换到清理网络。我们将记录这作为一个潜在问题,并添加一个新的配置选项,以便将无关机模式与 neutron 接口一起使用。

  • tear_down_agent 之后,机器仍然会运行。任何依赖于机器在此步骤之后关机的自定义部署步骤或带外操作都可能失败。

  • 在 IPMI 的情况下,如果 BMC 忽略重启请求,我们将仍然将其标记为成功。

备选方案

除了说服供应商修复硬件中的 NC-SI 问题外,我没有看到任何替代方案。NC-SI 设置似乎越来越受欢迎,尤其是在 边缘 设置中。

此规范的第一个版本建议将 disable_power_off 添加到 driver_info 而不是将其设为一流的节点字段。我更改了它有两个原因:因为 Ironic 中许多不相关的区域都需要检查此字段,以及为了提供一种通过 RBAC 轻松保护其访问权限的方式。

数据模型影响

状态机影响

REST API 影响

可以在节点创建后设置一个新的字段,稍后也可以设置。对其访问将受到新的微版本和新的 RBAC 规则的保护。

客户端 (CLI) 影响

“openstack baremetal” CLI

将新字段作为 --disable-power-off 暴露给 create/set 命令。

“openstacksdk”

将新字段暴露在 Node 对象上。

RPC API 影响

驱动程序 API 影响

Nova 驱动程序影响

Ramdisk 影响

添加一个新的命令 lockdown,它将准备机器进行硬复位,并确保 IPA 在正在运行的 ramdisk 上不可用。具体来说

  • 发出 sync 并将 3 写入 /proc/sys/vm/drop_caches 以刷新 Linux 缓存。

  • 对于每个设备,发出 blockdev --flushbufs <device> 以刷新任何未决的 I/O 操作。

  • 停止心跳线程和 API。

  • 尝试通过运行 ip link set <interface> down 为每个网络接口禁用网络。

安全影响

参见 缺点 以了解需要权衡的安全问题。

其他最终用户影响

可扩展性影响

性能影响

其他部署者影响

将添加一个新的安全参数

[neutron]allow_disabling_power_off (布尔值,默认 False)

如果为 False,则对于启用 disable_power_off 的节点,neutron 网络接口的验证将失败。如果设置为 True,则可以使用此功能。

开发人员影响

第三方电源接口的作者必须考虑新的标志。我们将通过发布说明向他们发出警告。

实现

负责人

主要负责人

Dmitry Tantsur (dtantsur)

其他贡献者

待定

工作项

  • 更新所有电源接口以尊重新的标志。

  • 更新代理部署步骤以尊重新的标志。

依赖项

测试

可以添加一个独立的作业来测试新的操作模式。我们甚至可以修改 sushy-tools 以拒绝关机调用,但使用这种方法在 CI 中需要一个新的作业,而我们试图避免新的作业。

升级和向后兼容性

没有顾虑

文档影响

添加一个文档页面,其中列出了用例并重点介绍了缺点。

参考资料