OpenStack 中如何应用 Host Aggregates 来更有效地分配硬件资源

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