快照支持¶
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,最初实现 fake、no-snapshot 和 agent。
对于 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 连接的示例参数
image_name: “a830ebe1-67d4-448f-aa10-5bb33f3f3c02-snapshot.qcow2”
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 覆盖。
升级和向后兼容性¶
应与旧版本兼容。
文档影响¶
将更新此功能的文档。