直接部署接口通过HTTP服务器配置

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

本规范提出了一种机制,通过托管自定义HTTP服务作为镜像源提供程序,用于当使用Image服务时,direct 直接部署接口的配置。

问题描述

目前,direct 直接部署接口需要一个未认证的镜像源链接,以便在ramdisk上运行的agent可以从提供的链接下载镜像并将其部署到硬盘。

在典型的部署中,用户镜像由Image服务管理,并且在大多数情况下,访问由Identity服务控制。direct 直接部署接口依赖于Object Storage服务生成一个未认证的URL,该URL在一段时间内可访问(例如tempurl)。

问题在于,由于各种原因,Object Storage服务并非总是被采用于部署,并且它本身对部署施加了限制。例如:

  • 它对小型云的益处不大,但会占用更多的硬件资源。

  • 它要求裸机节点必须能够访问控制平面网络,这限制了网络拓扑。

  • 它要求Image服务配置为使用swift作为后端,这可能会与原始后端冲突。

由于Ironic没有机制或手段来利用本地HTTP服务器来为IPA提供临时镜像文件以促进节点部署,因此本提案旨在通过提供对此的支持来提供替代方案。

提议的变更

要使此功能正常工作,需要在Ironic conductor节点上运行一个HTTP服务器。

目前有两种场景,如果 instance_info['image_source'] 指示它是一个glance镜像,direct 直接部署接口通过glance客户端生成tempurl,并将其存储到 instance_info['image_url'],否则它将直接作为 image_url 获取。这两种情况通常代表在云中使用Bare Metal服务或作为独立服务,分别。

本提案引入了一个新的字符串选项 [agent]image_download_source 来控制当 image_source 是glance镜像时将生成哪种类型的镜像URL。允许的值是 swifthttp,默认值为 swift

在不同的配置下,direct 直接部署接口的过程定义如下:

  • swift:保持当前逻辑,生成tempurl并将其更新到 instance_info['image_url']

  • http:在节点部署之前,通过 InstanceImageCache 下载实例镜像,在本地HTTP服务可访问的目录中创建指向下载的实例镜像的符号链接,生成正确的URL并将其更新到 instance_info['image_url']

现有的 [deploy]http_root 将被重用以存储指向下载的实例镜像的符号链接。引入一个新的字符串选项 [deploy]http_image_subdir 以使其与iPXE相关脚本隔离。默认值为 agent_images。现有的 [deploy]http_url 将被重用以生成实例镜像URL。

direct 直接部署接口将使用相同的实例缓存进行镜像缓存,缓存将在 AgentDeploy.deploy 处执行。缓存实例镜像后,direct 直接部署接口将在 <http_root>/<http_image_subdir> 处创建指向实例镜像的符号链接以进行引用。如果一切按默认设置进行,它将是 /httpboot/agent_images/<node-uuid>

direct 直接部署接口将在 AgentDeploy.prepare 处生成实例镜像的URL并将其更新到 instance_info。相应的镜像URL将是 <http_url>/<http_image_subdir>/<node-uuid>。符号链接将在节点部署完成时从状态 deploy failed 移除时,或在 AgentDeploy.clean_up 处移除。

转换镜像的规则

目前,iscsi 部署接口将在 [DEFAULT]force_raw_images 设置为True时将镜像转换为 raw

而IPA以两种不同的方式处理实例镜像:

  • 如果实例镜像格式为 rawstream_raw_images 为True且镜像类型为整个磁盘镜像,则镜像将被流式传输到Bare Metal的目标磁盘。

  • 否则,镜像将在写入磁盘之前缓存到内存中。

为了避免raw镜像被缓存到Bare Metal的内存中,direct 直接部署接口仅在满足以下条件时才将镜像转换为raw:

  • [DEFAULT]force_raw_images 设置为True,

  • [agent]stream_raw_images 设置为True,

  • 实例镜像类型是整个磁盘镜像。

如果发生镜像转换,direct 直接部署接口将重新计算MD5校验和并更新必要的字段到 instance_info

缓存共享

iscsidirect 部署接口共享相同的缓存,但对镜像是否应转换为raw应用不同的规则。当两个接口同时使用时,这会导致缓存兼容性问题。

