允许 Manila 共享直接附加到使用 libvirt 的实例

https://blueprints.launchpad.net/nova/+spec/libvirt-virtiofs-attach-manila-shares

Manila 是 OpenStack 共享文件系统服务。此规范将概述 Nova 中所需的 API、数据库、计算和 libvirt 驱动程序更改,以允许 Manila 提供的共享与实例关联并附加到实例。

问题描述

目前用户必须手动连接并挂载 Manila 提供的共享资源到他们的实例中。因此,Manila 必须暴露后端存储基础设施的细节,并允许数据路径通过租户可寻址的网络流向用户的实例。

作为替代方案,Nova 可以将这些共享资源挂载到底层计算主机上,然后将提供的文件系统传递到实例,使数据路径远离任何租户可寻址的网络,并且无需暴露后端存储基础设施的细节。

用例

  • 作为用户,我希望将 Manila 共享直接附加到我的实例,并拥有一个简单的界面来在实例中挂载它们。

  • 作为用户,我希望从我的实例分离直接附加的 Manila 共享。

  • 作为用户,我希望跟踪附加到我的实例的 Manila 共享。

  • 作为操作员,我希望 Manila 数据路径与任何租户可访问的网络分离。

  • 作为运维人员,我不想向用户暴露我的存储基础设施的细节。

提议的变更

此初始实现仅提供对附加共享到现有 SHUTOFF 实例的支持,以及稍后分离共享的支持。在实例的初始创建过程中表达附件的能力不在本规范的涵盖范围内。

本规范不包含共享资源附加后的移动操作的支持。任何请求对附加了共享资源的实例进行 shelve、evacuate、resize、cold migrate 或 live migrate 的操作,目前都将被拒绝。

将在新的微版本下引入一个新的服务器 shares API。这将列出当前共享,显示其详细信息,并允许附加或分离共享。

将引入一个新的 share_mapping 数据库表和相关的 ShareMapping 版本化对象,以捕获共享附件的详细信息。将提供一个基础 ShareMapping 版本化对象,可以从中派生 virt 驱动程序和后端共享特定的对象,从而提供特定的共享附加和分离实现。

注意

需要注意的是,Nova 内部不会存储任何 Manila 状态,除了用于初始附加共享的导出详细信息。稍后在分离共享时将使用这些详细信息。如果共享随后重新附加,Nova 将从 Manila 请求新的导出详细信息,并在 Nova 中新的共享附件中存储这些信息。

libvirt 驱动程序将被扩展以支持上述内容,并初步支持冷附加和分离。未来的工作将旨在添加实时附加和分离,一旦 libvirt 本身支持

此初始 libvirt 支持将针对 Manila 中的基本 NFS 和更复杂的 CephFS 后端。共享将通过 virtio-fs 映射到基础 libvirt 域。这需要计算主机上的 QEMU >=5.0 和 libvirt >= 6.2,以及实例客户机操作系统内的 >= 5.4 的内核版本。

此外,此初始实现需要关联的实例使用 文件支持的内存大页。这是 virtio-fs 的要求,因为 virtiofsd 服务使用 vhost-user 协议直接与底层客户机通信。

将引入两个新的计算兼容性特征来模拟单个计算对 virtio-fs 和文件支持内存的支持。

  • COMPUTE_STORAGE_VIRTIO_FS

  • COMPUTE_MEM_BACKING_FILE

然后,这些特征将与实例关联的 flavor 和 image metadata 一起使用,以确保在请求附加共享资源期间满足上述要求。

未来的工作将着眼于取消此要求,并引入一种更强大的方法来通过 flavor extra specs 和 image properties 允许访问底层客户机内存,但这超出了本规范的范围。

用户可以使用挂载标签挂载附加的共享资源,这可以是来自 Manila 的共享资源 UUID,也可以是用户在其附加共享资源的请求中提供的字符串。

user@instance $ mount -t virtiofs $tag /mnt/mount/path

最初的实现不会创建先前讨论的 os-share 库,但如果底层主机上挂载和跟踪共享所需的逻辑也由其他项目需要,则将来可以创建它。目前,libvirt 驱动程序中现有的代码 用于跟踪基于 remoteFS 的存储(例如 NFS、SMB 等)托管的卷使用的文件系统主机挂载,将尽可能地重用。

备选方案

唯一的替代方案是继续当前的情况,即用户必须手动在他们的实例中挂载共享。缺点是这些实例必须能够访问 Manila 后端使用的存储网络。

REST API 影响

