volume-backed server rebuild

https://blueprints.launchpad.net/nova/+spec/volume-backed-server-rebuild

目前,计算 API 会失败,如果用户尝试使用新镜像重建 volume-backed 服务器。本规范建议添加支持使用新镜像重建 volume-backed 服务器的功能。

问题描述

目前 Nova rebuild(使用新镜像)仅支持从镜像启动的实例。当提供新镜像时,volume-backed 实例无法重建。尝试重建 volume-backed 实例会引发 HTTPBadRequest 异常。

用例

  • 作为用户,我希望能够使用新镜像重建我的 volume-backed 服务器。

  • 作为 Nova 开发人员,我希望计算 API 对于 volume-backed 和 image-backed 服务器具有功能对等性。

提议的变更

首先,更改现有用于重建 volume-backed 服务器的 API。然后 API 流程将是

  1. 是否已请求新的 API 微版本?

  2. 实例的 host 服务版本是否足够新,以支持使用新镜像进行基于卷的重建?

如果以上条件都为真,则继续。否则,在 API 中以 409 错误失败。

请注意,在使用新镜像重建时,请求将通过调度器针对当前 host 运行,以与基于镜像的重建保持一致。有关详细信息,请参阅 bug 1664931

然后 nova-compute 将执行以下步骤

  1. 为 volume 和服务器创建一个空的(没有 connector)volume 附件。这确保了 volume 在下一步中保持 reserved 状态。

  2. 删除现有的 volume 附件(旧的那个)。

  3. 调用新的 os-reimage cinder API。

  4. 轮询卷状态,直到完成(成功或失败)。

  5. 在重新镜像操作成功完成后,更新 Cinder 中的空卷附件,然后在生成(重建的)客户机 VM 时在 Nova host 上执行附件,并“完成”附件,这将使卷再次 in-use

在此过程中,我们可能会遇到一些条件

  • 如果重新镜像 volume 失败并且 volume 处于 ‘error’ 状态,则我们应该将实例状态设置为“error”。由于用户可以重建处于 error 状态的实例,因此用户有一种方法可以在解决 cinder 端故障原因后重试重建。

  • 如果 Cinder API 本身返回 >=400 错误,则根卷没有变化,在这种情况下,迁移状态可以为“failed”,但实例状态应恢复到原来的状态(我们可以看到 _error_out_instance_on_exception 的用法)。

备选方案

另一种选择是 nova 将重建像从卷初始启动一样进行,nova-compute 将从新镜像创建一个新卷,然后在重建期间“交换”实例上的根卷。

然而,这存在一些问题,例如如何处理旧的 volume

  • 关于 BDM 中的“delete_on_termination”标志,delete_on_termination=True 表示:在终止实例时不要删除卷。重建表示:就地重新初始化此实例。重建流程必须确定如果旧根卷 BDM 标记为 delete_on_termination=True 该怎么办 - 忽略该标志并保留旧根卷,还是删除它。

  • 我们可以将一个新的标志传递给 rebuild API,告诉 nova 如何处理旧的 volume(删除它或不删除它)。如果标志为 true 以删除旧的 volume,但旧的 volume 具有快照,Nova 将不会删除 volume 快照,只是为了在重建期间删除 volume。

但正如上面提到的,存在一些问题,例如配额以及 nova 应该如何处理旧的 volume,您可以在 References 中找到更多详细信息。

数据模型影响

REST API 影响

如果满足 Proposed change 部分中描述的条件,则将 rebuild 请求响应代码从 400 更改为 202。API 微版本和 compute RPC 版本也将递增,以指示新的支持。

安全影响

通知影响

其他最终用户影响

python-novaclient 和 python-openstackclient 将更新以支持新的微版本。

性能影响

由于涉及的编排和 Cinder 中需要发生的工作,该操作将花费更长时间。

其他部署者影响

如果 cinder volume reimage API 操作失败并且 volume 变为 error 状态,管理员可能需要调查并解决 cinder 中的问题,然后将 volume 状态重置为 reserved

开发人员影响

升级影响

API 微版本和 compute RPC 版本也将递增,以指示新的支持,因此,在托管基于卷的实例的 nova-compute 服务升级之前,用户将无法利用此功能。

实现

负责人

主要负责人

李杰 <lijie@unitedstack.com> (ramboman)

工作项

  • 更改现有的 rebuild API。

  • 为根 volume 创建一个空的附件,以便在重建期间 volume 保持 in-use 状态(我们今天已经这样做了)。

  • 删除旧的 volume 附件。

  • 调用 cinder API 以重新镜像 volume。

  • 重新镜像后更新并完成 volume 附件。

  • 采用新的 compute 版本。

  • 在 python-novaclient 中采用新的微版本。

  • 在 python-openstackclient 中采用新的微版本。

  • 更改 nova API 文档。

依赖项

依赖于 cinder 重新镜像 volume 的蓝图,有关更多详细信息,请参见 References。

测试

添加了以下测试

  • Nova 单元测试用于负面场景

  • Nova 功能测试用于“happy path” 测试

  • Tempest 集成测试,以确保 nova/cinder 集成正常工作

文档影响

我们将替换 API 参考 中的注释,添加一个关于使用新镜像重建 volume-backed 服务器所需的最低微版本的注释。

将更新以下文档

  • API 参考

参考资料

历史

修订 :header-rows: 1

发布名称

描述

Stein

提议