主机聚合

主机聚合是一种在 OpenStack 云或 OpenStack 云的区域内,基于任意特征对主机进行分区划分的机制。管理员可能希望执行此操作的示例包括,一组主机具有额外的硬件或性能特征。

主机聚合最初是作为使用 Xen hypervisor 资源池的一种方式,但已被泛化为提供一种机制,允许管理员将键值对分配给机器组。每个节点可以有多个聚合,每个聚合可以有多个键值对,并且相同的键值对可以分配给多个聚合。可以使用此信息在调度器中启用高级调度,设置 Xen hypervisor 资源池或定义迁移的逻辑组。

主机聚合未显式暴露给用户。相反,管理员将 flavor 映射到主机聚合。管理员通过在主机聚合上设置元数据,并匹配 flavor 附加规范来执行此操作。然后,调度器会努力将用户对给定 flavor 的实例请求与具有相同键值对的元数据的 host aggregate 匹配。计算节点可以位于多个主机聚合中。可以通过在 xxx_weight_multiplier 聚合元数据中设置所需的值来控制每个聚合的基础权重乘数。

管理员可以选择将主机聚合作为 可用区 暴露。可用区与主机聚合不同,因为它们显式暴露给用户,并且主机只能位于单个可用区中。管理员可以配置默认可用区,当用户未指定可用区时,实例将在该可用区中进行调度。有关如何执行此操作的更多信息,请参阅 可用区

注意

不允许在可用区之间移动实例。如果将主机添加到聚合或从聚合中删除主机会导致实例在可用区之间移动,包括从或移动到默认 AZ,则该操作将被拒绝。管理员应首先从主机中排出实例,然后才能移动主机。

配置调度器以支持主机聚合

主机聚合的一个常见用例是,当您希望将实例调度到计算主机的子集时,因为它们具有特定功能。例如,如果您需要访问更快的磁盘 I/O,您可能希望允许用户请求具有 SSD 驱动器的计算主机,或者访问具有 GPU 卡的计算主机以利用 GPU 加速的代码。

要配置调度器以支持主机聚合,filter_scheduler.enabled_filters 配置选项必须包含 AggregateInstanceExtraSpecsFilter,以及调度器使用的其他过滤器。将以下行添加到运行 nova-scheduler 服务的机器上的 nova.conf 中,以启用主机聚合过滤,以及通常启用的其他过滤器

[filter_scheduler]
enabled_filters=...,AggregateInstanceExtraSpecsFilter

示例:指定具有 SSD 的计算主机

此示例配置 Compute 服务以启用用户请求具有固态驱动器 (SSD) 的节点。您在 nova 可用区中创建一个 fast-io 主机聚合,并将 ssd=true 键值对添加到聚合中。然后,您将 node1node2 计算节点添加到其中。

$ openstack aggregate create --zone nova fast-io
+-------------------+----------------------------+
| Field             | Value                      |
+-------------------+----------------------------+
| availability_zone | nova                       |
| created_at        | 2016-12-22T07:31:13.013466 |
| deleted           | False                      |
| deleted_at        | None                       |
| id                | 1                          |
| name              | fast-io                    |
| updated_at        | None                       |
+-------------------+----------------------------+

$ openstack aggregate set --property ssd=true 1
+-------------------+----------------------------+
| Field             | Value                      |
+-------------------+----------------------------+
| availability_zone | nova                       |
| created_at        | 2016-12-22T07:31:13.000000 |
| deleted           | False                      |
| deleted_at        | None                       |
| hosts             | []                         |
| id                | 1                          |
| name              | fast-io                    |
| properties        | ssd='true'                 |
| updated_at        | None                       |
+-------------------+----------------------------+

$ openstack aggregate add host 1 node1
+-------------------+--------------------------------------------------+
| Field             | Value                                            |
+-------------------+--------------------------------------------------+
| availability_zone | nova                                             |
| created_at        | 2016-12-22T07:31:13.000000                       |
| deleted           | False                                            |
| deleted_at        | None                                             |
| hosts             | [u'node1']                                       |
| id                | 1                                                |
| metadata          | {u'ssd': u'true', u'availability_zone': u'nova'} |
| name              | fast-io                                          |
| updated_at        | None                                             |
+-------------------+--------------------------------------------------+

