向实例暴露 configdrive

https://blueprints.launchpad.net/ironic/+spec/expose-configdrive

此蓝图增加了对向 Ironic 部署的实例暴露 configdrive 镜像[1]的支持。

问题描述

由 Ironic 部署的实例应该能够使用 cloud-init(或类似软件)将最终用户的数据放入实例中。目前,通过将 cloud-init 包含在镜像中,并将其指向 Nova 元数据服务,就可以实现这一点。

这种方法存在两个问题

  • 一些部署者在其环境中不运行元数据服务。

  • 如果部署者使用静态 IP 地址分配来配置 Ironic 机器,则实例在 cloud-init 将网络配置到位之前将无法访问网络。如果元数据服务是获取网络配置的唯一途径,则实例将陷入无法访问网络的僵局。

为了解决这些问题,configdrive 镜像可以取代元数据服务。在 VM 世界中,这通常由 hypervisor 将 configdrive 镜像作为卷暴露给 VM。

在 Ironic 的情况下,没有 hypervisor,因此需要以其他方式将此镜像暴露给实例。这可以通过将镜像写入节点上的分区、通过带外机制(例如 HP 的 iLO 中的虚拟软盘)暴露镜像,或配置节点从 SAN 挂载镜像来实现。无论哪种方式,这都需要由 Ironic 处理,而不是 Nova。但是,Nova 拥有 configdrive 中应包含的数据,以及生成镜像的代码。因此,让 Nova 生成镜像并将其传递给 Ironic 是有意义的。

此蓝图概述了 Ironic 将如何处理 Nova 提供的 configdrive 镜像并将其暴露给实例。

提议的变更

Nova 的 Ironic virt 驱动程序将生成一个 config drive 镜像,对其进行 gzip 压缩和 base64 编码,并将其作为设置 provision 状态调用的的一部分传递给 Ironic 服务。这在 Nova 的这个规范中更详细地讨论。[0]

为此,我们必须扩展我们的 API,以便可以选择接受请求 BODY 中的 config drive。

如果存在 config drive,Ironic 将数据上传到 Swift 并更新节点的 instance_info,以包含上传的临时 URL,或者如果未配置 Swift,则 config drive 数据将直接存储到节点的 instance_info 字段中。

从那时起,部署驱动程序将负责将 configdrive 暴露给实例,以及在删除实例时从实例中删除 configdrive。这不能由驱动程序之外的代码协调,因为只有驱动程序才能知道何时以及如何执行这些操作。

驱动程序可能使用的一些机制来暴露 configdrive 包括

  • 将镜像写入实例的磁盘作为分区。

  • 使用 OOB 机制将镜像挂载为虚拟磁盘。

  • 使用 OOB 机制配置实例从 SAN 挂载镜像。

备选方案

这里没有明确的替代方案。

数据模型影响

将添加一个“configdrive”键到 node.instance_info。

REST API 影响

扩展 /nodes/<uuid>/provision 端点,以便接受请求 BODY 中可选的 configdrive 参数。

由于 config drive 仅在生成实例时有效,因此在 Ironic API 中传递 configdrive 参数仅在将节点的 provision 状态设置为 active 时有效。将参数传递到任何其他 provision 状态应返回 HTTP 400(错误请求)。

RPC API 影响

通过 API 传递的 config drive 应传递到 do_node_deploy RPC 方法。

驱动程序 API 影响

无。

Nova 驱动程序影响

nova 驱动程序需要实现生成 configdrive 镜像并将其传递给 Ironic 的功能。

这在相应的 nova 规范中讨论。[0]

安全影响

此提议涉及将最终用户数据作为镜像存储在 Swift 中。这可能是一个安全问题,因为这些数据在静止状态下未加密。

有一些方法可以保护此数据,但这超出了本次初始工作的范围。

其他最终用户影响

无。

可扩展性影响

使用 configdrive 将需要调用 Swift(或某些其他对象存储),这将对系统产生一定的影响,但可能可以忽略不计。

性能影响

无。

其他部署者影响

此功能可能需要部署一些对象存储服务(Swift 作为参考实现)。

开发人员影响

编写驱动程序的开发人员应实现此功能,但这不是必需的,因为对于某些驱动程序来说,这可能是不可能的。

实现

负责人

主要负责人

lucasagomes <lucasagomes@gmail.com>

其他贡献者

jroll <jim@jimrollenhagen.com>

工作项

  • 实现此功能的 Nova 端。

  • 为各种部署驱动程序实现功能。

  • 为 IPA 添加支持,以便通过 URL 获取 configdrive。它当前仅支持在 prepare_image 命令中传递 blob。

  • 为 PXE 驱动程序添加支持,以便使用 config drive 并将其暴露给租户。

  • 添加 tempest 测试(与 Nova 驱动程序结合使用)。

依赖项

此更改取决于相应的 Nova 规范。[0]

测试

应添加一个 tempest 测试,该测试部署一个带有 configdrive 的裸机实例,并验证 configdrive 是否正确写入实例。

升级和向后兼容性

Ironic 代码需要在 Nova 中启用 configdrive 支持之前部署。

此功能完全是可选的,因此它是向后兼容的。

文档影响

可能需要更新文档,以指示可以使用 configdrive 与 Ironic 部署的实例。

参考资料

[0] https://blueprints.launchpad.net/nova/+spec/use-configdrive-with-ironic

[1] http://cloudinit.readthedocs.org/en/latest/topics/datasources.html#config-drive