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 流程将是
需要一个新的微版本才能选择加入此新功能。如果请求的 API 微版本较旧,则应返回 400 错误。请注意,旧行为仍然允许使用相同的镜像重建基于卷的服务器,在这种情况下,我们不会擦除卷的数据。为了防止用户意外删除所有数据,我们需要他们使用新的微版本。
如果 cinder 的微版本足够新,可以重新镜像启动卷。否则,将引发 CinderAPIVersionNotAvailable 异常。
对于多重附加卷,n-api 将拒绝该请求,因为重建多重附加卷需要复杂的附加处理,并且工作量将超过收益。
然后 nova-compute 管理器将执行以下步骤
为 volume 和服务器创建一个空的(没有 connector)volume 附件。这确保了 volume 在下一步中保持
reserved状态。删除现有的 volume 附件(旧的那个)。
将新的附加 UUID 保存到 BDM。
上述两个步骤是为了将卷保持在
reserved状态,作为 cinder 执行其重新镜像操作所需的管理状态。调用新的
os-reimagecinder API。添加一个新的 ‘volume-reimaged’ 外部事件,以等待 cinder 完成重新镜像。就像我们用于 volume-extend 一样。有关详细信息,请参阅 perform_resize_volume_online。
在重新镜像操作成功完成后,cinder 将通过外部事件 API 通知 Nova 重新镜像操作已完成。
调用 cinder 更新空的卷附加,传递连接器信息,cinder 将返回连接信息给 Nova。
在 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 卷被认为是持久的,而此操作并非如此。
参考资料¶
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 |
已批准。 |
瑜伽 |
已批准。 |
Zed |
重新提出。 |