OpenStack 中如何應用 Host Aggregates 來更有效地分配硬件資源
簡介
本文將要介紹如何應用 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@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 節點上。
來自: http://www.ibm.com/developerworks/cn/cloud/library/1604-openstack-host-aggregate/index.html?ca=drs-