软件RAID支持

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

本规范建议添加对配置软件RAID的支持。

类似于目前硬件RAID的设置方式,RAID设置应作为清理过程的一部分进行(“清理时软件RAID”)。管理员用户定义目标RAID配置,该配置将在节点清理时应用,即在节点可用于实例创建之前。

为了允许最终用户提供有关如何配置软件RAID的详细信息,RAID设置最终应成为部署步骤的一部分。但是,将此集成到部署步骤框架中超出了本规范的范围。

问题描述

由于软件RAID具有硬件无关性、灵活性、可靠性和易用性,因此它已成为一种流行的选择,以防止磁盘设备故障——即使在生产环境中也是如此。像Oath或CERN这样的大型部署依赖于软件RAID来实现各种服务。

Ironic目前缺乏对这种设置的支持,这要求部署者和管理员退而求其次,以便为他们的最终用户提供基于软件RAID配置的物理实例。这些变通方法可能需要维护额外的安装基础设施,然后将其集成到安装过程中,或者要求最终用户在Ironic已经配置好机器后第二次重新安装机器,最终获得所需的磁盘设备配置。这增加了部署者和管理员的复杂性,并且也可能导致最终用户对整体配置和安装过程的不满。

提议的变更

该建议是通过以下方式扩展Ironic以支持软件RAID

  • 使用节点的 target_raid_config 来指定所需的软件RAID布局(有一些限制,见下文);

  • ironic-python-agent 中添加支持,以理解节点 target_raid_config 中指定的软件RAID配置,并能够创建和删除这些配置;

  • 允许 ironic-python-agent 考虑软件RAID设备进行部署,例如通过根设备提示(考虑到它们本身已经通过[1]解决);

  • 在Ironic和 ironic-python-agent 中添加支持,以采取必要的步骤从软件RAID启动,例如将引导加载程序安装到正确的设备上。

最初,管理员设置的 target_raid_config 将仅支持以下配置

  • 一个跨可用设备的RAID-1,作为部署目标设备;或者

  • 一个用作部署目标设备的RAID-1,加上一个RAID-N,其中RAID级别N可以由管理员配置。N可以是0、1、5、6或10。

支持的配置被限制为这两个选项,以避免在从RAID设备启动时出现问题。拥有一个(小)RAID-1设备来启动是一种在设置更高级RAID配置时常用的方法:RAID-1持有设备看起来像一个独立的磁盘,并且不需要引导加载程序具有理解更复杂的RAID配置的知识或能力。

为了表明确实需要软件RAID配置(并防止在通过 target_raid_config 传递的配置原本用于硬件RAID设置的情况下,意外设置软件RAID),所有逻辑磁盘的 controller 属性都需要设置为 software。如果没有此设置,IPA的GenericHardwareManager中的软件RAID代码将忽略给定的 target_raid_config。如果它仅在一个逻辑驱动器上设置,则验证代码将引发错误。

controller 属性设置为 software 也会被conductor用于识别软件RAID并触发所需的引导加载程序安装。虽然预计整个磁盘镜像会带有作为镜像一部分的引导加载程序配置,但对于当前的软件RAID设计,镜像将不会位于实际磁盘的开头,而是在软件RAID-1之上的第一个分区内。因此,必须显式地将引导加载程序安装到基础持有磁盘上,并且此属性将指示何时执行此操作。

有效的软件RAID配置示例如下

{
    "logical_disks": [
        {
            "size_gb": 100,
            "raid_level": "1",
            "controller": "software"
        },
        {
            "size_gb": "MAX",
            "raid_level": "0",
            "controller": "software"
        }
    ]
}

对多个RAID-N的支持、选择用作持有设备的一组驱动器的支持、同时支持软件和硬件RAID设备以及支持对创建的RAID-N设备进行分区,都留待后续增强,并且超出了本规范的范围。

此外,目前不支持分区镜像,仅支持整个磁盘镜像。

一个非常接近该提案的原型可在[2][3][4]获得。

备选方案

如上所述,另一种选择是在物理节点上使用其他方法创建软件RAID设置,并将这些带外方法集成到各个部署的配置工作流程中。这增加了部署者/管理员方面的复杂性,并且可能对创建需要具有软件RAID设置的物理实例的用户体验产生负面影响。

数据模型影响

无。

状态机影响

无。

REST API 影响

无。

客户端 (CLI) 影响

无。

“ironic” CLI

无。

“openstack baremetal” CLI

无。

RPC API 影响

无。

驱动程序 API 影响

建议的功能可以整合到一个新的RAID接口中。

Nova 驱动程序影响

无。

Ramdisk 影响

ironic-python-agent 需要能够:* 设置和清理软件RAID设备 * 考虑软件RAID设备进行部署 * 配置RAID-1设备的持有设备,使其可引导

此功能可以整合到额外的RAID接口中。

安全影响

无。

其他最终用户影响

虽然预定义的RAID-1确保系统应该能够启动,但最终用户需要知道启动的镜像的内核需要能够理解软件RAID设备。

可扩展性影响

无。

性能影响

无。

其他部署者影响

部署者需要知道RAID-N设备的配置和清理仅在清理期间完成,因此任何更改都需要节点进行清理。此外,配置不适用于最终用户,仅限于管理员(作为target_raid_config是节点属性)。然而,所有这些对于硬件RAID配置都是成立的。

开发人员影响

无。

实现

最初的概念验证可在[2][3][4]获得。

负责人

主要负责人

无。

其他贡献者

Arne.Wiebalck@cern.ch (arne_wiebalck)

工作项

一旦总体想法被接受并就设计达成一致,这将定义。

依赖项

无。

测试

待定

升级和向后兼容性

无。

文档影响

需要记录如何配置软件RAID以及‘部署者影响’中概述的限制。

参考资料

[1] https://review.opendev.org/#/c/592639 [2] CERN Hardware Manager: https://github.com/cernops/cern-ironic-hardware-manager/commit/7f6d892ec4848a09000ed1f28f3137bf8ba917f0 [3] Patched Ironic Python Agent: https://github.com/cernops/ironic-python-agent/commit/bddac76c4d100af0103a6bc08b81dd71681a9c02 [4] Patched Ironic: https://github.com/cernops/ironic/commit/581e65f1d8986ac3e859678cb9aadd5a5b06ba60