例如,假设我们使用iscsi部署节点A,使用分区镜像,然后使用direct部署节点B,使用相同的镜像。缓存中的镜像被转换为raw,但根据 direct 直接部署接口的规则,它假定镜像不会转换为raw,即使它将 force_raw 指定为false到镜像缓存,由于缓存命中,实际上不会执行任何镜像操作,这将导致 direct 直接部署接口实际上提供一个raw镜像但没有重新计算MD5校验和。

反之,如果我们反转上述顺序,iscsi 部署接口可能会获得一个qcow,而 [DEFAULT]force_raw_images 设置为true,虽然这可能不是问题,因为populate_image会在写入之前检查镜像格式。但它仍然不是一致的行为。

为了解决上述问题,本规范建议更新 ImageCache.fetch_image 以将输入参数 force_raw 纳入主镜像文件名中。

  • 如果 force_raw 设置为 False,则主文件名不会更改。

  • 如果 force_raw 设置为 True,则主文件名将带有 .converted 作为文件扩展名,例如:

    /var/lib/ironic/master_images/6e2c5132-db24-4e0d-b612-478c3539da1e.converted
    

请注意,.converted 扩展名仅仅作为指示下载的镜像经过转换逻辑的指标。对于glance中的raw镜像,只要传入的 force_raw 参数为True,主镜像文件的名称仍然带有 .converted

备选方案

另一种实现方法 支持agent直接从glance下载实例镜像 是支持IPA直接从glance下载实例镜像,此方法的部署限制与agent今天相同,裸机必须在配置网络上访问glance。但它可以解决对glance后端的依赖问题,因此可以作为进一步的工作。

与其从 direct 直接部署接口支持HTTP配置,也可以将其实现为新的部署接口,例如 direct-http

数据模型影响

状态机影响

无。

REST API 影响

客户端 (CLI) 影响

无。

“ironic” CLI

“openstack baremetal” CLI

RPC API 影响

无。

驱动程序 API 影响

无。

Nova 驱动程序影响

Ramdisk 影响

安全影响

在Ironic conductor节点上提供HTTP服务会暴露可访问的端口,从而可能产生安全影响。有几种方法可以提高安全性:

  1. 将端口绑定到专门用于配置网络的网络接口。

  2. 配置防火墙以防止来自配置网络以外的源IP地址的访问。

可能还有其他方法,但这超出了本规范的范围。

为了允许HTTP服务器访问缓存目录中的实例镜像,Ironic conductor服务的用户的文件创建掩码应配置为可被HTTP服务的用户访问。大多数系统使用022或002作为默认umask,这应该足够了。如果不是这种情况,则会产生安全影响。

其他最终用户影响

可扩展性影响

一旦将 [agent]image_download_source 设置为 http,实例镜像将缓存到Ironic conductor节点上,如果conductor节点之前使用 direct 直接部署接口,则会占用更多的磁盘空间。预期的空间使用量基本上不应超过 iscsi 部署接口。

IPA直接从conductor节点下载实例镜像,这将减少控制平面网络上的流量,但代价是增加每个conductor节点上的流量。消耗量不应超过 iscsi 部署接口。

性能影响

根据硬件和镜像类型,重新计算raw镜像的MD5校验和可能会消耗大量的CPU/IO资源。如果担心Ironic conductor节点的性能,请将 [DEFAULT]force_raw_images 设置为 False(该选项默认值为 True)。

其他部署者影响

在使用此功能时,应在每个Ironic conductor节点上设置并配置HTTP服务器。

每个HTTP服务器应配置为遵循实例镜像的符号链接,以便从外部请求访问。如果使用Apache HTTP服务器,请参考 FollowSymLinks,如果使用Nginx HTTP服务器,请参考 disable_symlinks

开发人员影响

实现

负责人

主要负责人

kaifeng

其他贡献者

sambetts

工作项

  • 将实例缓存提升为全局缓存,可供其他接口使用。

  • 实现 direct 直接部署接口的提议工作,包括镜像缓存、校验和重新计算、符号链接管理等。

  • 更新文档。

依赖项

测试

此功能将通过单元测试覆盖。

升级和向后兼容性

本功能引入了两个新选项 [agent]image_download_source[deploy]http_image_subdir

[agent]image_download_source 默认值为 swift,不应影响升级。

缓存文件名称的更改可能会在升级后使一些缓存的实例镜像失效,它们将在使用时重新缓存,未引用的镜像最终将被清理。如果升级前禁用了缓存,则不会产生影响。

文档影响

更新admin/interfaces/deploy.rst以描述此功能的使用。

参考资料