1.nova介紹
Nova 是 OpenStack 最核心的服務,負責維護和管理雲環境的計算資源。OpenStack 作為 IaaS 的雲操作系統,虛擬機生命周期管理也就是通過 Nova 來實現的。
1)用途與功能 :
(1)實例生命周期管理
(2)管理計算資源
(3)網絡和認證管理
(4)REST 風格的 API
(5)異步的一致性通信
(6)Hypervisor 透明:支持Xen,XenServer/XCP,KVM, UML, VMware vSphere and Hyper-V
在上圖中可以看到,Nova 處於 Openstak 架構的中心,其他組件都為 Nova 提供支持: Glance 為 VM 提供 image Cinder 和 Swift 分別為 VM 提供塊存儲和對象存儲 Neutron 為 VM 提供網絡連接。
2)Nova 架構如下:
2.Nova 組件
nova架構比較復雜,包含很多組件。 這些組件以子服務(后台 deamon 進程)的形式運行,可以分為以下幾類:
1)API
nova-api
是整個 Nova 組件的門戶,接收和響應客戶的 API 調用。所有對 Nova 的請求都首先由 nova-api 處理。nova-api 向外界暴露若干 HTTP REST API 接口 在 keystone 中我們可以查詢 nova-api 的 endponits。
客戶端就可以將請求發送到 endponits 指定的地址,向 nova-api 請求操作。 當然,作為最終用戶的我們不會直接發送 Rest AP I請求。 OpenStack CLI,Dashboard 和其他需要跟 Nova 交換的組件會使用這些 API。
Nova-api 對接收到的 HTTP API 請求會做如下處理:
(1)檢查客戶端傳入的參數是否合法有效
(2)調用 Nova 其他子服務的處理客戶端 HTTP 請求
(3)格式化 Nova 其他子服務返回的結果並返回給客戶端
nova-api 接收哪些請求?
簡單的說,只要是跟虛擬機生命周期相關的操作,nova-api 都可以響應。 大部分操作都可以在 Dashboard 上找到。打開Instance管理界面
除了提供 OpenStack 自己的API,nova-api 還支持 Amazon EC2 API。 也就是說,如果客戶以前使用 Amazon EC2,並且用 EC2 的 API 開發了些工具來管理虛機,那么如果現在要換成 OpenStack,這些工具可以無縫遷移到 OpenStack,因為 nova-api 兼容 EC2 API,無需做任何修改。
2)Compute Core
(1)nova-scheduler:
虛機調度服務,負責決定在哪個計算節點上運行虛機。創建 Instance 時,用戶會提出資源需求,例如 CPU、內存、磁盤各需要多少。OpenStack 將這些需求定義在 flavor 中,用戶只需要指定用哪個 flavor 就可以了。
可用的 flavor 在 System->Flavors 中管理。
下面介紹 nova-scheduler 是如何實現調度的。在 /etc/nova/nova.conf 中,nova 通過 driver=filter_scheduler 這個參數來配置 nova-scheduler。
driver=filter_scheduler
Filter scheduler
Filter scheduler 是 nova-scheduler 默認的調度器,調度過程分為兩步:
a.通過過濾器(filter)選擇滿足條件的計算節點(運行 nova-compute)
b.通過權重計算(weighting)選擇在最優(權重值最大)的計算節點上創建 Instance。
Nova 允許使用第三方 scheduler,配置 scheduler_driver 即可。 這又一次體現了OpenStack的開放性。Scheduler 可以使用多個 filter 依次進行過濾,過濾之后的節點再通過計算權重選出最適合的節點。
上圖是調度過程的一個示例:
a.最開始有 6 個計算節點 Host1-Host6
b.通過多個 filter 層層過濾,Host2 和 Host4 沒有通過,被刷掉了
c.Host1,Host3,Host5,Host6 計算權重,結果 Host5 得分最高,最終入選
當 Filter scheduler 需要執行調度操作時,會讓 filter 對計算節點進行判斷,filter 返回 True 或 False。經過前面一堆 filter 的過濾,nova-scheduler 選出了能夠部署 instance 的計算節點。
如果有多個計算節點通過了過濾,那么最終選擇哪個節點呢?
Scheduler 會對每個計算節點打分,得分最高的獲勝。 打分的過程就是 weight,翻譯過來就是計算權重值,那么 scheduler 是根據什么來計算權重值呢?
目前 nova-scheduler 的默認實現是根據計算節點空閑的內存量計算權重值: 空閑內存越多,權重越大,instance 將被部署到當前空閑內存最多的計算節點上。
(2)nova-compute:
nova-compute 是管理虛機的核心服務,在計算節點上運行。通過調用Hypervisor API實現節點上的 instance的生命周期管理。 OpenStack 對 instance 的操作,最后都是交給 nova-compute 來完成的。 nova-compute 與 Hypervisor 一起實現 OpenStack 對 instance 生命周期的管理。
Openstack中虛機默認的保存路徑在:/var/lib/nova/instances
通過Driver架構支持多種Hypervisor
Hypervisor是計算節點上跑的虛擬化管理程序,虛機管理最底層的程序。 不同虛擬化技術提供自己的 Hypervisor。 常用的 Hypervisor 有 KVM,Xen, VMWare 等。nova-compute 為這些 Hypervisor 定義了統一的接口,Hypervisor 只需要實現這些接口,就可以 Driver 的形式即插即用到 OpenStack 系統中。 下面是Nova Driver的架構示意圖:
(3)nova-conductor:
nova-compute 經常需要更新數據庫,比如更新和獲取虛機的狀態。 出於安全性和伸縮性的考慮,nova-compute 並不會直接訪問數據庫,而是將這個任務委托給 nova-conductor。
這樣做有兩個顯著好處:
a.更高的系統安全性
b.更好的系統伸縮性
3)Console Interface
nova-console: 用戶可以通過多種方式訪問虛機的控制台:
nova-novncproxy: 基於 Web 瀏覽器的 VNC 訪問
nova-spicehtml5proxy: 基於 HTML5 瀏覽器的 SPICE 訪問
nova-xvpnvncproxy: 基於 Java 客戶端的 VNC 訪問
nova-consoleauth: 負責對訪問虛機控制台請求提供 Token 認證
nova-cert: 提供 x509 證書支持
4)Database
Nova 會有一些數據需要存放到數據庫中,一般使用 MySQL。數據庫安裝在控制節點上。 Nova 使用命名為 “nova” 的數據庫。
5)Message Queue
在前面我們了解到 Nova 包含眾多的子服務,這些子服務之間需要相互協調和通信。為解耦各個子服務,Nova 通過 Message Queue 作為子服務的信息中轉站。 所以在架構圖上我們看到了子服務之間沒有直接的連線,是通過 Message Queue 聯系的。
OpenStack 默認是用 RabbitMQ 作為 Message Queue。 MQ 是 OpenStack 的核心基礎組件,我們后面也會詳細介紹。
3.Nova 組件如何協同工作
1)Nova 物理部署方案
前面大家已經看到 Nova 由很多子服務組成,我們也知道 OpenStack 是一個分布式系統,可以部署到若干節點上,那么接下來大家可能就會問:Nova 的這些服務在物理上應該如何部署呢?
對於 Nova,這些服務會部署在兩類節點上:計算節點和控制節點。
計算節點上安裝了 Hypervisor,上面運行虛擬機。 由此可知:
(1)只有 nova-compute 需要放在計算節點上。
(2)其他子服務則是放在控制節點上的。
下面我們可以看看實驗環境的具體部署情況。 通過在計算節點和控制節點上運行
ps -elf | grep nova 來查看運行的 nova 子服務
計算節點compute只運行了nova-compute子服務
控制節點controller運行了若干nova-*子服務
RabbitMQ 和 MySQL 也是放在控制節點上的。可能細心的同學已經發現我們的控制節點上也運行了 nova-compute。 這實際上也就意味着 devstack-controller 既是一個控制節點,同時也是一個計算節點,也可以在上面運行虛機。
這也向我們展示了 OpenStack 這種分布式架構部署上的靈活性: 可以將所有服務都放在一台物理機上,作為一個 All-in-One 的測試環境; 也可以將服務部署在多台物理機上,獲得更好的性能和高可用。
另外,也可以用 nova service-list 查看 nova-* 子服務都分布在哪些節點上
2)從虛機創建流程看 nova-* 子服務如何協同工作
從學習 Nova 的角度看,虛機創建是一個非常好的場景,涉及的 nova-* 子服務很全,下面是流程圖。
(1)客戶(可以是 OpenStack 最終用戶,也可以是其他程序)向 API(nova-api)發送請求:“幫我創建一個虛機”
(2)API 對請求做一些必要處理后,向 Messaging(RabbitMQ)發送了一條消息:“讓 Scheduler 創建一個虛機”
(3)Scheduler(nova-scheduler)從 Messaging 獲取到 API 發給它的消息,然后執行調度算法,從若干計算節點中選出節點 A
(4)Scheduler 向 Messaging 發送了一條消息:“在計算節點 A 上創建這個虛機”
(5)計算節點 A 的 Compute(nova-compute)從 Messaging 中獲取到 Scheduler 發給它的消息,然后在本節點的 Hypervisor 上啟動虛機。
(6)在虛機創建的過程中,Compute 如果需要查詢或更新數據庫信息,會通過 Messaging 向 Conductor(nova-conductor)發送消息,Conductor 負責數據庫訪問。
以上是創建虛機最核心的步驟, 這幾個步驟向我們展示了 nova-* 子服務之間的協作的方式,也體現了 OpenStack 整個系統的分布式設計思想,掌握這種思想對我們深入理解 OpenStack 會非常有幫助。
4.Nova 創建虛擬機詳細過程
1)界面或命令行通過RESTful API向keystone獲取認證信息。
2)keystone通過用戶請求認證信息,並生成auth-token返回給對應的認證請求。
3)界面或命令行通過RESTful API向nova-api發送一個boot instance的請求(攜帶auth-token)。
4)nova-api接受請求后向keystone發送認證請求,查看token是否為有效用戶和token。
5)keystone驗證token是否有效,如有效則返回有效的認證和對應的角色(注:有些操作需要有角色權限才能操作)。
6)通過認證后nova-api和數據庫通訊。
7)初始化新建虛擬機的數據庫記錄。
8)nova-api通過rpc.call向nova-scheduler請求是否有創建虛擬機的資源(Host ID)。
9)nova-scheduler進程偵聽消息隊列,獲取nova-api的請求。
10)nova-scheduler通過查詢nova數據庫中計算資源的情況,並通過調度算法計算符合虛擬機創建需要的主機。
11)對於有符合虛擬機創建的主機,nova-scheduler更新數據庫中虛擬機對應的物理主機信息。
12)nova-scheduler通過rpc.cast向nova-compute發送對應的創建虛擬機請求的消息。
13)nova-compute會從對應的消息隊列中獲取創建虛擬機請求的消息。
14)nova-compute通過rpc.call向nova-conductor請求獲取虛擬機消息。(Flavor)
15)nova-conductor從消息隊隊列中拿到nova-compute請求消息。
16)nova-conductor根據消息查詢虛擬機對應的信息。
17)nova-conductor從數據庫中獲得虛擬機對應信息。
18)nova-conductor把虛擬機信息通過消息的方式發送到消息隊列中。
19)nova-compute從對應的消息隊列中獲取虛擬機信息消息。
20)nova-compute通過keystone的RESTfull API拿到認證的token,並通過HTTP請求glance-api獲取創建虛擬機所需要鏡像。
21)glance-api向keystone認證token是否有效,並返回驗證結果。
22)token驗證通過,nova-compute獲得虛擬機鏡像信息(URL)。
23)nova-compute通過keystone的RESTfull API拿到認證k的token,並通過HTTP請求neutron-server獲取創建虛擬機所需要的網絡信息。
24)neutron-server向keystone認證token是否有效,並返回驗證結果。
25)token驗證通過,nova-compute獲得虛擬機網絡信息。
26)nova-compute通過keystone的RESTfull API拿到認證的token,並通過HTTP請求cinder-api獲取創建虛擬機所需要的持久化存儲信息。
27)cinder-api向keystone認證token是否有效,並返回驗證結果。
28)token驗證通過,nova-compute獲得虛擬機持久化存儲信息。
29)nova-compute根據instance的信息調用配置的虛擬化驅動來創建虛擬機。
4.搭建nova服務
1)准備環境
(1)准備數據庫
mysql -uroot -proot create database nova; create database nova_api; create database nova_cell0; grant all privileges on nova.* to 'nova'@'localhost' identified by 'NOVA_DBPASS'; grant all privileges on nova.* to 'nova'@'%' identified by 'NOVA_DBPASS'; grant all privileges on nova_api.* to 'nova'@'localhost' identified by 'NOVA_DBPASS'; grant all privileges on nova_api.* to 'nova'@'%' identified by 'NOVA_DBPASS'; grant all privileges on nova_cell0.* to 'nova'@'localhost' identified by 'NOVA_DBPASS'; grant all privileges on nova_cell0.* to 'nova'@'%' identified by 'NOVA_DBPASS';
(2)創建nova服務認證信息
創建nova用戶
openstack user create --domain default --password=nova nova +---------------------+----------------------------------+ | Field | Value | +---------------------+----------------------------------+ | domain_id | default | | enabled | True | | id | 38e13139c9f64cb2a67113ae10a122c0 | | name | nova | | options | {} | | password_expires_at | None | +---------------------+----------------------------------+
將用戶添加到admin角色
openstack role add --project service --user nova admin
創建nova服務
openstack service create --name nova --description "OpenStack Compute" compute +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | OpenStack Compute | | enabled | True | | id | cc4fe633c7624ed7931160b9a64d109d | | name | nova | | type | compute | +-------------+----------------------------------+
(3)創建compute子服務endpoints
openstack endpoint create --region RegionOne compute public http://node1:8774/v2.1 +--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | enabled | True | | id | b02ee4b19dc845b0b187e074063260f9 | | interface | public | | region | RegionOne | | region_id | RegionOne | | service_id | cc4fe633c7624ed7931160b9a64d109d | | service_name | nova | | service_type | compute | | url | http://node1:8774/v2.1 | +--------------+----------------------------------+ openstack endpoint create --region RegionOne compute internal http://node1:8774/v2.1 +--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | enabled | True | | id | c0dbab59b50c4dd2b737d5d74b249d5d | | interface | internal | | region | RegionOne | | region_id | RegionOne | | service_id | cc4fe633c7624ed7931160b9a64d109d | | service_name | nova | | service_type | compute | | url | http://node1:8774/v2.1 | +--------------+----------------------------------+ openstack endpoint create --region RegionOne compute admin http://node1:8774/v2.1 +--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | enabled | True | | id | 1af9cb4db4d94289b7bcf12aaad9df15 | | interface | admin | | region | RegionOne | | region_id | RegionOne | | service_id | cc4fe633c7624ed7931160b9a64d109d | | service_name | nova | | service_type | compute | | url | http://node1:8774/v2.1 | +--------------+----------------------------------+
(4)創建placement服務用戶
創建placement用戶
openstack user create --domain default --password=placement placement +---------------------+----------------------------------+ | Field | Value | +---------------------+----------------------------------+ | domain_id | default | | enabled | True | | id | be3b7751e32547a697b35586a5ccf19b | | name | placement | | options | {} | | password_expires_at | None | +---------------------+----------------------------------+
將用戶添加至service項目下並設置為role角色
openstack role add --project service --user placement admin
在服務目錄中創建Placement API 條目
openstack service create --name placement --description "Placement API" placement +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | Placement API | | enabled | True | | id | 37181622f66341a19bbc7210373de4f0 | | name | placement | | type | placement | +-------------+----------------------------------+
(5)創建Placement API服務的endpoints
openstack endpoint create --region RegionOne placement public http://node1:8778 +--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | enabled | True | | id | 78bb817c6c3348a790f357d862844130 | | interface | public | | region | RegionOne | | region_id | RegionOne | | service_id | 37181622f66341a19bbc7210373de4f0 | | service_name | placement | | service_type | placement | | url | http://node1:8778 | +--------------+----------------------------------+ openstack endpoint create --region RegionOne placement internal http://node1:8778 +--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | enabled | True | | id | 847c97fe122c4a588206900d47819f5e | | interface | internal | | region | RegionOne | | region_id | RegionOne | | service_id | 37181622f66341a19bbc7210373de4f0 | | service_name | placement | | service_type | placement | | url | http://node1:8778 | +--------------+----------------------------------+ openstack endpoint create --region RegionOne placement admin http://node1:8778 +--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | enabled | True | | id | 371a21ccb88e4e4ab1cc658b5326f35d | | interface | admin | | region | RegionOne | | region_id | RegionOne | | service_id | 37181622f66341a19bbc7210373de4f0 | | service_name | placement | | service_type | placement | | url | http://node1:8778 | +--------------+----------------------------------+
2)安裝和配置控制節點
(1)安裝軟件包
yum install openstack-nova-api openstack-nova-conductor \ openstack-nova-console openstack-nova-novncproxy \ openstack-nova-scheduler openstack-nova-placement-api
(2)編輯配置文件
vim /etc/nova/nova.conf [DEFAULT] my_ip=192.168.52.101 #本機IP use_neutron = True firewall_driver = nova.virt.firewall.NoopFirewallDriver enabled_apis=osapi_compute,metadata transport_url = rabbit://openstack:admin@node1 #連接至node1節點上的rabbitmq服務 ... [api] auth_strategy = keystone ... [api_database] connection = mysql+pymysql://nova:NOVA_DBPASS@node1/nova_api ... [database] connection = mysql+pymysql://nova:NOVA_DBPASS@node1/nova ... [glance] api_servers = http://node1:9292 ... [keystone_authtoken] auth_uri = http://node1:5000 auth_url = http://node1:35357 memcached_servers = node1:11211 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = nova password = nova ... [oslo_concurrency] lock_path=/var/lib/nova/tmp ... [placement] os_region_name = RegionOne auth_type = password auth_url = http://node1:35357/v3 project_name = service project_domain_name = Default username = placement password = placement user_domain_name = Default ... [vnc] enabled=true vncserver_listen=0.0.0.0 vncserver_proxyclient_address=$my_ip
或者用如下方法

