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 流程将是
是否已请求新的 API 微版本?
实例的 host 服务版本是否足够新,以支持使用新镜像进行基于卷的重建?
如果以上条件都为真,则继续。否则,在 API 中以 409 错误失败。
请注意,在使用新镜像重建时,请求将通过调度器针对当前 host 运行,以与基于镜像的重建保持一致。有关详细信息,请参阅 bug 1664931。
然后 nova-compute 将执行以下步骤
为 volume 和服务器创建一个空的(没有 connector)volume 附件。这确保了 volume 在下一步中保持
reserved状态。删除现有的 volume 附件(旧的那个)。
调用新的
os-reimagecinder API。轮询卷状态,直到完成(成功或失败)。
在重新镜像操作成功完成后,更新 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)
- 其他贡献者
郑振宇 <zhengzhenyu@huawei.com>
工作项¶
更改现有的 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 参考
参考资料¶
Stein PTG etherpad: https://etherpad.openstack.org/p/nova-ptg-stein
这是关于重建 volume-backed 服务器的讨论
http://lists.openstack.org/pipermail/openstack-dev/2017-October/123255.html
这是关于在重建期间我们应该如何处理根 volume 的讨论
http://lists.openstack.org/pipermail/openstack-operators/2018-March/014952.html
cinder 重新镜像 volume 的蓝图
https://blueprints.launchpad.net/cinder/+spec/add-volume-re-image-api
历史¶
发布名称 |
描述 |
Stein |
提议。 |
Train |
重新提出。 |