支持在恢复已挂载服务器时指定可用区

https://blueprints.launchpad.net/nova/+spec/support-specifying-az-when-restore-shelved-server

此蓝图建议支持管理员/用户在恢复已挂载服务器时指定 availability_zone(可用区)。

问题描述

如果当前实例的状态为 SHELVED_OFFLOADED(已挂载并卸载),则其 availability_zone 属性将在 instances 数据库表中设置为 None(此更改来自 [1])。但 spec 属性记录了实例被挂载之前在 request_specs 数据库表中的可用区值。在恢复服务器时,可用区的值将从 spec 中获取,作为 ‘instance.availability_zone’。

实例可以通过两种方式处于某个可用区

1. The user passes an AZ on server create or
2. [DEFAULT]/default_schedule_zone is set.

对于上述两种情况,RequestSpec.availability_zone 将始终保留在用户指定或 [DEFAULT]/default_schedule_zone 可用区中,即使该可用区后来被重命名并且 [DEFAULT]/default_schedule_zone 发生更改,或者服务器在挂载/恢复过程中,这里有一个相关的 bug [2]

一旦 spec 中的可用区缺失,恢复服务器将会出错。

用例

作为管理员/用户,我希望在执行恢复已挂载并卸载的服务器时指定可用区。

提议的变更

为恢复已挂载服务器(unshelve Action)API 添加一个新的微版本,以支持指定可用区来恢复已挂载的服务器。

如果操作员在 nova.conf 的 [cinder] 组中配置了 cross_az_attach=False [3],则如果指定的可用区与附加到服务器的卷不匹配,服务器创建流程将失败。恢复也应该以相同的原因失败,但要确定这一点,我们需要迭代(通过 BDM)附加到服务器的卷,并确定它们的可用区是否与用户指定的可用区匹配,如果不匹配,则应使恢复请求失败,并返回 badRequest(400) 响应,这需要在 API 中作为边缘情况进行检查。

availability_zone 属性添加到 unshelve Action 请求体中。

unshelve 的 availability_zone 参数只是一个可用区,而不是在服务器创建期间可用的 ZONE:HOST:NODE(仅限管理员)格式,当指定 HOST 和/或 NODE 时,将强制绕过调度器。

备选方案

从已挂载快照镜像在另一个可用区创建服务器(或者干脆避免挂载/恢复,而是快照服务器,删除它,然后使用新的可用区创建)。缺点是您将丢失连接到先前服务器的端口/卷。

另一种选择是,可用区重命名/删除代码可以更改为防止在创建了已挂载并卸载服务器的可用区时重命名/删除该可用区。然而,这将不可扩展,因为我们需要获取和反序列化每个 SHELVED_OFFLOADED 服务器的每个 RequestSpec,只是为了查看它是否具有匹配的可用区。换句话说,由于 RequestSpec 是数据库中的序列化 json 字符串,因此我们无法执行简单的 DB 查询来有效地获取此信息。

数据模型影响

REST API 影响

  • URL
    • /v2.1/servers/{server_id}/action

  • 请求方法
    • POST

可用区数据可以添加到请求负载中

{
    "unshelve": {
        "availability_zone": 'beijing'
    }
}

availability_zone 字段是可选的。

如果服务器状态为 ‘SHELVED’ 而不是 ‘SHELVED_OFFLOADED’ 并且指定了可用区,API 将返回 badRequest(400) 响应,否则,如果我的服务器是在 AZ1 中创建的,我挂载了它(但尚未卸载),然后恢复并指定了 AZ2,但服务器最终没有进入 AZ2,此请求将被忽略,因为这将直接启动实例。因此,此更改仅支持服务器状态为 ‘SHELVED_OFFLOADED’ 的情况。

安全影响

通知影响

其他最终用户影响

python-novaclient 和 python-openstackclient 将被更新。

性能影响

其他部署者影响

开发人员影响

升级影响

实现

负责人

主要负责人

张斌

工作项

  • 为恢复已挂载服务器(unshelve Action)API 添加一个新的微版本

  • 添加相关测试

依赖项

测试

  • 添加相关的单元测试

  • 添加相关的功能测试

文档影响

添加提及在微版本之后恢复已挂载服务器的文档。

参考资料

历史

修订 :header-rows: 1

发布名称

描述

Train

引入