$ openstack aggregate add host 1 node2
+-------------------+--------------------------------------------------+
| Field             | Value                                            |
+-------------------+--------------------------------------------------+
| availability_zone | nova                                             |
| created_at        | 2016-12-22T07:31:13.000000                       |
| deleted           | False                                            |
| deleted_at        | None                                             |
| hosts             | [u'node1', u'node2']                             |
| id                | 1                                                |
| metadata          | {u'ssd': u'true', u'availability_zone': u'nova'} |
| name              | fast-io                                          |
| updated_at        | None                                             |
+-------------------+--------------------------------------------------+

使用 openstack flavor create 命令创建 ID 为 6、8 GB 内存、80 GB 根磁盘和 4 个 vCPU 的 ssd.large flavor。

$ openstack flavor create --id 6 --ram 8192 --disk 80 --vcpus 4 ssd.large
+----------------------------+-----------+
| Field                      | Value     |
+----------------------------+-----------+
| OS-FLV-DISABLED:disabled   | False     |
| OS-FLV-EXT-DATA:ephemeral  | 0         |
| disk                       | 80        |
| id                         | 6         |
| name                       | ssd.large |
| os-flavor-access:is_public | True      |
| ram                        | 8192      |
| rxtx_factor                | 1.0       |
| swap                       |           |
| vcpus                      | 4         |
+----------------------------+-----------+

创建 flavor 后,指定与主机聚合上的键值对匹配的一个或多个键值对,范围为 aggregate_instance_extra_specs。在这种情况下,即 aggregate_instance_extra_specs:ssd=true 键值对。使用 openstack flavor set 命令设置 flavor 上的键值对。

$ openstack flavor set \
    --property aggregate_instance_extra_specs:ssd=true ssd.large

设置后,您应该看到 ssd.large flavor 的 extra_specs 属性填充了键为 ssd 且相应值为 true

$ openstack flavor show ssd.large
+----------------------------+-------------------------------------------+
| Field                      | Value                                     |
+----------------------------+-------------------------------------------+
| OS-FLV-DISABLED:disabled   | False                                     |
| OS-FLV-EXT-DATA:ephemeral  | 0                                         |
| disk                       | 80                                        |
| id                         | 6                                         |
| name                       | ssd.large                                 |
| os-flavor-access:is_public | True                                      |
| properties                 | aggregate_instance_extra_specs:ssd='true' |
| ram                        | 8192                                      |
| rxtx_factor                | 1.0                                       |
| swap                       |                                           |
| vcpus                      | 4                                         |
+----------------------------+-------------------------------------------+

现在,当用户请求具有 ssd.large flavor 的实例时,调度器仅考虑具有 ssd=true 键值对的主机。在本例中,这些是 node1node2

Placement 中的聚合

聚合也存在于 placement 中,并且与 nova 中的主机聚合不同。这些聚合纯粹定义为相关资源提供程序的分组。由于 nova 中的计算节点在 placement 中表示为资源提供程序,因此它们也可以添加到 placement 聚合中。例如,使用 openstack hypervisor list 获取计算节点的 UUID,并使用 openstack resource provider aggregate set 将其添加到 placement 中的聚合。

$ openstack --os-compute-api-version=2.53 hypervisor list
+--------------------------------------+---------------------+-----------------+-----------------+-------+
| ID                                   | Hypervisor Hostname | Hypervisor Type | Host IP         | State |
+--------------------------------------+---------------------+-----------------+-----------------+-------+
| 815a5634-86fb-4e1e-8824-8a631fee3e06 | node1               | QEMU            | 192.168.1.123   | up    |
+--------------------------------------+---------------------+-----------------+-----------------+-------+

$ openstack --os-placement-api-version=1.2 resource provider aggregate set \
    --aggregate df4c74f3-d2c4-4991-b461-f1a678e1d161 \
    815a5634-86fb-4e1e-8824-8a631fee3e06

一些调度过滤操作可以由 placement 执行,以提高速度和效率。

注意

从 nova 18.0.0 开始,nova-api 服务尝试自动镜像计算主机与聚合的关联,当管理员将主机添加到/从 nova 主机聚合中时。这应该可以消除使用 openstack resource provider aggregate set CLI 调用手动创建这些关联记录的需要。

