支持节点退役

https://storyboard.openstack.org/#!/story/2005425

本规范建议为 ironic 添加初步的节点退役支持。

节点退役是服务器生命周期中的自然组成部分,例如当保修期结束并且物理空间需要用于安装替换容量的新交付时。

然而,根据部署类型,从服务中移除节点本身可能是一个完整的流程,因为它可能包括将应用程序迁移到其他主机、清除磁盘或 BMC 上的敏感数据,或跟踪服务器从机架上的拆卸等步骤。

为了帮助部署者完成这些任务,ironic 应该提供基本的手段来标记节点为已退役,即标记它们不再有资格进行调度(同时仍然允许其他操作,例如清理),或者支持方便地搜索和列出这些节点。

扩展此初始支持,例如通过在状态机中添加显式的“已退役”状态(可以用作专用退役流程的起点,该流程具有生命周期结束清理或其他更复杂的动作,例如“准备捐赠”),超出了本规范的范围。

问题描述

目前 ironic 中没有明确支持节点退役:当需要将节点从服务中移除时,实例将被删除(这将触发清理),然后节点将被删除,无论是直接从“可用”状态删除,还是在移动到“可管理”状态之后(以及潜在的额外清理)。

本规范试图解决至少两个问题

  • 在实例删除和节点删除之间,存在一个时间窗口,在此期间可以将新的实例调度到即将退役的节点(将维护设置为“True”只能部分地帮助解决此调度竞争,因为除了不打算在此情况下使用之外,这将阻止清理);

  • 没有简单的方法来标记节点为“已退役”;这使得识别和列出这些节点(如第三方工具或剩余退役流程所必需)变得繁琐。

退役用例与其他用例不同,例如需要暂时从服务中移除的非功能节点,即节点可以在实际在节点上执行任何操作之前很长时间被标记为退役。 此外,已退役的节点不应重新投入使用。

提议的变更

建议通过两个新字段扩展节点属性列表

  • “已退役”(True/False)

  • “退役原因”(文本)

类似于现有的“受保护”和“受保护原因”。

“已退役”字段应指示节点打算退役,并且不应再考虑进行调度。 无论节点的状态如何,都可以设置“已退役”字段,尤其是在节点为“活动”状态时。

在“已退役”为 True 的情况下,在清理时(例如,在实例删除时)激活的节点将进入“可管理”状态(而不是“可用”)。 这不会留下一个已退役节点将接收另一个实例的窗口。 否则,“已退役”设置为 True 不应干扰清理或重建。

具有“已退役”设置为 True 的节点无法从“可管理”状态移动到“可用”状态(以防止意外重新使用):“提供”动词将被阻止。 为了将这些节点移动到“可用”状态,首先需要将“已退役”字段设置为 False。

新字段还应用于通过“list”命令快速获取这些节点,例如通过附加标志“–retired”(类似于“–maintenance”)。

备选方案

解决缺乏节点退役支持的另一种方法是在 ironic 状态图中引入新的状态“已退役”。 虽然这需要额外的努力来实现,但与本规范的建议相比,没有明显的好处。

使用 ironic 中现有的手段,例如“维护”状态和“维护原因”,当然是可能的,但这将在节点清理时以及尝试提取要删除的节点列表时造成不便。

数据模型影响

“nodes”表将获得两个额外的字段

  • “已退役”(tinyint)

  • “退役原因”(文本)

对于现有实例,即数据迁移,将“已退役”设置为 False,并且“退役原因”将保留为空。

状态机影响

“已退役”字段可以设置为任何状态的节点,但“可用”状态除外。 应首先将“可用”状态的节点移动到“可管理”状态,以确保与 metalsmith 等工具的向后兼容性。 这也消除了 nova 驱动程序中更改的需要。

只要节点未被锁定,就可以为处于临时状态的节点设置“已退役”字段。

当“已退役”设置为 True 时,节点在清理后不会移动到“可用”,而是移动到“可管理”。

当“已退役”设置为 True 时,节点无法从“可管理”状态移动到“可用”状态,相应的“提供”动词将返回 HTTP 409。

REST API 影响

REST API 需要通过新版本进行扩展,以包含新的“已退役”字段,类似于引入受保护字段的方式 [0][1]。

此外,应该有一个过滤器 /v1/nodes?retired=True/False,以便轻松识别已退役的节点。

客户端 (CLI) 影响

“ironic” CLI

无。

“openstack baremetal” CLI

“–retired”和“–retired-reason”选项将添加到“set”和“unset”子命令

  • openstack baremetal node set –retired –retired-reason <reason> <node>

  • openstack baremetal node unset –retired <node>

应添加到 set 和 unset 命令中,以设置和取消设置节点的“已退役”字段(并在“set”的情况下提供原因)。

应将附加标志“–retired”添加到“openstack baremetal node list”命令中,以将返回的结果限制为已设置退役标志的节点。

RPC API 影响

驱动程序 API 影响

无。

Nova 驱动程序影响

无。

Ramdisk 影响

无。

安全影响

无。

其他最终用户影响

无。

可扩展性影响

无。

性能影响

无。

其他部署者影响

无。

开发人员影响

无。

实现

负责人

主要负责人

Arne Wiebalck (arne_wiebalck) Riccardo Pittau (rpittau)

其他贡献者:无

工作项

  • 添加新的数据库字段

  • 如果“已退役”设置为 True,则调整状态机
    • 清理 -> 可管理

    • 可用 -> 可管理

    • 阻止 可管理 -> 可用

  • 从定期任务中排除已退役的节点

  • 扩展 API

  • 扩展 cli

  • 为 openstacksdk 添加新的 API

  • 添加文档

依赖项

无。

测试

需要类似于“维护”的测试。

升级和向后兼容性

升级时,需要根据“数据模型影响”部分中指定的方式设置新字段。

文档影响

需要记录额外的“已退役”字段及其预期用途。

参考资料

[0] https://storyboard.openstack.org/#!/story/2003869 [1] https://review.opendev.org/#/c/611662