nova計算服務

帥胤發表於2019-06-05

一、nova介紹:

  Nova 是 OpenStack 最核心的服務,負責維護和管理雲環境的計算資源。OpenStack 作為 IaaS 的雲作業系統,虛擬機器生命週期管理也就是通過 Nova 來實現的。計算資源只是記憶體跟cpu。

用途與功能 :

1、例項生命週期管理

2、管理計算資源

3、網路和認證管理

4、REST 風格的 API(擁有自己的AIP,Nova-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 提供網路連線。

Nova 架構如下: 

 

Nova 的架構比較複雜,包含很多元件。 這些元件以子服務(後臺 deamon 程式)的形式執行,可以分為以下幾類:

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 上找到。

連線介面、分離介面:類似於給虛擬機器分配第二個網路卡

編輯例項:給虛擬機器編輯他的名字,大小等等

連線卷、分離卷:給虛擬機器外接硬碟

更新後設資料:虛擬機器的屬組屬主

編輯安全組:類似於在虛擬機器外面給它加了一個防火牆

控制檯:開啟虛擬機器的操作介面

軟重啟例項:正常重啟

硬重啟例項:直接按電源重啟

 

  除了提供 OpenStack 自己的API,nova-api 還支援 Amazon EC2 API。 也就是說,如果客戶以前使用 Amazon EC2,並且用 EC2 的 API 開發了些工具來管理虛機,那麼如果現在要換成 OpenStack,這些工具可以無縫遷移到 OpenStack,因為 nova-api 相容 EC2 API,無需做任何修改。

Compute Core

<一>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 預設的排程器,排程過程分為兩步:

1.、通過過濾器(filter)選擇滿足條件的計算節點(執行 nova-compute)

2.、通過權重計算(weighting)選擇在最優(權重值最大)的計算節點上建立 Instance。

  Nova 允許使用第三方 scheduler,配置 scheduler_driver 即可。 這又一次體現了OpenStack的開放性。Scheduler 可以使用多個 filter 依次進行過濾,過濾之後的節點再通過計算權重選出最適合的節點。

 

上圖是排程過程的一個示例:

1、最開始有 6 個計算節點 Host1-Host6

2、 通過多個 filter 層層過濾,Host2 和 Host4 沒有通過,被刷掉了

3、Host1,Host3,Host5,Host6 計算權重,結果 Host5 得分最高,最終入選

  當 Filter scheduler 需要執行排程操作時,會讓 filter 對計算節點進行判斷,filter 返回 True 或 False。經過前面一堆 filter 的過濾,nova-scheduler 選出了能夠部署 instance 的計算節點。

如果有多個計算節點通過了過濾,那麼最終選擇哪個節點呢?

  Scheduler 會對每個計算節點打分,得分最高的獲勝。 打分的過程就是 weight,翻譯過來就是計算權重值,那麼 scheduler 是根據什麼來計算權重值呢? 

目前 nova-scheduler 的預設實現是根據計算節點空閒的記憶體量計算權重值: 空閒記憶體越多,權重越大,instance 將被部署到當前空閒記憶體最多的計算節點上。

<二>nova-compute:

  nova-compute 是管理虛機的核心服務,在計算節點上執行。通過呼叫Hypervisor API實現節點上的 instance的生命週期管理。 OpenStack 對 instance 的操作,最後都是交給 nova-compute 來完成的。 nova-compute 與 Hypervisor 一起實現 OpenStack 對 instance 生命週期的管理。

通過Driver架構支援多種Hypervisor

  Hypervisor是計算節點上跑的虛擬化管理程式,虛機管理最底層的程式。 不同虛擬化技術提供自己的 Hypervisor。 常用的 Hypervisor 有 KVM,Xen, VMWare 等。nova-compute 為這些 Hypervisor 定義了統一的介面,Hypervisor 只需要實現這些介面,就可以 Driver 的形式即插即用到 OpenStack 系統中。 下面是Nova Driver的架構示意圖:

 

<三>nova-conductor:

  nova-compute 經常需要更新資料庫,比如更新和獲取虛機的狀態。出於安全性和伸縮性的考慮,nova-compute 並不會直接訪問資料庫,而是將這個任務委託給 nova-conductor。

 

這樣做有兩個顯著好處:

1、更高的系統安全性

2、更好的系統伸縮性

Console Interface

nova-console: 使用者可以通過多種方式訪問虛機的控制檯:

nova-novncproxy: 基於 Web 瀏覽器的 VNC 訪問

nova-spicehtml5proxy: 基於 HTML5 瀏覽器的 SPICE 訪問

nova-xvpnvncproxy: 基於 Java 客戶端的 VNC 訪問

nova-consoleauth: 負責對訪問虛機控制檯請求提供 Token 認證

nova-cert: 提供 x509 證照支援

Database

Nova 會有一些資料需要存放到資料庫中,一般使用 MySQL。資料庫安裝在控制節點上。 Nova 使用命名為 “nova” 的資料庫。

Message Queue

  在前面我們瞭解到 Nova 包含眾多的子服務,這些子服務之間需要相互協調和通訊。為解耦各個子服務,Nova 通過 Message Queue 作為子服務的資訊中轉站。 所以在架構圖上我們看到了子服務之間沒有直接的連線,是通過 Message Queue 聯絡的。

 

OpenStack 預設是用 RabbitMQ 作為 Message Queue。 MQ 是 OpenStack 的核心基礎元件。

二、Nova 元件如何協同工作

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-* 子服務都分佈在哪些節點上

 

從虛機建立流程看 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 負責資料庫訪問。

7、以上是建立虛機最核心的步驟, 這幾個步驟向我們展示了 nova-* 子服務之間的協作的方式,也體現了 OpenStack 整個系統的分散式設計思想,掌握這種思想對我們深入理解 OpenStack 會非常有幫助。

nova服務部署

控制節點的操作

#第一步 登陸資料庫

mysql -u root -p

#建立nova資料

CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0; #認證的庫
#建立nova使用者,並讓此使用者可以本次和遠端可以訪問這三個庫

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.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova.* 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';
#退出

exit
#第二步 宣告變數環境

. admin-openrc
#建立nova使用者

openstack user create --domain default --password=nova nova
#把nova使用者設為管理員

openstack role add --project service --user nova admin
#建立nova服務

openstack service create --name nova \
  --description "OpenStack Compute" compute
#建立nova服務端點

openstack endpoint create --region RegionOne \
  compute public http://controller:8774/v2.1
openstack endpoint create --region RegionOne \
  compute internal http://controller:8774/v2.1
openstack endpoint create --region RegionOne \
  compute admin http://controller:8774/v2.1
#建立placement使用者,這個使用者是負責服務追蹤,就是我這個平臺資源使用多少,統計資源的使用量

openstack user create --domain default --password=placement placement
#把placement使用者設為管理員

openstack role add --project service --user placement admin
#建立placement這個服務

openstack service create --name placement --description "Placement API" placement
#建立placement服務端點

openstack endpoint create --region RegionOne placement public http://controller:8778
openstack endpoint create --region RegionOne placement internal http://controller:8778
openstack endpoint create --region RegionOne placement admin http://controller:8778
#第三步 下載nova所需服務

yum install openstack-nova-api -y
yum install openstack-nova-conductor -y 
yum install  openstack-nova-console -y
yum install openstack-nova-novncproxy  -y
yum install openstack-nova-scheduler -y
yum install openstack-nova-placement-api -y
#修改控制節點上的nova配置檔案

cd /etc/nova/
cp nova.conf nova.conf.bak
vim nova.conf
#清空所有配置段,貼上如下內容
[DEFAULT]
my_ip=#控制節點IP
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
enabled_apis=osapi_compute,metadata
transport_url = rabbit://openstack:admin@controller # rabbitmq的連線方式,不要寫錯他的使用者名稱密碼
 
[api]
auth_strategy = keystone
 
[api_database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/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@controller/nova
 
[ephemeral_storage_encryption]
 
[filter_scheduler]
 
[glance]
api_servers = http://controller:9292
 
[guestfs]
 
[healthcheck]
 
[hyperv]
 
[image_file_url]
 
[ironic]
 
[key_manager]
 
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller: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://controller: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]
#編輯服務追蹤這個配置檔案

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>
#重啟http服務

systemctl restart httpd
#同步nova-api這個資料庫

su -s /bin/sh -c "nova-manage api_db sync" nova
#同步cell0這個資料庫

su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
#建立cell0證照ID

su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
#同步nova主庫

su -s /bin/sh -c "nova-manage db sync" nova
#而後列示一下證照列表,看看是不是有0和1

nova-manage cell_v2 list_cells
#啟動剛才我們安裝的服務

systemctl start openstack-nova-api.service 
systemctl start openstack-nova-consoleauth.service
systemctl start openstack-nova-scheduler.service 
systemctl start openstack-nova-conductor.service
systemctl start openstack-nova-novncproxy.service
#把他們設定為開機自啟

systemctl enable openstack-nova-api.service 
systemctl enable openstack-nova-consoleauth.service 
systemctl enable openstack-nova-scheduler.service 
systemctl enable openstack-nova-conductor.service
systemctl enable openstack-nova-novncproxy.service

計算節點的操作

#第一步 上傳此包 ,安裝三個依賴(學校網需此步操作,外網直接下一步)
yum localinstall –y ./*

#下載nova-compute yum install openstack-nova-compute
#編輯nova配置檔案 cd /etc/nova/ cp nova.conf nova.conf.bak vim nova.conf #清空原內容,貼上如下內容 [DEFAULT] my_ip=#計算節點管理網路卡地址 use_neutron = True firewall_driver = nova.virt.firewall.NoopFirewallDriver enabled_apis=osapi_compute,metadata transport_url = rabbit://openstack:admin@controller [api] auth_strategy = keystone [api_database] #connection = mysql+pymysql://nova:NOVA_DBPASS@controller/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@controller/nova [ephemeral_storage_encryption] [filter_scheduler] [glance] api_servers = http://controller:9292 [guestfs] [healthcheck] [hyperv] [image_file_url] [ironic] [key_manager] [keystone_authtoken] auth_uri = http://controller:5000 auth_url = http://controller:35357 memcached_servers = controller: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://controller: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://控制節點IP:6080/vnc_auto.html [workarounds] [wsgi] [xenserver] [xvp] #過濾以下兩個節點是否以下兩個引數,因為你計算節點是呼叫kvm虛擬化啟動虛擬機器,看開啟虛擬化功能沒有 egrep -c '(vmx|svm)' /proc/cpuinfo #啟動compute服務並設為開機自啟 systemctl enable libvirtd.service openstack-nova-compute.service systemctl start libvirtd.service openstack-nova-compute.service

#返回至控制節點 #宣告環境變數 . admin-openrc
#列示openstack管理的虛擬化型別 openstack hypervisor list
#給資料庫同步計算節點 su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
#列示openstack管理的計算服務 openstack compute service list
#檢視服務列表 openstack catalog list
#檢視映象 openstack image list
#更新一下nova服務狀態的檢測,三個狀態必須都是成功 nova-status upgrade check

相關文章