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

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

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

问题描述

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

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

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

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

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

  • 它要求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>。符号链接将在节点部署完成时在AgentDeploy.deploy处删除,或者在节点从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今天相同,baremetal必须在配置网络上访问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以描述此功能的使用。

参考资料