Placement 中的租户隔离

为了使用 placement 隔离租户,必须存在与您要用于隔离的 nova 主机聚合的成员资格和 UUID 匹配的 placement 聚合。用于控制此功能的 AggregateMultiTenancyIsolation 过滤器中的聚合元数据中的相同键模式,通过将 scheduler.limit_tenants_to_placement_aggregate 设置为 True 来启用。

$ openstack --os-compute-api-version=2.53 aggregate create myagg
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| availability_zone | None                                 |
| created_at        | 2018-03-29T16:22:23.175884           |
| deleted           | False                                |
| deleted_at        | None                                 |
| id                | 4                                    |
| name              | myagg                                |
| updated_at        | None                                 |
| uuid              | 019e2189-31b3-49e1-aff2-b220ebd91c24 |
+-------------------+--------------------------------------+

$ openstack --os-compute-api-version=2.53 aggregate add host myagg node1
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| availability_zone | None                                 |
| created_at        | 2018-03-29T16:22:23.175884           |
| deleted           | False                                |
| deleted_at        | None                                 |
| hosts             | [u'node1']                           |
| id                | 4                                    |
| name              | myagg                                |
| updated_at        | None                                 |
| uuid              | 019e2189-31b3-49e1-aff2-b220ebd91c24 |
+-------------------+--------------------------------------+

$ openstack project list -f value | grep 'demo'
9691591f913949818a514f95286a6b90 demo

$ openstack aggregate set \
    --property filter_tenant_id=9691591f913949818a514f95286a6b90 myagg

$ openstack --os-placement-api-version=1.2 resource provider aggregate set \
    --aggregate 019e2189-31b3-49e1-aff2-b220ebd91c24 \
    815a5634-86fb-4e1e-8824-8a631fee3e06

请注意,filter_tenant_id 元数据键可以选择性地用任何字符串后缀化,以用于多个租户,例如 filter_tenant_id3=$tenantid

用法

主机聚合的许多配置都由 API 或命令行客户端驱动。例如,要创建一个新的聚合并将主机添加到其中,请使用 openstack 客户端运行

$ openstack aggregate create my-aggregate
$ openstack aggregate add host my-aggregate my-host

要列出所有聚合并显示有关特定聚合的信息,请运行

$ openstack aggregate list
$ openstack aggregate show my-aggregate

要设置和取消设置聚合上的属性,请运行

$ openstack aggregate set --property pinned=true my-aggregrate
$ openstack aggregate unset --property pinned my-aggregate

要重命名聚合,请运行

$ openstack aggregate set --name my-awesome-aggregate my-aggregate

要从聚合中删除主机并删除聚合,请运行

$ openstack aggregate remove host my-aggregate my-host
$ openstack aggregate delete my-aggregate

有关更多信息,请参阅 OpenStack 客户端文档

配置

除了由 API 和客户端启用的 CRUD 操作之外,以下配置选项可用于配置主机聚合和相关可用区功能的工作方式

最后,如前所述,有许多主机聚合特定的调度器过滤器。这些是

以下配置选项适用于调度器配置

镜像缓存

聚合可以用作将多个计算节点定位为请求预缓存镜像以提高性能的一种方式。

注意

某些 virt 驱动程序提供镜像缓存支持,通过将基本镜像保存在磁盘缓存中来提高相同镜像的第二次及后续启动的性能。这避免了从 Glance 重新下载镜像的需要,从而减少了网络利用率和启动延迟。镜像预缓存是提前将镜像填充到缓存中的行为,以提高首次启动的性能。

假设名为 my-aggregate 的聚合,其中应预缓存两个镜像,则运行以下命令将启动请求

$ nova aggregate-cache-images my-aggregate image1 image2

请注意,镜像预缓存以异步方式以尽力而为的方式进行。在运行命令时,会检查提供的镜像和聚合,但在进程运行之前,不会检查计算节点是否支持镜像缓存。每个计算节点都会记录进度和结果,并且该进程会发送 aggregate.cache_images.startaggregate.cache_images.progressaggregate.cache_images.end 通知,这些通知可能对外部监控操作很有用。

参考