Compute Service Nova 是 OpenStack 最核心的服務(wù),負(fù)責(zé)維護(hù)和管理云環(huán)境的計(jì)算資源。虛擬機(jī)的生命周期也是通過 Nova 來實(shí)現(xiàn)的。
一、Nova 架構(gòu)

1. API
- nova-api
接收和響應(yīng)客戶的 API 調(diào)用
2. Compute Core
nova-scheduler
虛擬機(jī)調(diào)度服務(wù),負(fù)責(zé)決定在哪個(gè)計(jì)算幾點(diǎn)上運(yùn)行虛擬機(jī)。nova-compute
管理虛擬機(jī)的核心服務(wù),通過調(diào)用 Hypervisor API 實(shí)現(xiàn)虛擬機(jī)生命周期管理。Hypervisor
計(jì)算節(jié)點(diǎn)上的虛擬化管理程序,虛擬機(jī)管理最底層的程序。nova-conductor
nova-compute 經(jīng)常需要操作數(shù)據(jù)庫來更新虛擬機(jī)的狀態(tài)。出于安全性和伸縮性的考慮,nova-compute 并不會(huì)直接訪問數(shù)據(jù)庫,而是將這個(gè)任務(wù)委托個(gè) nova-conductor 來完成。
3. Console Interface
nova-console
訪問虛擬機(jī)的控制臺(tái):
nova-novncproxy:基于 Web 游覽器的 VNC 訪問。
nova-spicehtml5proxy:基于 HTML5 游覽器的 SPICE 訪問。
nova-xvpnvncproxy:基于 Java 客戶端的 VNC 訪問。nova-consoleauth
負(fù)責(zé)對(duì)訪問虛擬機(jī)控制臺(tái)請(qǐng)求提供 Token 認(rèn)證。nova-cert
提供 X509 證書支持
4. Database
一般使用MySQL。
表信息如下:內(nèi)容較多隱藏了一部分,下面是查看方法。
root@controller:~# su - stack
stack@controller:~$ mysql
mysql> use nova
mysql> show tables;
+--------------------------------------------+
| Tables_in_nova |
+--------------------------------------------+
| agent_builds |
| aggregate_hosts |
.......
5. Message Queue
OpenSack 默認(rèn)使用的是 RabbitMQ 作為 Message Queue。有關(guān) RabbitMQ 查看 RabbitMQ原理和使用場(chǎng)景以及模式
二、部署方案
1. 首先來查看 Nova 模塊的運(yùn)行情況
- 計(jì)算節(jié)點(diǎn)
root@compute:~# ps -e | grep nova
28197 pts/3 00:00:02 nova-compute
- 控制節(jié)點(diǎn)
root@controller:~# ps -e | grep nova
20973 pts/7 00:05:46 nova-api
27075 pts/13 00:05:46 nova-conductor
27968 pts/13 00:01:59 nova-conductor
27969 pts/13 00:01:58 nova-conductor
28051 pts/14 00:00:44 nova-scheduler
28541 pts/15 00:00:19 nova-novncproxy
29180 pts/16 00:00:47 nova-consoleaut
29741 pts/17 00:03:27 nova-compute
可以發(fā)現(xiàn)在控制節(jié)點(diǎn)中運(yùn)行了很多 nova 進(jìn)行,其中包括 compute 進(jìn)行。在計(jì)算節(jié)點(diǎn)中只有 compute。controller 即是控制節(jié)點(diǎn),又是計(jì)算節(jié)點(diǎn)。
這說明了 OpenStack 這種分布式架構(gòu)部署上的靈活性:
- 可以將所有服務(wù)器放在一臺(tái)物理機(jī)上,作為一個(gè) All-in-One 的測(cè)試環(huán)境
- 可以將服務(wù)部署到多臺(tái)物理機(jī)上,獲得更好的性能和高可用。
也可以使用 nova service-list 查看 nova 服務(wù)分布
root@controller:/opt/stack# nova service-list
+----+------------------+------------+----------+---------+-------+----------------------------+-----------------+
| Id | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason |
+----+------------------+------------+----------+---------+-------+----------------------------+-----------------+
| 3 | nova-conductor | controller | internal | enabled | up | 2019-03-09T04:35:04.000000 | - |
| 4 | nova-scheduler | controller | internal | enabled | up | 2019-03-09T04:35:05.000000 | - |
| 5 | nova-consoleauth | controller | internal | enabled | up | 2019-03-09T04:35:04.000000 | - |
| 6 | nova-compute | controller | nova | enabled | up | 2019-03-09T04:35:00.000000 | - |
| 7 | nova-compute | compute | nova | enabled | up | 2019-03-09T04:35:02.000000 | - |
+----+------------------+------------+----------+---------+-------+----------------------------+-----------------+
三、OpenStack Nova 設(shè)計(jì)思路
1. API 前端服務(wù)
每個(gè) OpenStack 組件可能包含若干子服務(wù),其中必定有一個(gè) API 服務(wù)負(fù)責(zé)接收客戶請(qǐng)求。這里的客戶包括終端用戶、命令行和 OpenStack 其他組件。
設(shè)計(jì) API 前端服務(wù)的優(yōu)點(diǎn):
- 對(duì)外提供統(tǒng)一接口,隱藏實(shí)現(xiàn)細(xì)節(jié)。
- API 提供 REST 標(biāo)準(zhǔn)調(diào)用服務(wù),便于與第三方系統(tǒng)集成。
- 可以通過多個(gè) API 服務(wù)實(shí)例輕松實(shí)現(xiàn) API 的高可用。
2. Scheduler 調(diào)度服務(wù)
Nova 由多個(gè)計(jì)算節(jié)點(diǎn),當(dāng)需要?jiǎng)?chuàng)建虛擬機(jī)時(shí),nova-scheduler 會(huì)根據(jù)計(jì)算節(jié)點(diǎn)當(dāng)時(shí)的資源使用情況選擇一個(gè)最適合的計(jì)算節(jié)點(diǎn)來運(yùn)行云主機(jī)。
比如:調(diào)度服務(wù)是一個(gè)開發(fā)團(tuán)隊(duì)的項(xiàng)目經(jīng)理,當(dāng)接到新的開發(fā)任務(wù)時(shí),項(xiàng)目經(jīng)理會(huì)評(píng)估任務(wù)的難度,考慮團(tuán)隊(duì)成員目前的工作負(fù)荷和技能水平,然后將任務(wù)分配給最合適的開發(fā)人員。
3. Worker 工作服務(wù)
調(diào)度服務(wù)只管分配工作,真正執(zhí)行任務(wù)的是 Worker 工作服務(wù)。
在 Nova 中,Worker 就是 nova-comput。
將 Scheduler 和 Worker 從職能上進(jìn)行劃分使得 OpenStack 很容易擴(kuò)展
- 當(dāng)計(jì)算資源不夠時(shí),可以添加計(jì)算幾點(diǎn)(增加 Worker)
- 當(dāng)客戶請(qǐng)求量太大調(diào)度不過來時(shí),可以添加 Scheduler
4. Driver 框架
OpenStack 的計(jì)算節(jié)點(diǎn)支持多種 Hypervisor。包括KVM、Hyper-V、VMWare、Xen、Docker、LXC等。
nova-compute 為這些 Hypervisor 定義了統(tǒng)一的接口,Hypervisor 只需要實(shí)現(xiàn)這些接口,就可以 driver 的形式即插即用到 OpenStack 中。
在 nova-compute 的配置文件 /etc/nova/nova.conf 中。由 compute_driver 配置項(xiàng)指定該計(jì)算節(jié)點(diǎn)使用那種 Hypervisor 的 driver。
compute_driver = libvirt.LibvirtDriver
在 Glance 模塊中,OpenStack 支持多種 backend 來存放 image,如:本地系統(tǒng)、Cinder、Ceph、Swift等。這其實(shí)也是一個(gè) driver 框架。
5. Messaging 服務(wù)
為什么使用分布式。
程序之間調(diào)用分為兩種:同步調(diào)用和異步調(diào)用
同步調(diào)用
API 直接調(diào)用 Scheduler 的接口就是同步調(diào)用。特點(diǎn)是 API 發(fā)出請(qǐng)求后需要一直等待,直到 Scheduler 完成對(duì) Compute 的調(diào)度,將結(jié)果返回給 API 后 API 才能夠繼續(xù)后面的工作。異步調(diào)用
API 通過 Messaging 間接調(diào)用 Scheduler 就是異步調(diào)用。特點(diǎn)是 API 發(fā)出請(qǐng)求后不需要等待,直接返回,繼續(xù)做后面的事。
Scheduler 從 Messaging 接收到請(qǐng)求后執(zhí)行操作,完成后將結(jié)果返回給 Messaging 發(fā)送給 API。
OpenStack 分布式系統(tǒng)采用異步調(diào)用的好處:
解耦各子服務(wù)
子服務(wù)不需要知道其他服務(wù)在哪運(yùn)行,只需要發(fā)消息給 Messaging 就可。提高性能
異步調(diào)用使調(diào)用者無需等待結(jié)果返回。這樣可以執(zhí)行更多操作。提供系統(tǒng)吞吐量。提高伸縮性
子服務(wù)可以根據(jù)需要進(jìn)行擴(kuò)展,啟動(dòng)更多的實(shí)例處理更多的請(qǐng)求,在提供可用性的同時(shí)也提高整個(gè)系統(tǒng)的伸縮性。而這種變化不會(huì)影響其他子服務(wù)。
5. Database
每個(gè)組件都需要維護(hù)自己的狀態(tài)信息。這些信息都是存放在數(shù)據(jù)庫中。
四、Nova 組件的詳細(xì)說明
1. nova-api
nova-api 是整個(gè) Nova 組件的門戶,所有對(duì) Nova 的請(qǐng)求都先由 nova-api 處理。nova-api 向外界暴露若干 HTTP REST API 接口。
nova-api 對(duì)接到的請(qǐng)求做如下處理:
- 檢查客戶端傳入的參數(shù)是否合法有效。
- 調(diào)用 Nova 其他子服務(wù)的處理客戶端 HTTP 請(qǐng)求。
- 格式化 Nova 其他子服務(wù)返回的結(jié)果并返回給客戶端。
nova-api 接收只和虛擬機(jī)生命周期相關(guān)的操作。如下圖中的所有操作:

