简介
本文将要介绍如何应用 OpenStack 中 Host Aggregates 的机制来更为有效地分配 nova computes 节点上的硬件资源,从而达到 OpenStack 的用户能够合理地选择特定的 computes 节点,来创建符合自己需求的虚拟机。Host Aggregates 最先出现在 OpenStack Grizzly 的版本中,是在 OpenStack 的 Regions 和 Availability Zones 之后被提出来,并建立于 Availability Zones 基础之上更进一步划分 computes 节点物理资源的一种机制。
Host Aggregates 与 Availability Zones 定义上的区别
Availability Zones 通常是对 computes 节点上的资源在小的区域内进行逻辑上的分组和隔离。例如在同一个数据中心,我们可以将 Availability Zones 规划到不同的机房,或者在同一机房的几个相邻的机架,从而保障如果某个 Availability Zone 的节点发生故障(如供电系统或网络),而不影响其他的 Availability Zones 上节点运行的虚拟机,通过这种划分来提高 OpenStack 的可用性。目前 OpenStack 默认的安装是把所有的 computes 节点划分到 nova 的 Availability Zone 上,但我们可以通过对 nova.conf 文件的配置来定义不同的 Availability zones。
Host Aggregates 是在 Availability Zones 的基础上更进一步地进行逻辑的分组和隔离。例如我们可以根据不同的 computes 节点的物理硬件配置将具有相同共性的物理资源规划在同一 Host Aggregate 之下,或者根据用户的具体需求将几个 computes 节点规划在具有相同用途的同一 Host Aggregate 之下,通过这样的划分有利于提高 OpenStack 资源的使用效率。Host Aggregates 可以通过 nova client 或 API 来创建和配置。下面以 nova client 的命令行方式来配置 Host Aggregates。
图 1.Availability Zones 与 Host Aggregates 的关系
根据实际的物理资源在 OpenStack 环境中创建 Host Aggregates
1. 在具有相同物理特性的 computes 节点上创建 Host Aggregate, 比如下面将具有高内存的 computes 节点规划为一组,并将 Host Aggregate 命名为“high-memory-agg”。
[root@controller ~]# nova aggregate-create high-memory-agg high-memory-az
+----+-----------------+-------------------+-------+------------------------------------+
| Id | Name | Availability Zone | Hosts | Metadata |
+----+-----------------+-------------------+-------+------------------------------------+
| 3 | high-memory-agg | high-memory-az | | 'availability_zone=high-memory-az' |
+----+-----------------+-------------------+-------+------------------------------------+
如果没有指定 Availability Zone, OpenStack 会将 Host Aggregate 建在默认的 Availability Zone 下面(如 nova),否则会根据指定的名字来判断是否创建新的 Availability Zone 或使用已经存在的 Availability Zone,同时在此之下创建 Host Aggregate。
2. 设置对应的 Host Aggregate 的 metadata,将具有高内存配置的 computes 节点的 Host aggregate 的 metadata 设置成“HW=high-memory”。
[root@controller ~]# nova aggregate-set-metadata high-memory-agg HW=high-memory
Metadata has been successfully updated for aggregate 3.
+----+-----------------+-------------------+-------+-------------------------------------------------+
| Id | Name | Availability Zone | Hosts | Metadata |
+----+-----------------+-------------------+-------+--------------------------------------------- ---+
| 3 | high-memory-agg | high-memory-az | | 'HW=high-memory', 'availability_zone=high-memory-az' |
+----+-----------------+-------------------+-------+--------------------------------------------- ---+
3. 设置 flavor 的 extra_specs 的参数,保持这个参数与 Host aggregate 的 metadata 参数配置一致。
[root@controller ~]# nova flavor-key High_Memory_test set HW=high-memory
[root@controller ~]# nova flavor-show High_Memory_test
+----------------------------+-----------------------+
| Property | Value |
+----------------------------+-----------------------+
| OS-FLV-DISABLED:disabled | False |
| OS-FLV-EXT-DATA:ephemeral | 20 |
| disk | 60 |
| extra_specs | {"HW": "high-memory"} |
…
+----------------------------+-----------------------+
4. 将 AggregateInstanceExtraSpecsFilter 添加到所有 controller 节点的 nova.conf 配置文件的 scheduler_default_filter 项后面。
根据实际的用户需求在 OpenStack 环境中创建 Host Aggregates
1. 根据用户需求,在一类 computes 节点上创建 Host aggregate。比如用户希望将 CPU 的 overcommit rate 为 1:5 的 computes 节点分配给开发团队使用。
[root@controller ~]# nova aggregate-create dev-agg dev-az
+----+---------+-------------------+-------+----------------------------+
| Id | Name | Availability Zone | Hosts | Metadata |
+----+---------+-------------------+-------+----------------------------+
| 6 | dev-agg | dev-az | | 'availability_zone=dev-az' |
+----+---------+-------------------+-------+----------------------------+
这里的 Host Aggregate 的名称“dev-agg”需要与 Availability Zone 的名称“dev-az”建立一一对应的关系,保证以后创建虚拟机时指定 Availability Zone 会创建到对应的 Host Aggregate 下。
2. 设置对应的 Host Aggregate 的 metadata,由于用户需求是 CPU 的 overcommit rate 为 1:5,将 metadata 设置为“cpu_allocation_ratio=5”。
[root@controller ~]# nova aggregate-set-metadata dev-agg cpu_allocation_ratio=5
Metadata has been successfully updated for aggregate 6.
+----+---------+-------------------+-------+------------------------------------------------------+
| Id | Name | Availability Zone | Hosts | Metadata |
+----+---------+-------------------+-------+------------------------------------------------------+
| 6 | dev-agg | dev-az | | 'availability_zone=dev-az', 'cpu_allocation_ratio=5' |
+----+---------+-------------------+-------+------------------------------------------------------+
如果用户需要改变 memory 或者是 disk 的 overcommit rate,这里也可以设置对应的 metadata,如 ram_allocation_ratio,disk_allocation_ratio。在创建虚拟机,nova scheduler 会根据当前 Host Aggregate 的 metadata 上设定 ratio 做筛选条件来创建,如果没有找到 metadata,会使用全局的 ratio 来做筛选条件,全局的 ratio 参数配置在 nova.conf 文件里。
3. 将对应 filters 添加到所有 controller 节点的 nova.conf 配置文件的 scheduler_default_filter 项后面,如 AggregateCoreFilter,AggregateRamFilter 和 AggregateDiskFilter。
将相应的 nova compute 节点添加到 Host Aggregates 中,并创建虚拟机
1. 将 computes 节点上的物理机添加到对应的 Host Aggregates 里。
[root@controller ~]# nova aggregate-add-host high-memory-agg kvm001
Host kvm001 has been successfully added for aggregate 3
+----+-----------------+-------------------+---------------------+--------------------------------------+
| Id | Name | Availability Zone | Hosts | Metadata |
+----+-----------------+-------------------+---------------------+--------------------------------------+
| 3 | high-memory-agg | high-memory-az | 'kvm001' | 'HW=high-memory', 'availability_zone=high-memory-az'|
+----+-----------------+-------------------+---------------------+--------------------------------------+
[root@controller ~]# nova aggregate-add-host dev-agg kvm002
Host kvm002 has been successfully added for aggregate 6
+----+---------+-------------------+---------------------+--------------------------------------------+
| Id | Name | Availability Zone | Hosts | Metadata |
+----+---------+-------------------+---------------------+-------------------------------------------+
| 6 | dev-agg | dev-az | 'kvm002' | 'availability_zone=dev-az', 'cpu_allocation_ratio=5' |
+----+---------+-------------------+---------------------+------------------------------------------+
2. 重启所有 controller 节点上的 nova-api 服务,确保新添加到 nova.conf 的 Filters 生效。
3. 在对应的 Host Aggregates 上创建虚拟机。
[root@controller ~]# nova boot high-memory-vm --image <image-id> --flavor High_Memory_test
由于 flavor“High_Memory_test”已经与 Host Aggregate“high-memory-agg”建立 了关联,因此新建的虚拟机“high-memory-vm”应该建在这个 Host Aggregate 下,而这个 Host aggregate 只加了一个 compute 节点“kvm001”,如果“kvm001”在资源充足的条件下,虚拟机就应该成功在此创建。
[root@controller ~]# nova boot dev-vm --image <image-id> --flavor m1.medium --availability-zone dev-az
由于在创建虚拟机“dev-vm”时指定了 availability zone“dev-az”,而且“dev-az”下只存在 Host aggregate“dev-agg”,“dev-agg”上只添加了一个 compute 节点“kvm002”,因此在“kvm002”在资源充足的条件下(CPU ratio=5), 虚拟机就应该成功在此创建。
验证虚拟机以及配置的 Host Aggregate Filters 是否满足用户需求
1. 检查虚拟机“high-memory-vm”的状态并确定是否建在了符合需求的 compute 节点上
[root@controller ~]# nova show high-memory-vm
+--------------------------------------+----------------------------------------------------------+
| Property | Value |
+--------------------------------------+----------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | high-memory-az |
| OS-EXT-SRV-ATTR:host | kvm001 |
| OS-EXT-SRV-ATTR:hypervisor_hostname | kvm001 |
… |
+--------------------------------------+----------------------------------------------------------+
2. 检查虚拟机“dev-vm”的状态并确定是否建在了符合需求的 compute 节点上
[root@controller ~]# nova show dev-vm
+--------------------------------------+----------------------------------------------------------+
| Property | Value |
+--------------------------------------+----------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | dev-az |
| OS-EXT-SRV-ATTR:host | kvm002 |
| OS-EXT-SRV-ATTR:hypervisor_hostname | kvm002 |
…
+--------------------------------------+----------------------------------------------------------+
结束语.
在具体使用 Host Aggregates 机制来分配 computes 节点资源时,我们可以综合考虑目前 OpenStack 环境里的物理资源和用户需求来灵活地配置 Host Aggregate 的 metadatas 以及 filters。由于一个 Availability Zone 可以同时包含多个 Host aggregates,每个 Host aggregate 又有可能配置不同的 metadatas,因此我们在创建虚拟机时也应该注意这点,不要将虚拟机创建到错误的 compute 节点上。