将 Manila 共享挂载和卸载到 Sahara 集群的 API¶
https://blueprints.launchpad.net/sahara/+spec/mount-share-api
作为 OpenStack 的共享文件配置服务,manila 与 sahara 具有很强的集成潜力,既可以用于共享二进制存储,也可以作为数据源。虽然将 manila 的共享配置 API 封装在 sahara 中似乎没有必要,但允许用户以可预测的方式将共享轻松挂载到 Sahara 集群的所有节点,将是此集成的关键便利功能。
问题描述¶
手动将共享挂载到大型集群的每个节点将是一个繁琐且容易出错的过程。自动挂载请求用于数据源或二进制存储情况的共享,对于某些用例来说可能是可行的。但是,在我们的(可选)EDP 接口之外,此功能将无法使用。因此,最好为用户提供一个将共享挂载到 Sahara 集群的 API。
提议的变更¶
此更改建议扩展节点组模板、节点组、集群模板和集群 API 资源以及数据库对象,以包含一个“shares”字段。与其他节点组字段一样,集群模板和集群 API 将允许覆盖此字段(这对于组合尤其重要,因为 manila 共享代表具体数据而不是抽象资源池)。在资源级别(对于两种资源类型),此字段将由以下 jsonschema 定义
"shares": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"path": {
"type": ["string", "null"]
},
"access_level": {
"type": ["string", "null"],
"enum": ["rw", "ro"],
"default": "rw"
}
},
"additionalProperties": False,
"required": [
"id"
]
}
}
上述“id”指的是要挂载的 manila 共享的 UUID。它是必需的。
“path”指的是集群中每个节点上挂载此共享的本地路径,为了简单起见,该路径应在集群的所有节点上通用。它将默认设置为 /mnt/{share_id}。
“access_level”控制 manila 中集群 ip 的权限设置。它默认为‘rw’。
由于此字段的任何部分都不需要索引,因此建议将上述结构直接序列化到数据库中,作为 TEXT 字段以 JSON 格式存储。
在节点组级别指定的任何共享都将挂载到该节点组的所有实例。在集群级别指定的任何共享都将挂载到该集群的所有节点。在集群创建时,如果特定共享 id 在节点组和集群级别都指定了,则集群的共享配置(路径和访问级别)将完全替换节点组的配置。任何共享配置的合并都被认为是不必要地复杂且容易出错,并且我们长期以来的模式是集群级别的配置优先于节点组级别的配置。
此 API 中的错误情况包括
提供的 id 不是有效的 manila 共享 id,通过使用用户的凭据通过 manilaclient 进行评估。
提供的路径不是有效的绝对 Linux 路径。
路径不唯一(在为任何一个节点指定的共享集合中,或为任何集群指定的共享集合中)。
提供的 id 映射到 manila 共享类型,而 sahara 目前无法挂载该类型。
用户服务目录中不存在 manila 服务端点。
在集群创建(或更新,如果更新成为可用的端点),在集群变为可用状态并委托给插件之前(以便用于 HDFS 集成的任何共享都将就绪,以便插件配置可以对其进行操作),Sahara 将执行共享挂载步骤。对于每个共享,Sahara 将执行以下步骤
查询 manila 以获取共享信息,包括共享类型和默认值。
查询集群对象,以查找应挂载共享的任何节点组的所有集群节点的内部 ip 地址。
对于每个节点,根据共享上的权限设置,调用 manila 以允许每个 ip 访问。
对每个符合条件的节点进行远程调用,并通过从 manila 返回的挂载地址挂载共享。
上述步骤 1-3 将通过抽象 ShareHandler 类中的通用代码处理。最后一步将委托给该类的具体实例,该实例基于 manila 报告的共享类型,将执行通过远程套接字执行适当命令行操作以挂载共享的操作。
此功能的第一个版本的参考和测试实现将仅提供 NFS 挂载器。HDFS 挂载器是下一个逻辑步骤,但此功能集已经在与此更改并行进行中,并且超出了此规范的范围。
卸载是该类的自然扩展,但不在本规范中涵盖。
替代方案¶
可以尝试一种更无缝的 manila 共享存储和数据源方法,在这种方法中,不向用户公开任何 API,并且在所需资源的共享时自动挂载和卸载共享(如在数据源 URL 或二进制存储路径中引用)。但是,赋予用户随意挂载和卸载共享的能力可能会允许我们无法预料的用例,尤其是在不使用 EDP API 的 Sahara 配置集群的情况下,新的 API 至关重要。
也可以尝试将 manila 共享创建(甚至共享网络创建或网络路由器配置)封装在 sahara 中。然而,断言这超出了我们的章程范围似乎是合理的,并且要求用户直接通过 manila 创建共享将使他们能够更全面和最新地访问 manila 的功能集。
在 sahara 实现方面,可以创建一个新的“share”资源和表,以便于更新和组合建模。然而,共享可能永远不会成为 sahara 中的顶级名词;对于我们打算进行的共享管理程度,一个字段比整个资源更合适。
应该注意的是,本规范不尝试处理 Linux 的 n 个发行版和 m 个文件系统类型之间的文件系统驱动程序安装问题;这样的努力比一个规范和更改集更适合许多规范和更改集。
请注意,二进制存储和数据源集成都故意未在此处处理。二进制存储规范将基于此规范构建,但此规范是独立发布的,以便致力于数据源集成的工程师可以提出仅修改与其需求相关的更改的修订。
数据模型影响¶
将在节点组和节点组模板中添加一个新的“shares”TEXT 字段。
REST API 影响¶
将在节点组和节点组模板的资源中添加一个新的“shares”字段。此字段仅允许初始更改中的创建功能,因为集群更新是我们 API 中的一个痛点。
其他最终用户影响¶
Python-saharaclient 需要了解所有受支持资源上的新 shares 字段。
部署者影响¶
无。
开发者影响¶
无。
Sahara-image-elements impact¶
初始更改不需要;未来添加专门的 fs 驱动程序可能需要镜像更改。
Sahara-dashboard / Horizon 影响¶
Horizon 中的共享挂载功能可能需要在所有受影响的资源上需要一个单独的选项卡,并留给单独的规范。
实现¶
负责人¶
- 主要负责人
egafford
- 次要分配人/审查人
croberts
工作项¶
API 资源修改和调用验证。
DB 模型修改和测试。
Manila 客户端与 Sahara 的集成。
集群配置中的逻辑粘合代码。
ShareMounter 抽象和 NFS 实现。
单元测试。
集成测试(在可行的情况下,需要 manila 在 CI 环境中进行完整的 CI)。
更新 API WADL 站点。
Horizon 更改(在单独的规范中)。
文档。
依赖项¶
此功能引入了对 python-manilaclient 的新依赖项。
测试¶
假定单元测试;除此之外,完整的集成测试将取决于将 manila 端点添加到我们的 CI 环境的可行性。如果这是可行的,那么我们的测试路径将很明确;如果不可行,那么无法进行门控集成测试。
文档影响¶
此功能需要在 features.rst 中进行文档记录,并将驱动 api 文档的更改。
参考资料¶
如果对 manila 操作不熟悉,请参阅 https://wiki.openstack.org/wiki/Manila/API。