2. nova-scheduler
在創(chuàng)建 Instance 時(shí)用戶可以選擇 flavor(實(shí)例類型) 來設(shè)置虛擬機(jī)的CPU,內(nèi)存等。用戶也可以自定義 flavor 的內(nèi)容。
flavor 位置如下圖:

如何實(shí)現(xiàn)調(diào)度:
(1)Filter scheduler
Filter scheduler 是 nova-scheduler 默認(rèn)的調(diào)度器,調(diào)度過程分兩部:
- 通過過濾器(filter)選擇滿足條件的計(jì)算節(jié)點(diǎn)
- 通過權(quán)重計(jì)算(weighting)選擇在最優(yōu)(權(quán)重值最大)的計(jì)算節(jié)點(diǎn)上創(chuàng)建 Instance。
配置:
scheduler_driver = filter_scheduler
(2)Filter
在 /ect/nova/nova.conf 中 scheduler_default_filters 選項(xiàng)用于配置 scheduler 可用的 filter, 默認(rèn)是所有 nova 自帶的 filter 都可以用來過濾操作。
配置:
scheduler_default_filters = RetryFilter,AvailabilityZoneFilter,RamFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,SameHostFilter,DifferentHostFilter
以下逐個(gè)介紹過濾器的意義:
-
RetryFilter
ReryFilter 作用是刷掉之前已經(jīng)調(diào)度過的節(jié)點(diǎn)。
RetryFilter 通常作為第一個(gè) filter
假設(shè) A,B,C 三個(gè)節(jié)點(diǎn)都用過了過濾,最終 A 因?yàn)闄?quán)重值最大被選中執(zhí)行操作。
但是由于一些原因在 A 上執(zhí)行的操作失敗了。
默認(rèn)情況下,nova-scheduler 會(huì)重新執(zhí)行過濾操作。這個(gè)時(shí)候 RetryFilter 就會(huì)將 A 直接刷掉,避免操作再次失敗。
-
AvailabilityZoneFilter
為了提高容災(zāi)性和提供隔離服務(wù),可以將計(jì)算節(jié)點(diǎn)劃分到不同 Availability Zone 中。
在創(chuàng)建虛擬機(jī)時(shí)需要指定 Availability Zone。nova-scheduler 在做 filtering 時(shí),會(huì)使用 AvailabilityZoneFilter 將不屬于 Availability Zone 的計(jì)算節(jié)點(diǎn)過濾掉。
OpenStack 默認(rèn)有一個(gè) Availability Zone 叫 nova,用戶也可以自己創(chuàng)建。位置如下圖:

