为创建服务器添加主机和超visor主机名标志

https://blueprints.launchpad.net/nova/+spec/add-host-and-hypervisor-hostname-flag-to-create-server

当管理员指定 forced_host/forced_node 来创建服务器时,nova 将绕过调度器过滤器。本规范建议在新的 REST API 微版本中添加两个新参数 hosthypervisor_hostname,作为指定的主机和/或节点来创建服务器,而不会绕过调度器过滤器。

问题描述

当管理员指定 forced_host/forced_node 来创建服务器时,nova 将绕过调度器过滤器。

  • 如果没有调度器过滤器,失败的实例可能会浪费精力尝试启动,因为由于网络提供程序、PCI 设备、NUMA 拓扑等原因,失败是不可避免的。

  • 我们可能会尝试声明主机上不可用的资源,和/或由于没有运行过滤器,我们没有传递任何资源声明的限制,从而无意中过度订阅主机。

用例

此更改为系统添加了以下用例

  • 管理员希望请求在指定计算主机和/或节点上创建服务器,并希望请求通过调度器过滤器进行验证,而不是强制执行。

提议的变更

  • hosthypervisor_hostname 添加到 REST API POST /servers

  • 添加新的策略 os_compute_api:servers:create:requested_destination,以限制 hosthypervisor_hostname 仅供管理员使用。

  • hosthypervisor_hostname 转换为 RequestSpec.requested_destination,它仍然通过调度器过滤器。

注意

我们仍然保留此新微版本中的旧机制 az:host:node,以便用户可以选择强制目标或请求目标,在服务器创建期间。

备选方案

存在一个名为 JsonFilter 的过滤器,默认情况下未使用。此过滤器允许使用简单的基于 JSON 的语法来选择主机。如果我们要指定名为“openstack-node”的主机,我们可以添加如下参数:--hint query='["=","$host","openstack-node"]'

除了此过滤器的文档中的警告外,如果它是可配置的,则可能并非在所有云中都存在,因此不能保证互操作性。

存在一个名为 AggregateInstanceExtraSpecsFilter 的过滤器,默认情况下未使用。此过滤器检查聚合元数据是否满足与实例类型关联的任何额外规范(没有范围或范围限定为 aggregate_instance_extra_specs)。如果我们要指定名为“openstack-node”的主机,我们可以创建一个名为“test-ag01”的聚合,其中包含主机“openstack-node”。然后,我们使用 host=openstack-node 设置此聚合的元数据。最后,我们创建一个 flavor 并设置此 flavor 的元数据,其中包含 aggregate_instance_extra_specs:host=openstack-node。因此,当我们选择 flavor 来创建实例时,所有实例都将在主机“openstack-node”上。

在这种情况下,为大型云中的每个主机/节点创建并固定到该聚合的聚合和 flavor 是不可管理的,并且还可能泄露有关云的部署详细信息,并且当有如此多的可用区来模拟这些聚合时,也会让用户感到困惑。这对于大型云中的此用例来说不是一个现实的选择。

数据模型影响

REST API 影响

在新的微版本中,将 hosthypervisor_hostname 标志添加到 API 中,两者都是可选的

  • POST /servers

{
    "server": {
        ...
        "host": "openstack-node",
        "hypervisor_hostname": "openstack-node"
    }
}

仅显示 server 的 body 数据 JSON schema 定义中的新参数

'host': parameter_types.hostname
'hypervisor_hostname': parameter_types.hostname

根据是否设置 hosthypervisor_hostname,操作如下

  • 如果在请求体中提供了 host,首先 Compute API 将检查是否可以从 DB 中获取此 host 对应的计算节点。如果不能,将向用户返回 HTTP 400 Bad Request

  • 如果在请求体中提供了 hypervisor_hostname,首先 Compute API 将检查是否可以从 DB 中获取此 hypervisor_hostname 对应的计算节点。如果不能,将向用户返回 HTTP 400 Bad Request

  • 如果在请求体中同时提供了 hosthypervisor_hostname,首先 Compute API 将检查是否可以从 DB 中获取 hosthypervisor_hostname 对应的计算节点。如果不能,将向用户返回 HTTP 400 Bad Request

注意

新的(host 和/或 hypervisor_hostname)和旧的(az:host:node)机制是互斥的。如果两者同时在同一个请求中指定,API 将返回 HTTP 400 Bad Request。

安全影响

通知影响

其他最终用户影响

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

性能影响

其他部署者影响

开发人员影响

升级影响

实现

负责人

主要负责人

朱博翔 (zhu.boxiang@99cloud.net)

工作项

  • 为此更改添加新的微版本。

依赖项

测试

  • 将提供功能和单元测试。

  • 将提供一些场景(在请求的主机和/或节点上创建服务器,然后将其移动 - 实时迁移、撤离、冷迁移和卸载 - 以确保它移动到另一个主机,并且不受原始请求目标的限制)。

文档影响

  • API 文档应更改为介绍此新功能。

参考资料

历史

修订版

发布名称

描述

Train

引入