cp /etc/nova/nova.conf /etc/nova/nova.conf.bak -a vim /etc/nova/nova.conf [DEFAULT] my_ip=192.168.52.101 use_neutron = True firewall_driver = nova.virt.firewall.NoopFirewallDriver enabled_apis=osapi_compute,metadata transport_url = rabbit://openstack:openstack@node1 [api] auth_strategy = keystone [api_database] connection = mysql+pymysql://nova:NOVA_DBPASS@node1/nova_api [barbican] [cache] [cells] [cinder] #os_region_name = RegionOne [cloudpipe] [conductor] [console] [consoleauth] [cors] [cors.subdomain] [crypto] [database] connection = mysql+pymysql://nova:NOVA_DBPASS@node1/nova [ephemeral_storage_encryption] [filter_scheduler] [glance] api_servers = http://node1:9292 [guestfs] [healthcheck] [hyperv] [image_file_url] [ironic] [key_manager] [keystone_authtoken] auth_uri = http://node1:5000 auth_url = http://node1:35357 memcached_servers = node1:11211 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = nova password = nova [libvirt] #virt_type=qemu [matchmaker_redis] [metrics] [mks] [neutron] #url = http://controller:9696 #auth_url = http://controller:35357 #auth_type = password #project_domain_name = default #user_domain_name = default #region_name = RegionOne #project_name = service #username = neutron #password = neutron #service_metadata_proxy = true #metadata_proxy_shared_secret = METADATA_SECRET [notifications] [osapi_v21] [oslo_concurrency] lock_path=/var/lib/nova/tmp [oslo_messaging_amqp] [oslo_messaging_kafka] [oslo_messaging_notifications] [oslo_messaging_rabbit] [oslo_messaging_zmq] [oslo_middleware] [oslo_policy] [pci] [placement] os_region_name = RegionOne auth_type = password auth_url = http://node1:35357/v3 project_name = service project_domain_name = Default username = placement password = placement user_domain_name = Default [quota] [rdp] [remote_debug] [scheduler] [serial_console] [service_user] [spice] [ssl] [trusted_computing] [upgrade_levels] [vendordata_dynamic_auth] [vmware] [vnc] enabled=true vncserver_listen=$my_ip vncserver_proxyclient_address=$my_ip #novncproxy_base_url = http://172.16.254.63:6080/vnc_auto.html [workarounds] [wsgi] [xenserver] [xvp]
(3)啟用對Placement API的訪問
vim /etc/httpd/conf.d/00-nova-placement-api.conf <Directory /usr/bin> <IfVersion >= 2.4> Require all granted </IfVersion> <IfVersion < 2.4> Order allow,deny Allow from all </IfVersion> </Directory> 重啟httpd服務 systemctl restart httpd
(4)同步數據庫
su -s /bin/sh -c "nova-manage api_db sync" nova su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova bce5684e-a50a-42fe-96ec-339ebe67850d su -s /bin/sh -c "nova-manage db sync" nova
(5)驗證nova cell0與cell1是否正確注冊
nova-manage cell_v2 list_cells
+-------+--------------------------------------+
| Name | UUID |
+-------+--------------------------------------+
| cell0 | 00000000-0000-0000-0000-000000000000 |
| cell1 | bce5684e-a50a-42fe-96ec-339ebe67850d |
+-------+--------------------------------------+
(6)啟動nova自服務
systemctl start openstack-nova-api.service \ openstack-nova-consoleauth.service openstack-nova-scheduler.service \ openstack-nova-conductor.service openstack-nova-novncproxy.service systemctl enable openstack-nova-api.service \ openstack-nova-consoleauth.service openstack-nova-scheduler.service \ openstack-nova-conductor.service openstack-nova-novncproxy.service
3)安裝和配置計算節點
(1)安裝軟件包
yum install openstack-nova-compute -y 解決依賴 qemu-img-ev-2.9.0-16.el7_4.8.1.x86_64.rpm qemu-kvm-ev-2.9.0-16.el7_4.8.1.x86_64.rpm qemu-kvm-common-ev-2.9.0-16.el7_4.8.1.x86_64.rpm
(2)編輯配置文件
[DEFAULT] my_ip=192.168.52.102 use_neutron = True firewall_driver = nova.virt.firewall.NoopFirewallDriver enabled_apis=osapi_compute,metadata transport_url = rabbit://openstack:admin@node1 [api] auth_strategy = keystone [glance] api_servers = http://node1:9292 [keystone_authtoken] auth_uri = http://node1:5000 auth_url = http://node1:35357 memcached_servers = node1:11211 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = nova password = nova [libvirt] virt_type=qemu [oslo_concurrency] lock_path=/var/lib/nova/tmp [placement] os_region_name = RegionOne auth_type = password auth_url = http://node1:35357/v3 project_name = service project_domain_name = Default username = placement password = placement user_domain_name = Default [vnc] enabled=true vncserver_listen=0.0.0.0 vncserver_proxyclient_address=$my_ip novncproxy_base_url = http://192.168.52.101:6080/vnc_auto.html
或者用如下方法