-
RamFilter
RamFilter 將不能滿足 flavor 內(nèi)存需求的計(jì)算節(jié)點(diǎn)過濾掉。
nova 內(nèi)存超分配置:默認(rèn)值1.5
ram_allocation_ratio = 1.5
意義:如果計(jì)算節(jié)點(diǎn)內(nèi)存有 10GB,OpenStack 則會(huì)認(rèn)為他有 15GB(10 * 1.5)的內(nèi)存
-
DiskFilter
DiskFilter 將不能滿足 flavor 磁盤需求的計(jì)算節(jié)點(diǎn)過濾。
nova 磁盤超分配置: 默認(rèn)值 1.0
disk_allocation_ratio = 1.0
-
CoreFilter
CoreFilter 將不能滿足 flavor vCPU 需求的計(jì)算節(jié)點(diǎn)過濾。
nova vCPU超分配置:默認(rèn) 16.0
cpu_allocation_ratio = 16.0
意義:一個(gè)有 8CPU 的計(jì)算節(jié)點(diǎn),在 nova-scheduler 在調(diào)度時(shí)認(rèn)為他有 128 個(gè) vCPU。
在 nova-scheduler 默認(rèn)使用 filter 中是沒有 CoreFilter 的。如果需要將 CoreFilter 加入到 nova.conf 配置文件中去。
-
ComputeFilter
ComputeFilter 保證只有 nova-scheduler 服務(wù)正常工作的計(jì)算節(jié)點(diǎn),才能被 nova-scheduler 調(diào)度。
-
ComputeCapabilitiesFilter
ComputeCapabilitiesFilter 根據(jù)計(jì)算節(jié)點(diǎn)的特性來篩選
舉例:節(jié)點(diǎn)有 X8664 和 ARM 框架,如果想將 Instance 指定部署到 X8664 架構(gòu)的節(jié)點(diǎn)上,就可以利用 ComputeCapabilitiesFilter。
在 flavor 的 Metadata 中,有一個(gè) Compute 的 Capabilities 來設(shè)置過濾信息。如下圖:


