本文将要介绍如何应用 OpenStack 中 Host Aggregates 的机制来更为有效地分配 nova computes 节点上的硬件资源,从而达到 OpenStack 的用户能够合理地选择特定的 computes 节点,来创建符合自己需求的虚拟机。Host Aggregates 最先出现在 OpenStack Grizzly 的版本中,是在 OpenStack 的 Regions 和 Availability Zones 之后被提出来,并建立于 Availability Zones 基础之上更进一步划分 computes 节点物理资源的一种机制。
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. 在具有相同物理特性的 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 项后面。
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。
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), 虚拟机就应该成功在此创建。
1. 检查虚拟机“high-memory-vm”的状态并确定是否建在了符合需求的 compute 节点上
[root@tor01ops001ccz048 nova]# 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@tor01ops001ccz048 nova]# 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 节点上。