volume-backed server rebuild

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

目前,计算 API 在用户尝试使用新镜像重建基于卷的服务器时会 失败。本规范建议添加支持使用新镜像重建基于卷的服务器的功能。

问题描述

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

用例

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

提议的变更

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

  1. 需要一个新的微版本才能选择加入此新功能。如果请求的 API 微版本较旧,则应返回 400 错误。请注意,旧行为仍然允许使用相同的镜像重建基于卷的服务器,在这种情况下,我们不会擦除卷的数据。为了防止用户意外删除所有数据,我们需要他们使用新的微版本。

  2. 如果 cinder 的微版本足够新,可以重新镜像启动卷。否则,将引发 CinderAPIVersionNotAvailable 异常。

  3. 对于多重附加卷,n-api 将拒绝该请求,因为重建多重附加卷需要复杂的附加处理,并且工作量将超过收益。

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

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

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

  3. 将新的附加 UUID 保存到 BDM。

  4. 上述两个步骤是为了将卷保持在 reserved 状态,作为 cinder 执行其重新镜像操作所需的管理状态。

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

  6. 添加一个新的 ‘volume-reimaged’ 外部事件,以等待 cinder 完成重新镜像。就像我们用于 volume-extend 一样。有关详细信息,请参阅 perform_resize_volume_online

  7. 在重新镜像操作成功完成后,cinder 将通过外部事件 API 通知 Nova 重新镜像操作已完成。

  8. 调用 cinder 更新空的卷附加,传递连接器信息,cinder 将返回连接信息给 Nova。

  9. 在 Nova 完成与 brick 的连接后,完成附加,将卷标记为 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 该怎么办。如果 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 将更新以支持新的微版本。将添加两个额外的参数 –reimage-boot-volume`--no-reimage-boot-volume 作为检查(以及微版本检查),在 OpenStackClient 端确定用户是否真正知道它将重新镜像卷。

性能影响

由于涉及外部依赖以及 Cinder 中需要进行的工作,该操作将花费更长时间。

其他部署者影响

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

开发人员影响

升级影响

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

实现

负责人

主要负责人

Rajat Dhasmana <rajatdhasmana@gmail.com> (whoami-rajat)

工作项

  • 在客户端添加一个新的参数 --confirm-reimage

  • 更改现有的重建 API,以允许基于卷的实例使用新镜像进行重建。

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

  • 删除旧的 volume 附件。

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

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

  • 采用新的 compute 版本。

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

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

依赖项

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

测试

添加了以下测试

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

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

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

文档影响

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

将更新以下文档

  • API 参考

  • 我们还需要在文档中说明,当卷被重新镜像时,卷上的所有当前内容都将被销毁。这一点很重要,因为 cinder 卷被认为是持久的,而此操作并非如此。

参考资料

历史

修订 :header-rows: 1

发布名称

描述

Stein

已批准。

瑜伽

已批准。

Zed

重新提出。