将在新的微版本下引入一个新的服务器级别 shares API,其中包含以下方法

  • GET /servers/{server_id}/shares

列出附加到实例的所有共享。

返回代码:200、400、401、403、404

{
    "shares": [
        {
            "shareId": "48c16a1a-183f-4052-9dac-0e4fc1e498ad",
            "status": "attached",
            "tag": "foo"
        },
        {
            "shareId": "e8debdc0-447a-4376-a10a-4cd9122d7986",
            "status": "attached",
            "tag": "bar"
        }
    ]
}
  • GET /servers/{server_id}/shares/{shareId}

显示附加到实例的特定共享的详细信息。

返回代码:200、400、401、403、404

{
    "share": {
        "shareId": "e8debdc0-447a-4376-a10a-4cd9122d7986",
        "status": "attached",
        "tag": "bar"
    }
}

管理员将能够查看存储在 Nova 中的附件 ID 和导出位置的详细信息

{
    "share": {
        "attachmentId": "715335c1-7a00-4dfe-82df-9dc2a67bd8bf",
        "shareId": "e8debdc0-447a-4376-a10a-4cd9122d7986",
        "status": "attached",
        "tag": "bar",
        "export_location": "server.com/nfs_mount,foo=bar"
    }
}
  • POST /servers/{server_id}/shares

将共享附加到实例。

先决条件:实例必须处于 SHUTOFF 状态。

这是一个异步 API,调用者需要轮询上述 GET 方法之一,以确定附件何时完成。

返回代码:202、400、401、403、404、409

请求主体

注意

tag 将是一个可选的请求参数,如果未提供,它将始终如请求中提供的一样是 shareId。

{
    "share": {
        "shareId": "e8debdc0-447a-4376-a10a-4cd9122d7986",
    }
}

响应体

{
    "share": {
        "shareId": "e8debdc0-447a-4376-a10a-4cd9122d7986",
        "status": "attaching",
        "tag": "e8debdc0-447a-4376-a10a-4cd9122d7986",
    }
}
  • DELETE /servers/{server_id}/shares/{shareId}

将共享从实例分离。

先决条件:实例必须处于 SHUTOFF 状态。

返回代码:202、400、401、403、404、409

数据模型影响

将引入一个新的 share_mapping 数据库表。

  • id - 用于标识特定共享资源附件的唯一 UUID

  • instance_uuid - 共享将附加到的实例的 UUID

  • share_id - Manila 中的共享的 UUID

  • status - Nova 中共享资源附件的状态。- detached - attaching - attached - detaching - error

  • tag - 用户在实例中挂载共享资源时要使用的设备标签

    实例

  • export_location - 用于将共享资源附加到

    底层主机的导出位置。

将引入一个新的基础 ShareMapping 版本化对象,以封装上述数据库条目,并用作特定 virt 驱动程序实现的父类。

此基础 ShareMapping 对象将提供存根 attachdetach 方法,任何子对象都需要实现这些方法。

将引入新的 ShareMappingLibvirtShareMappingLibvirtNFSShareMappingLibvirtCephFS 对象作为 libvirt 实现的一部分。

安全影响

通过移除数据路径中的租户网络,同时消除用户了解底层存储环境细节的需求,这将改进使用 Manila 的安全模型。

Manila 返回并用于将共享资源附加到底层主机的 export_location JSON blob 不应被 Nova 记录,并且默认情况下只能通过 API 被管理员访问。

通知影响

将添加新的通知来表示将共享资源附加到实例和从实例分离的过程。

其他最终用户影响

用户需要使用返回的 tag 在他们的 guestOS 中挂载共享。

性能影响

通过使用 vhost-uservirtio-fs 应该在 guestOS 中具有接近本地(已挂载)文件系统性能。

其他部署者影响

开发人员影响

升级影响

将引入一个新的计算服务版本和兼容性特征,以确保计算服务和底层 virt 堆栈足够新,可以在接受请求之前通过 virtio-fs 附加共享资源。

实现

负责人

主要负责人

lyarwood

其他贡献者

功能联络人

功能联络人

lyarwood

工作项

  • 在 os-traits 中添加新的兼容性特征

  • 添加 libvirt 驱动程序对冷附加和分离的支持

  • 添加新的共享 API 和微版本

依赖项

测试

  • 功能 libvirt 驱动程序和 API 测试

  • 集成 Tempest 测试

文档影响

将提供详细的管理员和用户文档。

参考资料

历史

修订

发布名称

描述

瑜伽

引入