介绍新的卷挂载 API

https://blueprints.launchpad.net/cinder/+spec/add-new-attach-apis

问题描述

当前 Cinder 卷的挂载过程有些不一致,并且在具体运作方式上不够清晰。这部分原因在于增长和功能添加,例如可选参数使过程比需要的更复杂。

诸如 initialize_connection 之类的东西的解释有些分歧,并且由于不同后端的一些需求,事情变得有些hacky。 在挂载/卸载过程中存在潜在的竞争条件,最重要的是,我们似乎面临着添加诸如多重挂载支持之类的功能极其复杂和困难的情况。

与其继续在单体上添加功能,不如退一步,彻底简化流程,可能是一个好时机。

用例

将 Cinder 卷挂载到 Nova 实例、裸机或其他设备。

提议的变更

与其使用带有大量参数的 reserve、initialize 和 attach 来链式挂载,并尝试修改使其支持多重挂载,不如引入一套新的简化且更健壮的挂载 API。

API 操作

  • attachment_create

    此调用用于创建卷挂载。

    如果未指定 connector,此调用将仅完成卷预留步骤并创建一个空的卷挂载。Nova 可以通过 API 调用它来启动卷挂载过程,方法是检查卷是否可用并创建空挂载。为了完成操作,Nova 将调用 ‘attachment_update’。

    如果指定了 connector,它将预留卷并在卷和主机之间创建连接,并更新挂载记录。这可用于例如裸机用例,当 connector 立即可用时。

    在两种情况下,该调用都会将 attachment_id 返回给调用者。

    参数

    volume_id instance_uuid connector (可选)

    返回值

    attachment_id

  • attachment_update

    此调用用于更新现有的卷挂载。对于此调用,connector 是必需的。

    如果挂载为空,它还会完成卷的挂载并相应地更新挂载记录。

    由于在每种情况下都会调用该挂载,因此 attachment_id 是必需的。

    参数

    attachment_id connector

    返回值

    connection_info

  • attachment_get

    此调用将获取指定的挂载对象(通过 ID)。 此外,此调用将发送到 Cinder 后端驱动程序并查询任何共享连接信息。 原因是,我们返回请求的挂载对象以及任何共享 attachment_id 的列表。

    参数

    attachment_id

    返回值

    挂载信息

    {id: <挂载对象 UUID>,

    project_id: <与挂载关联的项目 ID>, volume_id: <与此挂载记录关联的卷 UUID>, instance_uuid: <挂载所用实例的 UUID>, attached_host: <附加到的计算节点的 hostname>, mountpoint: <实例内期望使用的挂载点>, attach_time: <创建挂载的时间>, detach_time: <卸载的时间>, attach_status: <挂载状态>, attach_mode: <ro|rw>, shared_connections_by_attachment: [<attachment_id>, …]}

  • attachment_remove

    删除/卸载现有的挂载,如果不再有任何挂载,则将卷标记为可用。

    参数

    attachment_id

    返回值

    任何共享连接的 attachment_id 列表

备选方案

继续尝试 hack 现有的挂载/卸载流程。 处理 Nova 和 Cinder 之间存在的 split brain 问题。

我们有可能重写现有的方法并强制使用更严格的接口,并且可能没问题,但代码变得非常复杂且难以处理,并且将现有调用包装到管理包装器中,然后随着时间的推移迭代内部部分可能更容易。

数据模型影响

我们需要在创建挂载时存储 connector。 由于 connector 可能因后端而异,并且长度很容易超过 255 个字符,因此将其添加到 ‘volume_attachment’ 表中不可行。 与此相反,我们将添加一个 ‘attachment_specs’ 表,它将吸入 connector 中的 k/v 条目。

REST API 影响

这将引入提案部分中提到的至少 4 个新的调用,这些调用将是名为 attachment 的新 API 对象的一部分。 我们会将挂载视为 Cinder 中的一等对象。

新的 API 将在新的微版本下发布。

安全影响

通知影响

其他最终用户影响

旧的 API 仍然有效,直到我们决定弃用它们为止。

性能影响

其他部署者影响

开发人员影响

目前,这避免了对 Cinder 驱动程序的更改,并专注于仅 API,用于挂载/卸载调用,直到 Manager 层为止。

实现

将 initialize_connection 和 attach 合并到一个 attachment_create 调用中。

这里的意图是 Cinder 不应该过多地了解消费者如何使用卷或挂载。 我们只需要关心他们希望挂载或卸载,仅此而已。 为了正确地做到这一点,我们需要一个消费者应该存储并在完成挂载后引用 attachment_id。 这意味着由消费者决定何时真正完成,并希望销毁挂载,而不是现在我们尝试根据线索猜测。

负责人

主要负责人

john-griffith

工作项

  1. 在 Cinder 中实现 API 调用和包装器

  2. 实现 cinderclient 调用以公开它们

  3. 在 Nova 中实现更改

依赖项

测试

一旦 API 设计完成,我们将添加与当前挂载/卸载 API 相同的 Tempest 测试覆盖范围。 同时,Nova 实现将开始采用新的 API,这将增加额外的测试层。

文档影响

需要更新关于 Cinder 中卷挂载/卸载方式的任何和所有文档。

参考资料