使用 configdrive 与 Ironic

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

此蓝图为 Ironic 虚拟驱动程序添加了对 configdrive 的支持,以便 Nova 能够将 configdrive 传递给 Ironic,并在部署裸机实例时使用。

问题描述

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

这种方法存在两个问题

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

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

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

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

用例

这里的核心用例是与其他虚拟驱动程序实现功能对等。其他驱动程序今天支持 configdrive,并且部署者正在使用它。Ironic 的部署者也应该能够使用 configdrive。

如上所述,有两个主要用例

  • 不使用元数据服务的部署者。

  • 希望使用静态 IP 分配的部署者,在这种情况下,实例将无法访问网络以获取元数据服务。

项目优先级

Kilo 优先级列表当前未定义,但是“虚拟驱动程序功能对等”似乎很重要。

提议的变更

如果需要,Nova 应该生成 configdrive 镜像并将其传递给 Ironic。这应该使用现有代码(nova.virt.configdrive:required_by)来确定是否应该生成 configdrive。

这将包括以下步骤

  • Ironic 虚拟驱动程序决定是否应该为该实例生成 configdrive。如果是

  • 虚拟驱动程序生成 configdrive,对其进行 gzip 压缩并进行 base64 编码。

  • 虚拟驱动程序通过 Ironic API 将编码后的镜像传递给 Ironic。

  • Ironic 服务将存储该镜像到某个系统中,并保留其 URI,或者如果没有配置外部系统,Ironic 将将镜像保存到其数据库中。此参考实现将使用 Swift,并具有可配置的 TTL。

  • Ironic 将镜像传递给部署驱动程序,然后将其暴露给租户。初始实现将在磁盘上创建一个 configdrive 分区并将镜像复制到该分区上,但可以扩展为使用目标硬件支持的带外虚拟介质。

备选方案

解决上述问题的唯一替代方案是在运行时将网络配置和用户数据直接写入要部署的镜像中。我认为可以肯定地说,Ironic 不应该从事直接将文件注入镜像的业务,也不应该强制最终用户使用已经注入了此数据的自定义镜像。

如前所述,Ironic 的驱动程序可以提供各种机制来将此镜像暴露给实例。但是,无论使用哪种机制,从 Nova 的角度来看,交互方式将是相同的。

数据模型影响

无。

REST API 影响

无。

安全影响

对于此规范,没有,但 Ironic 可能会将最终用户数据存储在 Swift 中。这可能是一个安全问题,因为此数据在静止状态下未加密。

通知影响

无。

其他最终用户影响

无。

性能影响

生成 configdrive 镜像并将其发送到另一个服务将导致 Nova 在 Ironic 的虚拟驱动程序中花费更多时间,尽管额外花费的时间应该相对较小。

其他部署者影响

无。

开发人员影响

无。

实现

负责人

主要负责人

jroll

工作项

  • 实现代码和单元测试。这将涉及更改 Ironic 虚拟驱动程序中的 spawn() 函数以生成 configdrive,对其进行 gzip 压缩并进行 base64 编码,并将其作为 API 调用请求的主体传递给 Ironic,以启动节点的部署。

依赖项

此更改取决于 Ironic 对将 configdrive 写入实例的支持。[1]

测试

单元测试。

文档影响

可能需要更新文档以指示可以使用 configdrive 与裸机实例一起使用。

参考资料

[1] Ironic configdrive 规范:https://review.openstack.org/#/c/99235/