-
ImagePropertiesFilter
ImagePropertiesFilter 根據(jù)所選 Image 的屬性來篩選匹配的計(jì)算節(jié)點(diǎn)。
image 中也有 metadata 用來指定屬性。在創(chuàng)建鏡像時(shí)可以設(shè)置。如下圖:


以上設(shè)置,ImagePropertiesFilter 在調(diào)度時(shí)只會(huì)篩選出 kvm 節(jié)點(diǎn)。
-
ServerGroupAntiAffinityFilter
ServerGroupAntiAffinityFilter 可以盡量將 Instance 分散部署到不同節(jié)點(diǎn)上。
例:有三個(gè) Instance 分別是 ins1、ins2、ins3,計(jì)算節(jié)點(diǎn)A、B、C
分散部署操作:
(1)創(chuàng)建一個(gè) anti-affinity 策略的 server group "group-1"
root@controller:~# nova server-group-create --policy anti-affinity group-1
(2)依次創(chuàng)建 Instance,將 ins1、ins2、ins3 放到 group-1 中
root@controller:~# nova boot --image IMAGE_ID --flavor 1 --hint group=group-1 inst1
root@controller:~# nova boot --image IMAGE_ID --flavor 1 --hint group=group-1 inst2
root@controller:~# nova boot --image IMAGE_ID --flavor 1 --hint group=group-1 inst3
創(chuàng)建 Instance 時(shí),如果沒有指定 server group,ServerGroupAntiAffinityFilter 不會(huì)做任何過濾。
-
Weight
空閑內(nèi)存越多,權(quán)重越大,Instance 將被部署到當(dāng)前空閑內(nèi)存最多的計(jì)算節(jié)點(diǎn)上。
(3)日志
/etc/nova/nova.conf 中 debug = True。后創(chuàng)建虛擬機(jī),在 nova 的日志中可以查看到創(chuàng)建流程,以及過濾過程,權(quán)重的計(jì)算。
日志文件:/opt/stack/logs/n-sch.log (非 devstack 安裝日志 /var/log/nova/scheduler.log)
3. nova-compute
nova-compute 在計(jì)算節(jié)點(diǎn)運(yùn)行,負(fù)責(zé)管理節(jié)點(diǎn)上 Instance。
OpenStack 對(duì) Instance 的操作,最后都是交給 nova-compute 來完成的。
nova-compute 與 Hypervisor 一起實(shí)現(xiàn) OpenStack 對(duì) Instance 生命周期的管理。
支持多種 Hypervisor
在 /opt/stack/nova/nova/virt 目錄下可查看到 OpenStack 源碼中已經(jīng)自帶了幾個(gè) Hypervisor 的 Driver。
root@controller:/opt/stack/nova/nova/virt# ll
drwxr-xr-x 2 stack stack 4096 Feb 23 18:45 hyperv/
drwxr-xr-x 4 stack stack 4096 Feb 23 19:07 libvirt/
drwxr-xr-x 2 stack stack 4096 Feb 23 18:45 vmwareapi/
drwxr-xr-x 3 stack stack 4096 Feb 23 18:45 xenapi/
每個(gè)計(jì)算節(jié)點(diǎn)只能運(yùn)行一種 Hypervisor 。在 計(jì)算節(jié)點(diǎn)的 nova-compute 的配置文件 /etc/nova/nova.comf 中配置所對(duì)應(yīng)的 compute_driver 即可。
nova-compute 的功能
(1) 定期向 OpenStack 報(bào)告計(jì)算節(jié)點(diǎn)的狀態(tài)
(2) 實(shí)現(xiàn) Instance 生命周期的管理
- Instance 創(chuàng)建過程分為 4 步:
???? a. 為 Instance 準(zhǔn)備資源
???? b. 創(chuàng)建 Instance 的鏡像文件
?????????首先判斷 image 是否下載到計(jì)算節(jié)點(diǎn)(如果沒下,從 Glance 下載 image)。
?????????然后將其作為backing file 創(chuàng)建 Instance 的鏡像文件。
?????????注意:image 指的是 Glance 上保存的鏡像,作為 instance 運(yùn)行模板。
????????????????????鏡像文件指的是 Instance 啟動(dòng)盤所對(duì)應(yīng)的文件。
????????????????????二者的關(guān)系是:image 是鏡像文件的 backing file。image 不會(huì)變,而鏡像文件會(huì)發(fā)生變化。
????c. 創(chuàng)建 Instance 的 XML 定義文件
????????XML 保存在目錄 /opt/stack/data/nova/instances/fle.... 中,命名為 libvirt.xml
????d. 創(chuàng)建虛擬機(jī)網(wǎng)絡(luò)并啟動(dòng)虛擬機(jī)
4. nova-conductor
nova-compute 需要獲取和更新數(shù)據(jù)庫中 Instance 的信息。
但是 nova-compute 并不會(huì)直接訪問數(shù)據(jù)庫,而是通過nova-conductor 實(shí)現(xiàn)數(shù)據(jù)的訪問。
五、OpenStack 日志
1. 日志位置
devstack 日志統(tǒng)一放在 /opt/stack/logs 中。
root@controller:/opt/stack/logs# ls
c-api.log n-api.log q-l3.log
c-api.log.2019-03-09-152514 n-api.log.2019-03-09-152514 q-l3.log.2019-03-09-152514
c-sch.log n-cauth.log q-meta.log
c-sch.log.2019-03-09-152514 n-cauth.log.2019-03-09-152514 q-meta.log.2019-03-09-152514
c-vol.log n-cond.log q-svc.log
c-vol.log.2019-03-09-152514 n-cond.log.2019-03-09-152514 q-svc.log.2019-03-09-152514
dstat-csv.log n-cpu.log screen
dstat.log n-cpu.log.2019-03-09-152514 stack.sh.log
dstat.log.2019-03-09-152514 n-dhcp.log stack.sh.log.2019-03-09-152347
g-api.log n-novnc.log stack.sh.log.2019-03-09-152347.summary.2019-03-09-152347
g-api.log.2019-03-09-152514 n-novnc.log.2019-03-09-152514 stack.sh.log.2019-03-09-152514
g-reg.log n-sch.log stack.sh.log.2019-03-09-152514.summary.2019-03-09-152514
g-reg.log.2019-03-09-152514 n-sch.log.2019-03-09-152514 stack.sh.log.summary
horizon.log placement-api.log worlddump-2019-02-23-084143.txt
horizon.log.2019-03-09-152514 placement-api.log.2019-03-09-152514 worlddump-2019-02-23-084728.txt
key-access.log q-agt.log worlddump-2019-02-23-085240.txt
key-access.log.2019-03-09-152514 q-agt.log.2019-03-09-152514 worlddump-2019-03-09-072414.txt
key.log q-dhcp.log
如:nova-* 各個(gè)子服務(wù)的日志是以 n- 開頭:
- n-api.log 是 nova-api 的日志
- n-cpu.log 是 nova-compute 的日志
- n-cond.log 是 nova-conductor 的日志
- n-sch.log 是 nova-scheduler 的日志
Glance 的日志是 g- 開頭:
- g-api.log 是 glance-api 的日志
- g-reg.log 是 glance-registry 的日志
Cinder 的日志是 c- 開頭
Neutron 的日志是 q- 開頭
對(duì)于其他非 devstack 安裝的 OpenStack 日志一般放在 /var/log/xxx/ 目錄下。
2. 日志格式
<時(shí)間><日志登記><代碼模塊><Request ID><日志內(nèi)容><源代碼位置>
- 時(shí)間,日志記錄的時(shí)間
- 日志等級(jí),有 INFO WARNING ERROR DEUBG 等
- 代碼模塊,當(dāng)前運(yùn)行的模塊
- Request ID,日志記錄聯(lián)系不同的操作,為了便于區(qū)分和增加可讀性,每個(gè)操作都被分配唯一的 Request ID。
- 日志內(nèi)容,記錄當(dāng)前正在執(zhí)行的操作和結(jié)果等重要信息
- 源代碼位置,日志代碼的位置,包括方法名,源代碼文件的目錄位置和行號(hào)
示例:
2019-03-10 16:59:15.588
DEBUG
nova.compute.api
[req-89caccca-ecf0-40f2-a9e3-b2638cc49427 demo admin]
[instance: cb00bd21-908f-4f05-b367-553c6c548f58] Going to try to stop instance from (pid=29543) force_stop
/opt/stack/nova/nova/compute/api.py:2282
時(shí)間:2019-03-10 16:59:15.588
日志登記:DEBUG
代碼塊是:nova.compute.api
Request ID:[req-89caccca-ecf0-40f2-a9e3-b2638cc49427 demo admin]
內(nèi)容:[instance: cb00bd21-908f-4f05-b367-553c6c548f58] Going to try to stop instance from (pid=29543)
代碼位置:force_stop /opt/stack/nova/nova/compute/api.py:2282