快照支持

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

问题描述

快照并非新事物,虚拟机已经支持很长时间了。快照对于实例备份、镜像重用等非常有用,但对于裸机来说,由于比将请求传递给 libvirt 更复杂,因此没有提供这种支持。

裸机快照在速度和效率上可能无法与虚拟机相匹配,但它可以解决以下需求

作为操作员,我希望能够定期备份裸机实例,并在硬件故障时将相同的镜像应用于另一台机器。

作为操作员,我希望能够从定制后的实例构建主镜像,捕获系统到镜像并应用于其他类似机器。

提议的变更

该方案是实现类似于部署的过程,当节点被请求执行快照时,ironic 准备启动配置,然后触发到节点的 netboot,IPA 查找并 ironic 指示 IPA 将根磁盘的数据流式传输到远程存储。

如果配置了适当的服务(如 NFS、HTTP 等),远程存储可以是运行 conductor 的主机。或者,只要 conductor 和 IPA 都可以访问,可以是另一台主机。远程存储将充当中间存储,在流式传输完成后,conductor 将上传镜像到镜像服务并删除中间存储中的镜像。

初步方案是利用 HTTP WebDAV 作为远程存储,NFS 和其他存储可以在实现此功能后扩展。当直接部署接口配置为从 HTTP 服务下载镜像时,可以更新为支持 WebDAV。

备选方案

数据模型影响

将添加一个新的硬件接口 snapshot_interface 以支持不同的快照实现。

状态机影响

在状态机中添加以下状态

  • 快照等待

  • 快照中

  • 快照失败

以及以下转换

  • active -> 快照中 (在快照时) 准备启动和网络

  • 快照中 -> 快照失败 (在失败时) 发生错误

  • 快照中 -> 快照等待 (在等待时) 等待 ramdisk 启动

  • 快照等待 -> 快照中 (在恢复时) 镜像流式传输和上传

  • 快照等待 -> 快照失败 (在失败时) 超时

  • 快照等待 -> 快照失败 (在中止时) 在中止请求时

  • 快照中 -> active (在完成时) 快照完成

  • 快照失败 -> active (在中止时) 中止失败的快照

  • 快照失败 -> 快照中 (在快照时) 重新触发失败的快照

  • 快照等待 -> deleting (在删除时) 中止快照并取消部署

  • 快照失败 -> deleting (在删除时) 中止并取消部署

REST API 影响

使用现有的 provision 端点,一个新的动词 snapshot 将受到微版本保护。

  • PUT /v1/nodes/{node_ident}/states/provision

    当请求的版本被允许,并且节点处于 active 状态时,开始执行快照。需要一个 image_ref 参数,它引用一个用于存储快照镜像的位置。

    如果 image_ref 是一个 UUID,它引用镜像服务中镜像的 UUID,则在快照请求之前应该预先创建镜像,并充当接收镜像数据的容器。与 Compute 服务集成时,image_id 是传递给驱动程序接口 snapshot() 的参数。

    示例请求

     {
       "target": "snapshot",
       "image_ref": "66498c26-a9b5-496c-97a8-5bc08f256155"
     }
    
    The ``image_ref`` could be an URL in other forms for standalone usage,
    but not covered in this spec.
    

其他 provision 状态转换将使用现有的动词。

客户端 (CLI) 影响

“openstack baremetal” CLI

对 CLI 的影响应该很小,将有一个新的命令

  • openstack baremetal node snapshot <node> ...

“openstacksdk”

openstacksdk 将被增强以了解快照 API 版本。

RPC API 影响

将引入一个新的 rpc 接口 do_node_snapshot

驱动程序 API 影响

添加一个可选的接口 snapshot_interface,最初实现 fakeno-snapshotagent

对于 agent 实现,conductor 主机需要一个 WebDAV 服务来接收来自 IPA 的镜像数据。当收到第一个 heartbeat 时,ironic conductor 发送命令 snapshot.stream_image,并附带一个 URL 到 IPA 以启动快照。IPA 找到根设备并使用适当的方法将磁盘数据转储到远程存储。

有两种方法可以使用 WebDAV 服务

  • WebDAV 目录挂载到 ramdisk,IPA 使用 qemu-img 进行快照,空块将被跳过,从而提供更好的性能。

  • IPA 使用 dd 将磁盘数据转储到 WebDAV URL,完成后,ironic conductor 需要将原始镜像转换为正确的格式。

由于根设备可能非常大,甚至大于 conductor 主机的可用空间,因此 spec 中不认为 dd 实用。

在成功检索磁盘数据后,conductor 负责使用指定的 image_id 将镜像上传到镜像服务,并删除中间镜像。

Nova 驱动程序影响

Nova 驱动程序需要实现驱动程序接口 snapshot 以与 ironic 集成。但在集成之前,只要镜像服务可用,ironic 就可以使用此功能。

Ramdisk 影响

对于 agent 实现,将向 ironic-python-agent 添加一个 snapshot 扩展,当可以挂载 WebDAV 目录时,qemu-img 用于将磁盘数据流式传输到 URL。

快照扩展将定义为

HTTP WebDAV 连接的示例参数

IPA 将生成一个 URL 以进行挂载

mount -t davfs http://10.10.1.1:8080/snapshots /tmp/tmp5fjchif0

注意

NFS 连接未涵盖,但可以在实现此功能后实现。它看起来像

mount -t nfs 10.10.1.1:/var/lib/ironic/snapshots /tmp/tmp5fjchif0

安全影响

从目标裸机到镜像服务的实例镜像传输可能存在安全风险,因为在此过程中数据可能被篡改或检索。

其他最终用户影响

可扩展性影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

<kaifeng, kaifeng.w@gmail.com>

其他贡献者

<TheJulia, juliaashleykreger@gmail.com>

工作项

  • 为 IPA 提供流式传输磁盘数据的能力

  • 将状态和转换生成到 Ironic

  • DB、RPC 和 API 变更

  • 使客户端/SDK 了解该功能

  • 与 nova 插件

依赖项

测试

将由单元测试和 tempest 覆盖。

升级和向后兼容性

应与旧版本兼容。

文档影响

将更新此功能的文档。

参考资料