使用代理ramdisk的机内RAID配置

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

本文档提出使用 Ironic Python Agent (IPA) 实现 RAID 配置接口。驱动程序 agent_ipmitool, agent_pyghmi, agent_ssh, agent_vboxagent_ilo 将使用这种新的 RAIDInterface 实现。

问题描述

目前 Ironic 中没有通过带内机制配置服务器 RAID 的方法。

提议的变更

本文档提出使用 IPA 实现带内 RAID 配置。它建议实现父规范 [1] 中提到的 RAIDInterface。该实现将被命名为 AgentRAID。该实现的主要任务是在 agent ramdisk 上调用相应的 RAID 操作方法。感兴趣的厂商将在 Ironic Python Agent 中使用硬件管理器来实现这些方法。

以下是需要进行的更改

  • 以下方法将作为 AgentRAID 的一部分实现

    • create_configuration - 这将在裸机节点上创建 RAID 配置。以下是步骤

      • 在 Ironic Python Agent ramdisk 中使用 clean.execute_clean_step 命令来调用 raid 接口的 create_configuration 步骤。

    • delete_configuration - 这将在裸机节点上删除 RAID 配置。以下是步骤

      • 在 Ironic Python Agent ramdisk 中使用 clean.execute_clean_step 命令来调用 raid 接口的 delete_configuration 步骤。

  • RAID 配置最初将仅限于擦除,通过将其清理步骤优先级硬编码为 0 来实现。我们稍后会考虑与清理机制的交互。这允许我们将 target_raid_config 对新的清理步骤强制要求。

  • 当 agent ramdisk 正在运行带内清理步骤时,conductor 会在每个心跳周期获取上次带内清理步骤的状态。当带内清理步骤完成时,conductor 会恢复清理并继续到下一个清理步骤(如果有)。将添加一种新机制 - agent_base_vendor.post_clean_step_hook 装饰器。这允许驱动程序实现者指定一个函数,在带内清理步骤成功完成后(并在开始下一个清理步骤之前)调用该函数。被装饰的函数将接受两个参数:任务和 agent ramdisk 返回的清理步骤命令状态。

    例如

    @agent_base_vendor.post_clean_step_hook(
        interface='raid', step='create_configuration')
    def _create_configuration_final(task, command):
    
  • 将添加一个方法 agent._create_configuration_final 作为 raid.create_configuration 的清理后步骤钩子。此方法将使用从 agent ramdisk 返回的实际 RAID 配置调用 update_raid_info

  • 将添加一个方法 agent._delete_configuration_final 作为 raid.delete_configuration 的清理后步骤钩子。这将把 node.raid_config 设置为 None。请注意,target_raid_config 将保持不变,并将被未来的擦除调用重用。

  • 有可能存在使用软件 RAID 配置的硬件管理器,但这超出了本文档的范围,因为它需要将 RAID 配置作为磁盘擦除后的清理步骤运行。

备选方案

有些裸机服务器不支持带外 RAID 配置。它们仅支持带内 raid 配置。我认为除了使用 ramdisk 之外,没有其他替代方案。

我们可以提供一个选项,将 RAID 作为清理的一部分启用。但是,这将使 target_raid_config 对由给定 conductor 管理的所有节点强制要求。我们稍后需要重新考虑它。

数据模型影响

无。

状态机影响

无。

REST API 影响

无。

客户端 (CLI) 影响

无。

RPC API 影响

无。

驱动程序 API 影响

无。

Nova 驱动程序影响

无。

Ramdisk 影响

N/A

安全影响

无。

其他最终用户影响

无。

可扩展性影响

无。

性能影响

无。

其他部署者影响

无。

开发人员影响

其他为 OpenStack 开发驱动程序的硬件厂商可以使用 Ironic Python Agent 进行带内 RAID 配置。他们可以添加自己的硬件管理器来实现该方法并完成 RAID 配置。

实现

负责人

rameshg87

工作项

  • 实现清理后步骤钩子的机制。

  • 实现 AgentRAID

依赖项

测试

将添加单元测试。

升级和向后兼容性

无。

文档影响

无。Ironic 中大部分 RAID 配置细节都包含在父规范中。如果需要额外的内容,使用 AgentRAID 的相应厂商需要记录它。

参考资料

[1] https://specs.openstack.org/openstack/ironic-specs/specs/approved/ironic-generic-raid-interface.html