cp /etc/nova/nova.conf /etc/nova/nova.conf.bak -a vim /etc/nova/nova.conf [DEFAULT] my_ip=192.168.52.102 use_neutron = True firewall_driver = nova.virt.firewall.NoopFirewallDriver enabled_apis=osapi_compute,metadata transport_url = rabbit://openstack:openstack@node1 [api] auth_strategy = keystone [api_database] #connection = mysql+pymysql://nova:NOVA_DBPASS@node1/nova_api [barbican] [cache] [cells] [cinder] #os_region_name = RegionOne [cloudpipe] [conductor] [console] [consoleauth] [cors] [cors.subdomain] [crypto] [database] #connection = mysql+pymysql://nova:NOVA_DBPASS@node1/nova [ephemeral_storage_encryption] [filter_scheduler] [glance] api_servers = http://node1:9292 [guestfs] [healthcheck] [hyperv] [image_file_url] [ironic] [key_manager] [keystone_authtoken] auth_uri = http://node1:5000 auth_url = http://node1:35357 memcached_servers = node1:11211 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = nova password = nova [libvirt] virt_type=qemu [matchmaker_redis] [metrics] [mks] [neutron] #url = http://controller:9696 #auth_url = http://controller:35357 #auth_type = password #project_domain_name = default #user_domain_name = default #region_name = RegionOne #project_name = service #username = neutron #password = neutron #service_metadata_proxy = true #metadata_proxy_shared_secret = METADATA_SECRET [notifications] [osapi_v21] [oslo_concurrency] lock_path=/var/lib/nova/tmp [oslo_messaging_amqp] [oslo_messaging_kafka] [oslo_messaging_notifications] [oslo_messaging_rabbit] [oslo_messaging_zmq] [oslo_middleware] [oslo_policy] [pci] [placement] os_region_name = RegionOne auth_type = password auth_url = http://node1:35357/v3 project_name = service project_domain_name = Default username = placement password = placement user_domain_name = Default [quota] [rdp] [remote_debug] [scheduler] [serial_console] [service_user] [spice] [ssl] [trusted_computing] [upgrade_levels] [vendordata_dynamic_auth] [vmware] [vnc] enabled=true vncserver_listen=0.0.0.0 vncserver_proxyclient_address=$my_ip novncproxy_base_url = http://192.168.52.101:6080/vnc_auto.html [workarounds] [wsgi] [xenserver] [xvp]
(3)啟動服務
systemctl enable libvirtd.service openstack-nova-compute.service systemctl start libvirtd.service openstack-nova-compute.service 若服務無法啟動則運行yum update librbd1將依賴升級
(4)將計算節點添加至cell數據庫
openstack hypervisor list
+----+---------------------+-----------------+----------------+-------+
| ID | Hypervisor Hostname | Hypervisor Type | Host IP | State |
+----+---------------------+-----------------+----------------+-------+
| 1 | node2 | QEMU | 192.168.52.102 | up |
| 2 | node1 | QEMU | 192.168.52.101 | up |
| 3 | node3 | QEMU | 192.168.52.103 | up |
+----+---------------------+-----------------+----------------+-------+
(5)發現計算節點主機
su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova Found 2 cell mappings. Skipping cell0 since it does not contain hosts. Getting compute nodes from cell 'cell1': bce5684e-a50a-42fe-96ec-339ebe67850d Found 3 computes in cell: bce5684e-a50a-42fe-96ec-339ebe67850d Checking host mapping for compute host 'node2': 9d86a74a-ee96-420c-91b4-0ce04072fdf6 Checking host mapping for compute host 'node1': 43826acf-3698-4d77-9577-99e4b1072ac7 Checking host mapping for compute host 'node3': c4e3caa1-134d-48de-a844-7343609c3f54
(6)設置自動發現主機
vim /etc/nova/nova.conf:
[scheduler]
discover_hosts_in_cells_interval = 300
4)查看nova服務運行情況
nova service-list
+----+------------------+-------+----------+---------+-------+----------------------------+-----------------+
| Id | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason |
+----+------------------+-------+----------+---------+-------+----------------------------+-----------------+
| 1 | nova-scheduler | node1 | internal | enabled | up | 2019-07-31T11:24:40.000000 | - |
| 2 | nova-consoleauth | node1 | internal | enabled | up | 2019-07-31T11:24:32.000000 | - |
| 3 | nova-conductor | node1 | internal | enabled | up | 2019-07-31T11:24:40.000000 | - |
| 7 | nova-compute | node2 | nova | enabled | up | 2019-07-31T11:24:38.000000 | - |
| 8 | nova-compute | node1 | nova | enabled | up | 2019-07-31T11:24:36.000000 | - |
| 9 | nova-compute | node3 | nova | enabled | up | 2019-07-31T11:24:40.000000 | - |
+----+------------------+-------+----------+---------+-------+----------------------------+-----------------+