支持从 Cinder 卷下载和上传

https://blueprints.launchpad.net/glance/+spec/cinder-store-upload-download

当前的 Glance Cinder 后端驱动程序只能获取卷的大小,但不支持卷的读取、写入和删除。

由于 Cinder 侧缺失的部分(在 [1] 中列出:os-brick 库、readonly-volumes、multi-attach)现在都已支持,因此我们可以实现其读取(下载)、写入(上传)和删除功能。

当原始镜像备份在 cinder 存储上时,可以通过克隆镜像卷来创建一个新的卷。这将有助于快速启动从卷启动的实例,因为某些 Cinder 驱动程序可以使用写时复制技术高效地克隆卷。它还将改进支持薄配置的驱动程序的存储容量。[3]

请注意,镜像卷本身不打算用作实例的启动卷。镜像卷被标记为只读,因此无法以读写模式附加到实例。相反,应使用克隆卷来启动实例。

问题描述

如果没有 Glance Cinder 后端驱动程序的上传、下载和删除支持,就无法将其用作默认存储。

提议的变更

本规范建议实现将镜像上传到 Cinder 卷以及从 Cinder 卷下载镜像,并在删除镜像时删除卷。

  • 上传步骤

    • 创建一个大小足以存储镜像的新卷。它将放置在 glance-api.conf 中指定的租户中。

    • 使用 os-brick 库将新卷附加到 glance-api 主机。

      • os-brick 库收集连接器(主机)信息,例如 iSCSI 的发起者 IQN 或 FibreChannel 的 WWN。

      • 使用连接器信息和卷作为参数调用 Cinder 的 initialize_connection API,以获取卷连接信息,例如 iSCSI 的目标门户 IP 地址和 IQN。

      • 将连接信息传递给 os-brick 的 connect_volume 方法,以将卷附加到主机。返回卷设备信息,例如设备路径(例如 /dev/sdX)。此步骤需要 root 权限才能执行 iSCSI、FC 等命令,因此必须安装 glance-rootwrap,并且它应该允许 os-brick 的命令。[2]

    • 将镜像数据从给定的设备路径写入卷。

    • 从主机分离卷。

      • 调用 os-brick 的 disconnect_volume 方法和 Cinder 的 terminate_connection API 以删除卷连接。

    • 将卷标记为只读。

    • 添加卷元数据,以指示镜像大小、镜像 ID、镜像所有者(即使它放置在服务租户中,也要跟踪所有者)。例如:

      {
       'image_id': 'e38f5596-4bd3-4b63-b4ef-88bcc814ed8e',
       'image_owner':     'b58fffa08b4242988c42950b5f24fcd5',
       'image_size':      '228599296',
      }
      
  • 下载步骤

    • 将镜像卷作为只读附加到 glance-api 主机。

    • 从卷读取镜像数据。

    • 分离卷。

  • 删除步骤

    • 当删除镜像时,调用 Cinder 的 delete API 以删除卷。

由于 cinder 当前不支持租户之间的 ACL 或公共卷,为了支持公共或可共享的镜像,镜像卷应放置在只能从 Glance 和 Cinder 服务访问的服务租户中,以控制可访问性。

备选方案

数据模型影响

REST API 影响

安全影响

为了附加和分离卷到主机,需要 root 权限才能操作主机上的块设备。Glance 需要导入 oslo-rootwrap,以仅允许执行这些操作所需的命令作为 root 用户执行。

Glance 节点必须是存储网络(iSCSI、FC 等)的一部分。从理论上讲,这可能会打开每种方式的新攻击向量。

通知影响

其他最终用户影响

性能影响

当从 Glance Cinder 存储中存储的镜像创建新的 Cinder 卷,或从卷创建新的镜像时,如果满足某些条件(例如,存储在 Cinder 后端中的镜像以原始格式存储),Cinder 能够使用存储阵列功能(例如后台复制或写时复制)卸载镜像复制。这将显著提高镜像复制的性能。

如果部署了 Cinder,Nova-compute 将能够通过将镜像卷附加到主机来绕过镜像复制。

请注意,镜像上传/下载需要 cinder 存储的足够带宽。

其他部署者影响

要使用 cinder 后端,Glance 节点必须能够访问后端存储,并且可能需要额外的硬件连接(iSCSI、FC 等)。操作员必须适当地配置 cinder 和 glance-api.conf。

  • 要启用 cinder 存储,必须将 cinder 添加到 glance-api.conf 中的 stores 选项。

  • 要将镜像卷放置到特定的租户中,还必须提供该租户的身份验证信息。

  • 必须安装 glance-rootwrap。rootwrap 配置路径还应在 glance-api.conf 中配置。

  • 为了将卷创建上的镜像复制卸载到存储阵列,cinder.conf 中的 allowed_direct_url_schemes 选项应包含 cinder[3] 此外,glance-api 主机必须能够将 Cinder 卷附加到自身。

开发人员影响

实现

负责人

主要负责人

tsekiyam

评审人员

核心评审人

flaper87

工作项

  • 将 os-brick 和 oslo-rootwrap 导入到 glance_store 中。

  • 扩展当前的 cinder 后端驱动程序以支持上传、下载和删除。

依赖项

测试

  • 在 devstack 中启用 cinder 后端。

  • 测试将镜像上传到 cinder 后端。

  • 然后再次测试下载镜像。

  • 删除镜像并检查是否删除了卷。

  • 测试其他正常的 glance 存储操作,例如所有者更改和共享。

文档影响

文档应扩展为描述如何启用和使用 cinder 存储。特别是,它应该解释配置 cinder 身份验证(租户 ID、用户名、密码)的新选项,以将卷存储到特定的租户中。

它还需要涵盖 Glance 节点是存储网络(iSCSI、FC 等)的一部分以及具有足够的存储带宽的要求。

参考资料