RAID 配置的新驱动程序接口¶
https://bugs.launchpad.net/ironic/+bug/1526400
该提案介绍了创建 RAID 配置新驱动程序接口所需的工作。它还提出了一种方法,使 RAID 配置能够在 zapping 或 cleaning 的过程中可用。
注意
即使 RAID 配置适合 zapping,它也可以用作 cleaning 的一部分。Zapping 和 cleaning 遵循相似的机制(zap 步骤是优先级为 0 的 cleaning 步骤)。对于软件 RAID(其中安全磁盘擦除也会擦除磁盘上的软件 RAID 配置),将 RAID 配置作为 cleaning 的一部分是有意义的。操作员可以选择 RAID 配置是作为 zapping 的一部分还是 cleaning 的一部分,并且它将在实现它的驱动程序中进行配置。
问题描述¶
目前 Ironic 中没有支持 RAID 配置的功能。
为此需要的一组特定任务需要在驱动程序上使用单独的接口。新的 RAID 接口将允许操作员为节点指定 RAID 配置。不同的驱动程序可以为操作员提供相同的 RAID 配置接口。
提议的变更¶
在节点注册后,并且可用的基本硬件信息后,操作员可以定义 RAID 配置。此配置将在 zapping 或 cleaning 期间应用。
操作员可以通过 REST API 或 CLI 以 JSON 数据的形式将 RAID 配置信息传递给 Ironic 驱动程序。RAID 配置信息将包含每个逻辑磁盘的属性,以及可选的提示,以帮助 Ironic 找到所需的底层物理磁盘。
这些属性可以分为 4 种不同的类型
强制属性 - 这些属性必须为每个逻辑磁盘指定,并且没有默认值。
size_gb- 要创建的逻辑磁盘的大小(以 GiB 为单位)。如果逻辑磁盘应使用底层物理磁盘上的所有可用空间,则可以指定MAX。仅当指定了底层物理磁盘时(如下所示)才能使用此选项。raid_level- 逻辑磁盘的 RAID 等级。Ironic 将定义支持的 RAID 等级为 0、1、2、5、6、1+0、5+0、6+0。驱动程序可以通过在RAIDInterface中的get_logical_disk_properties方法中覆盖这些值来覆盖这些值。
可选属性 - 这些属性具有默认值,并且可以在任何逻辑磁盘的规范中被覆盖。
volume_name- 卷的名称。应在节点内唯一。如果未指定,则将自动生成卷名称。is_root_volume- 如果这是根卷,则设置为true。只能用于一个逻辑磁盘。如果驱动程序能够检索它,将保存 根设备提示。默认值为false。
底层物理磁盘提示 - 这些提示为每个逻辑磁盘指定,以让 Ironic 找到用于 RAID 配置的所需磁盘。这是与机器无关的信息。这适用于操作员不想为每个裸机节点提供单独详细信息的情况。
share_physical_disks- 如果此逻辑磁盘可以与其他逻辑磁盘共享物理磁盘,则设置为true。如果未提供此选项,驱动程序将假定为false。disk_type-hdd或ssd。如果未指定此选项,则磁盘类型将不会被视为查找底层物理磁盘的标准。interface_type-sata或scsi或sas。如果未指定此选项,则接口类型将不会被视为查找底层物理磁盘的标准。number_of_physical_disks- 整数,用于逻辑磁盘的磁盘数量。默认为特定 RAID 等级所需的磁盘的最小数量。
上述底层物理磁盘提示由 Ironic 定义,每个驱动程序都必须实现它们。通过在
RAIDInterface.get_logical_disk_properties()方法中使用,可以覆盖上述提示的受支持值和默认值。除了上述提示之外,驱动程序还可以在
get_logical_disk_properties方法中定义自己的提示。有关更多详细信息,请参阅驱动程序 API 影响部分。它们可能的用例包括按特定供应商过滤磁盘
按型号过滤磁盘
按固件版本过滤磁盘。
底层物理磁盘 - 这些是实际的与机器相关的信息。这适用于操作员希望基于更广泛的属性(例如 S.M.A.R.T. 状态、物理位置)使用第三方工具自动选择物理磁盘的环境。
controller- 驱动程序读取的控制器的名称。physical_disks- 驱动程序读取的要用作物理磁盘的物理磁盘列表。
注意
这些属性的值取决于硬件。
注意
应仅指定“底层物理磁盘提示”或“底层物理磁盘”中的属性。如果同时指定了两者,则它们应相互一致。如果它们不一致,则 RAID 配置将失败(因为找不到合适的底层物理磁盘)。
- 一些示例
示例 1(使用底层物理磁盘提示)
{ "logical_disks": [ { "size_gb": 50, "raid_level": "1+0", "disk_type": "hdd", "interface_type": "sas", "volume_name": "root_volume", "is_root_volume": "true" }, { "size_gb": 100, "number_of_physical_disks": 3, "raid_level": "5", "disk_type": "hdd", "interface_type": "sas" "volume_name": "data_volume" } ] }
示例 2(使用底层物理磁盘)
{ "logical_disks": [ { "size_gb": 50, "raid_level": "1+0", "controller": "RAID.Integrated.1-1", "volume_name": "root_volume", "is_root_volume": "true" "physical_disks": [ "Disk.Bay.0:Encl.Int.0-1:RAID.Integrated.1-1", "Disk.Bay.1:Encl.Int.0-1:RAID.Integrated.1-1" ] }, { "size_gb": 100, "raid_level": "5", "controller": "RAID.Integrated.1-1", "volume_name": "data_volume" "physical_disks": [ "Disk.Bay.2:Encl.Int.0-1:RAID.Integrated.1-1", "Disk.Bay.3:Encl.Int.0-1:RAID.Integrated.1-1", "Disk.Bay.4:Encl.Int.0-1:RAID.Integrated.1-1" ] } ] }
RAID 配置信息以 JSON 形式存储在
node.target_raid_config字段中。操作员可以使用 REST API(或 CLI)随时在此处放置一个新值,该值将在 zapping 和 cleaning 期间与node.raid_config进行比较,并且驱动程序可能仅在这些阶段应用更改。有关更多详细信息,请参阅 REST API 影响部分。将为 RAID 配置提供一个新的驱动程序接口,称为
RAIDInterface。有关更多详细信息,请参阅驱动程序 API 影响部分。作为 zapping 的一部分,将在
RAIDInterface中提供新的方法create_configuration和delete_configuration。操作员可以选择在 zap 步骤中调用它们。相应的 zap 步骤将是node.raid.create_configuration和node.raid.delete_configuration。将在 ironic.common.raid 中提供一个名为
update_raid_info的新方法。此方法可供实现 RAID 支持的驱动程序使用,以更新节点数据库中的 RAID 信息。这将促进驱动程序异步执行 RAID 配置。此方法将执行以下操作将
node.raid_config设置为驱动程序返回的值。根卷的根设备提示将在
node.properties中更新(如 根设备提示 所述),并且根卷的大小将在node.properties.local_gb中更新。驱动程序可以选择要指定的根设备提示。此外,驱动程序甚至没有必要选择任何 root_device_hint。根卷的 RAID 等级将更新为
raid_level在node.properties.capabilities中。
将创建一个新的 REST API,用于检索可以在 RAID 配置中指定的属性。有关详细信息,请参阅下面的 REST API 影响部分。
将创建 REST API 以 PUT RAID 配置,并添加一个新的 REST 资源以检索请求的实际 RAID 配置。
备选方案¶
操作员可以在将节点置于 MANAGEABLE 状态后,随时手动更改 RAID 配置。但这必须为每个节点完成。
数据模型影响¶
Node 对象中的以下字段将被更新
将创建一个新的数据库字段
node.target_raid_config,它将存储要在 zapping 或 cleaning 期间应用的挂起 RAID 配置。这将是一个 JSON 字典。此字段将是只读的。将创建一个新的数据库字段
node.raid_config,它将存储上次应用的 RAID 配置。它还将包含应用此配置的时间戳。这将是一个 JSON 字典。此字段将是只读的。node.properties.local_gb将在将 RAID 配置应用于根卷的大小后更新。node.properties.root_device将使用驱动程序返回的根设备提示更新,如 根设备提示 规范中所述。将在
node.properties.capabilities中添加一个新的功能raid_level。这将包含根卷的 RAID 等级。
状态机影响¶
无。
REST API 影响¶
将引入两个新的 REST API 端点作为此更改的一部分。
要获取可以定义的 RAID 属性及其可能的值
GET /drivers/<driver>/raid/logical_disk_properties
该操作将返回属性以及每个属性的可能值的文本描述
{ 'raid_level': 'RAID level for the logical disk. Supported values are 0, 1, 2, 5, 6, 1+0, 5+0, 6+0. Required.', 'size_gb': 'Size of the logical disk in GiB. Required.', 'disk_type': 'Disk Type. Supported values are `hdd` or `sdd`. Optional', . . . . }
要设置目标 RAID 配置,用户将
PUT /v1/nodes/NNNN/states/raid
使用包含 RAID 配置 JSON 描述的主体。
如果驱动程序接受,此信息将存储在
node.target_raid_config字段中,并以与电源和配置状态相同的方式公开。换句话说,可以通过详细视图中的node或以下任一方式检索它GET /v1/nodes/NNNN GET /v1/nodes/NNNN/states
注意
可能也有道理使用 GET /v1/nodes/NNNN/states/raid,但为了与电源和配置保持一致,我们仅允许 GET /v1/nodes/NNNN 和 GET /v1/nodes/NNNN/states。
如果驱动程序不支持 RAID 配置,则这两个 API 调用都将返回 HTTP 400(错误请求)。否则,API 将返回 HTTP 200(确定)。
客户端 (CLI) 影响¶
将在 Ironic CLI 中提供一个新的选项,用于获取可以作为 RAID 配置的一部分指定的属性
$ ironic node-raid-logical-disk-properties <node-uuid>
将添加一种新方法来设置目标 RAID 属性
RPC API 影响¶
将创建两个新的 RPC API。
get_raid_logical_disk_properties- 此方法将在GET /drivers/<driver>/raid/logical_disk_properties中调用。set_target_raid_config- 此方法将在PUT /v1/nodes/NNNN/states/raid中调用。
驱动程序 API 影响¶
将提供一个新的 RAIDInterface,供驱动程序实现 RAID 配置。它将具有以下方法
create_configuration()- 该方法的驱动程序实现必须从node.target_raid_config读取请求的 RAID 配置,并在裸机上创建 RAID 配置。如果未设置node.target_raid_config,驱动程序实现应引发错误。驱动程序必须确保在此过程结束时调用ironic.common.raid.update_raid_info(),以便更新节点的raid_config。实现细节取决于驱动程序的同步/异步性。
raid_config将包括以下内容
对于每个逻辑磁盘(除了传入的参数)
controller- 驱动程序读取的用于逻辑磁盘的控制器的名称。
physical_disks- 驱动程序读取的用于逻辑磁盘的物理磁盘的标识符列表。
root_device_hint- Ironic 用于查找要部署映像的磁盘的根设备提示的字典。驱动程序决定要提供的根设备提示。包含以下详细信息的系统上所有物理磁盘的列表
controller- 物理磁盘的 RAID 控制器。
id- 驱动程序读取的物理磁盘的 ID
disk_type-hdd或ssd
interface_type-sas或sata或scsi
size_gb
state- State 字段表示物理磁盘的当前状态。它可以是以下之一:
active如果磁盘是阵列的一部分
ready如果磁盘准备好成为卷的一部分
failed如果磁盘遇到了一些错误
hotspare如果磁盘是热备盘并且是某个阵列的一部分
offline如果由于其他原因磁盘不可用于 RAID,但并未发生故障
non_raid如果磁盘不是 RAID 的一部分并且可以直接访问以上详细信息可用于备份物理磁盘提示,以便以后进行 RAID 配置。
注意
对于新注册的节点或从未进行 RAID 配置的节点,可以通过硬件内省填充有关物理磁盘和控制器的信息。这不在本规范的范围内。
函数定义如下
def create_configuration(task, create_root_volume=False, create_nonroot_volumes=False): """Create RAID configuration on the node. This method creates the RAID configuration as read from node.target_raid_config. This method by default will create all logical disks. :param task: TaskManager object containing the node. :param create_root_volume: Setting this to False indicates not to create root volume that is specified in the node's target_raid_config. Default value is True. :param create_nonroot_volumes: Setting this to False indicates not to create non-root volumes (all except the root volume) in the node's target_raid_config. Default value is True. :returns: states.CLEANWAIT if RAID configuration is in progress asynchronously or None if it is complete. """
delete_configuration()- 删除 RAID 配置。函数定义如下
def delete_configuration(task): """Delete RAID configuration on the node. :param task: TaskManager object containing the node. :returns: states.CLEANWAIT if deletion is in progress asynchronously or None if it is complete. """
validate()- 验证 RAID 配置。在验证驱动程序接口时将调用此函数。它将从 node.properties.target_raid_config 读取目标 RAID 配置,并调用validate_raid_config来验证目标 RAID 配置。函数定义如下
def validate(task): """Validates the RAID interface. :param task: TaskManager object containing the node. :raises: InvalidParameterValue, if RAID configuration is invalid. :raises: MissingParameterValue, if RAID configuration has some missing parameters. """
validate_raid_config()- 验证目标 RAID 配置。在 RPC 调用set_target_raid_config()期间将调用此函数来验证目标 RAID 配置。它还将在validate()期间被调用。函数定义如下
def validate_raid_config(task, raid_config): """Validates the given RAID configuration. :param task: TaskManager object containing the node. :param raid_config: The target RAID config to validate. :raises: InvalidParameterValue, if RAID configuration is invalid. """
get_logical_disk_properties()- 获取驱动程序定义的 RAID 属性。函数定义如下
def get_logical_disk_properties(): """Gets the RAID properties defined by the driver. :returns: A dictionary of properties and a textual description. """
执行 RAID 配置(创建或删除)后,驱动程序可以调用 ironic.common.raid.update_raid_info() 并传递 raid_config。上述部分已描述了该方法的相关详细信息。该方法定义如下
def update_raid_info(node, raid_config):
"Updates the necessary fields of the node after RAID configuration.
This method updates the current RAID configuration in
node.properties.raid_config. If root device hint was passed,
it will update node.properties.local_gb, node.properties.root_device_hint
and node.properties.capabilities['raid_level'].
:param node: a node object
:param raid_config: The current RAID configuration on the bare metal
node.
"""
Nova 驱动程序影响¶
无。
Ramdisk 影响¶
N/A
安全影响¶
无。
其他最终用户影响¶
Nova 用户可以使用计算能力选择根卷所需的 RAID 级别。例如
nova flavor-key ironic-test set capabilities:raid_level="1+0"
可扩展性影响¶
无。
性能影响¶
RAID 配置可能会延长节点上擦除或清理所需的时间,但这对性能和可靠性至关重要。
其他部署者影响¶
操作员可以使用 node.raid.create_configuration 和 node.raid.delete_configuration 作为擦除或清理任务来执行 RAID 管理。
开发人员影响¶
开发人员可以为各自的驱动程序实现 RAIDInterface。
实现¶
负责人¶
- 主要负责人
rameshg87
- 其他贡献者
ifarkas
工作项¶
创建用于 RAID 配置的 REST API 端点。
创建
RAIDInterface并创建RAIDInterface的模拟实现。在 ironic.common.raid 中实现
update_raid_info。实现 Ironic CLI 更改。
编写单元测试。
依赖项¶
测试¶
将添加代码的单元测试。将提供
RAIDInterface的模拟实现用于测试目的,并且可以将其作为擦除过程的一部分运行。将添加 Tempest API 覆盖,使用上述模拟驱动程序。
每个驱动程序负责提供第三方 CI 来测试 RAID 配置。
升级和向后兼容性¶
无。
文档影响¶
将提供有关如何配置节点以进行 RAID 的文档。
参考资料¶
其他参考资料