-
1.Nova介紹
Nova是openstack最早的兩塊模塊之一,另一個是對象存儲swift。在openstack體系中一個叫做計算節點,一個叫做控制節點。這個主要和nova相關,我們把安裝為計算節點成為:nova-compute,把除了nova-compute叫做控制節點。nova-compute是創建虛擬機的,只是創建虛擬機,所有的控制都在另一台上。
OpenStack計算組件請求OpenStack Identity服務進行認證;請求OpenStack Image服務提供磁盤鏡像;為OpenStack dashboard提供用戶與管理員接口。
nova服務的功能和特點:
實例生命周期的管理
管理計算資源
網絡和認證管理
REST風格的API
異步的一致性通信
Hypervisor透明:支持Xen,XenServer/XCP,KVM,UML,VMware vSphere and Hyper-V
-
2.OpenStack計算服務架構:
Nova API:負責接收和響應外部請求。支持Openstack API,EC2 API。外部訪問Nova的唯一途徑,接受外部請求並通過Message Queue將請求發送給其他的服務組件。
Nova Scheduler:用於雲主機調度,決策虛擬機創建應該創建在哪個計算節點上。決策一個虛擬機應該調度到某個物理節點上,需要兩步:過濾,計算權值。
Nova Compute:一般運行在計算節點上,通過Message Queue接收並管理KVM的生命周期,Nova compute通過libvirt管理 KVM,通過XenAPI管理Xen。管理虛機的核心服務,通過調用 Hypervisor API 實現虛機生命周期管理。
Hypervisor :計算節點上跑的虛擬化管理程序,虛機管理最底層的程序。 不同虛擬化技術提供自己的 Hypervisor。常用的 Hypervisor 有 KVM,Xen, VMWare 等。
Nova Conductor:計算節點訪問數據庫的中間件。nova-compute 經常需要更新數據庫,比如更新虛機的狀態。
出於安全性和伸縮性的考慮,nova-compute 並不會直接訪問數據庫,而是將這個任務委托給 nova-conductor。
Nova Consoleauth:用於控制台的授權驗證,需要打開vnc需要在Consoleauth進行授權認證。負責對訪問虛機控制台請親提供 Token 認證。
Nova Novncporxy:提供一個代理,用於訪問正在運行的實例。通過VNC協議,基於 Web 瀏覽器的 VNC 訪問 。
Nova-spicehtml5proxy:基於 HTML5 瀏覽器的 SPICE 訪問
Nova-x***vncproxy:基於 Java 客戶端的 VNC 訪問
Nova Cert:服務器守護進程向Nova Cert服務提供X509證書。用來為euca-bundle-image
生成證書。僅僅是在EC2 API的請求中使用。
消息隊列:在守護進程之間傳遞消息的中心。通常使用RabbitMQ實現,也可以使用另一個AMQP消息隊列(如ZeroMQ)來實現。在前面我們了解到 Nova 包含眾多的子服務,這些子服務之間需要相互協調和通信。 為解耦各個子服務,Nova 通過 Message Queue 作為子服務的信息中轉站。
SQL數據庫:Nova 會有一些數據需要存放到數據庫中。存儲雲主機在構建時和運行時的狀態,為雲基礎設施,包括有:可用實例類型、使用中的實例、可用網絡、項目
-
3.計算節點的Nova服務部署與測試
(1)修改配置文件/etc/nova/nova.conf
在[DEFAULT]部分,只啟用計算和元數據API: [DEFAULT] ... enabled_apis = osapi_compute,metadata
在[api_database]和[database]部分,配置數據庫的連接: [api_database] ... connection = mysql+pymysql://nova:nova@192.168.56.11/nova_api [database] ... connection = mysql+pymysql://nova:nova@192.168.56.11/nova
在[DEFAULT]部分,配置RabbitMQ消息隊列訪問權限: [DEFAULT] ... transport_url = rabbit://openstack:openstack@192.168.56.11
在 “[DEFAULT]” 和 “[keystone_authtoken]” 部分,配置認證服務訪問: [DEFAULT] ... auth_strategy = keystone [keystone_authtoken] ... auth_uri = http://192.168.56.11:5000 auth_url = http://192.168.56.11:35357 memcached_servers = 192.168.56.11:11211 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = nova password = nova
在 [DEFAULT]部分,啟用網絡服務支持: [DEFAULT] ... use_neutron = True firewall_driver = nova.virt.firewall.NoopFirewallDriver -->關閉nova防火牆 tips: 默認情況下,計算服務使用內置的防火牆服務。由於網絡服務包含了防火牆服務,你必須使用nova.virt.firewall.NoopFirewallDriver防火牆服務來禁用掉計算服務內置的防火牆服務 在[vnc]部分,配置VNC代理使用控制節點的管理接口IP地址 : [vnc] ... vncserver_listen = 0.0.0.0 vncserver_proxyclient_address = 192.168.56.11
在 [glance] 區域,配置鏡像服務 API 的位置: [glance] ... api_servers = http://192.168.56.11:9292
在 [oslo_concurrency] 部分,配置鎖路徑: [oslo_concurrency] ... lock_path = /var/lib/nova/tmp
查看所有配置項:
[root@linux-node1 ~]# grep "^[a-z]" /etc/nova/nova.conf auth_strategy=keystone #啟用keystone進行認證 use_neutron=True #啟用網絡服務 enabled_apis=osapi_compute,metadata #啟用計算和元數據 firewall_driver = nova.virt.firewall.NoopFirewallDriver transport_url=rabbit://openstack:openstack@192.168.56.11 connection=mysql+pymysql://nova:nova@192.168.56.11/nova_api connection=mysql+pymysql://nova:nova@192.168.56.11/nova api_servers=http://192.168.56.11:9292 auth_uri = http://192.168.56.11:5000 auth_url = http://192.168.56.11:35357 memcached_servers = 192.168.56.11:11211 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = nova password = nova lock_path=/var/lib/nova/tmp vncserver_listen=0.0.0.0 vncserver_proxyclient_address=192.168.56.11
(2)同步數據庫
[root@linux-node1 ~]# su -s /bin/sh -c "nova-manage api_db sync" nova [root@linux-node1 ~]# su -s /bin/sh -c "nova-manage db sync" nova 同步第二個操作時會有一個WARNING,屬於正常。驗證查看數據庫是否有表 [root@linux-node1 ~]# mysql -h 192.168.56.11 -unova -pnova -e "use nova;show tables;" [root@linux-node1 ~]# mysql -h 192.168.56.11 -unova -pnova -e "use nova_api;show tables;"
(3)完成安裝,啟動compute服務並設置開機自啟
[root@linux-node1 ~]# systemctl enable openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
[root@linux-node1 ~]# systemctl start openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
(4)創建服務實體,並在keystone上注冊
[root@linux-node1 ~]# openstack service create --name nova --description "OpenStack Compute" compute +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | OpenStack Compute | | enabled | True | | id | 200e9f78a4654e0394eec200c4dab31d | | name | nova | | type | compute | +-------------+----------------------------------+ [root@linux-node1 ~]# openstack endpoint create --region RegionOne compute public http://192.168.56.11:8774/v2.1/%\(tenant_id\)s +--------------+----------------------------------------------+ | Field | Value | +--------------+----------------------------------------------+ | enabled | True | | id | dfb98d75fe7e44da898280d48e331a63 | | interface | public | | region | RegionOne | | region_id | RegionOne | | service_id | 200e9f78a4654e0394eec200c4dab31d | | service_name | nova | | service_type | compute | | url | http://192.168.56.11:8774/v2.1/%(tenant_id)s | +--------------+----------------------------------------------+ [root@linux-node1 ~]# openstack endpoint create --region RegionOne compute internal http://192.168.56.11:8774/v2.1/%\(tenant_id\)s +--------------+----------------------------------------------+ | Field | Value | +--------------+----------------------------------------------+ | enabled | True | | id | a656fdf0dce34db39fdce5c3fd3d3e40 | | interface | public | | region | RegionOne | | region_id | RegionOne | | service_id | 200e9f78a4654e0394eec200c4dab31d | | service_name | nova | | service_type | compute | | url | http://192.168.56.11:8774/v2.1/%(tenant_id)s | +--------------+----------------------------------------------+ [root@linux-node1 ~]# openstack endpoint create --region RegionOne compute admin http://192.168.56.11:8774/v2.1/%\(tenant_id\)s +--------------+----------------------------------------------+ | Field | Value | +--------------+----------------------------------------------+ | enabled | True | | id | 85a0a9b5d4db449cab48b7c033aabac3 | | interface | admin | | region | RegionOne | | region_id | RegionOne | | service_id | 200e9f78a4654e0394eec200c4dab31d | | service_name | nova | | service_type | compute | | url | http://192.168.56.11:8774/v2.1/%(tenant_id)s | +--------------+----------------------------------------------+ [root@linux-node1 ~]# openstack service list [root@linux-node1 ~]# openstack endpoint list
(5)驗證nova服務是否正常
[root@linux-node1 ~]# openstack host list +-------------+-------------+----------+ | Host Name | Service | Zone | +-------------+-------------+----------+ | linux-node1 | consoleauth | internal | | linux-node1 | conductor | internal | | linux-node1 | scheduler | internal | +-------------+-------------+----------+ [root@linux-node1 ~]# nova service-list +----+------------------+-------------+----------+---------+-------+----------------------------+-----------------+ | Id | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason | +----+------------------+-------------+----------+---------+-------+----------------------------+-----------------+ | 1 | nova-consoleauth | linux-node1 | internal | enabled | up | 2017-12-12T02:50:09.000000 | - | | 2 | nova-conductor | linux-node1 | internal | enabled | up | 2017-12-12T02:50:06.000000 | - | | 3 | nova-scheduler | linux-node1 | internal | enabled | up | 2017-12-12T02:50:05.000000 | - | +----+------------------+-------------+----------+---------+-------+----------------------------+-----------------+
-
4.配置總結:
①數據庫連接配置
②RabbitMQ連接配置
③Keystone認證配置
④token緩存配置
⑤glance-api訪問配置
⑥防火牆關閉、元數據訪問、網絡啟用配置
⑦鎖路徑以及VNC代理配置
-
5.Nova組件如何協調工作?
對於 Nova,這些服務會部署在兩類節點上:計算節點和控制節點。
計算節點上安裝了 Hypervisor,上面運行虛擬機。
由此可知:
- 只有 nova-compute 需要放在計算節點上。
- 其他子服務則是放在控制節點上的。
通過在計算節點(node2)和控制節點(node1)上運行 ps -elf|grep nova 來查看運行的 nova 子服務
[root@linux-node1 ~]# ps -e |grep nova 1026 ? 00:15:02 nova-scheduler 1027 ? 00:13:52 nova-consoleaut 1028 ? 01:24:20 nova-conductor 1147 ? 00:02:41 nova-novncproxy 1564 ? 00:22:51 nova-compute 3240 ? 01:23:54 nova-api 3250 ? 00:02:20 nova-api 3252 ? 00:00:01 nova-api [root@linux-node2 ~]# ps -e |grep nova 1310 ? 00:28:50 nova-compute
從上面的查詢結果上看,我們發現在在控制節點(node1)上也有一個nova-compute,這就意味着node1 既是一個控制節點,同時也是一個計算節點,也可以在上面運行虛機。我們可以通過nova service-list來查看 nova-* 子服務都分布在哪些節點上。
下面我們從虛擬機創建的流程上看nova的組件服務是如何工作的
①客戶向API(nova-api)發送請求:我需要創建一個虛擬機;
②API 對請求進行響應處理,向消息隊列(RabbitMQ)發送了一條消息:“讓 Scheduler 創建一個虛機”;
③Scheduler(nova-scheduler)監聽消息隊列獲取到 API 發給它的消息,然后執行調度算法,從若干計算節點中選出合適的節點A;
④Scheduler 向 消息隊列發送了一條消息:“在計算節點 A 上創建這個虛機”;
⑤計算節點 A 的 Compute(nova-compute)從消息隊列中獲取到 Scheduler 發給它的消息,然后在本節點的 Hypervisor 上啟動虛機。
⑥在虛機創建的過程中,Compute 如果需要查詢或更新數據庫信息,會通過消息隊列向 Conductor(nova-conductor)發送消息,Conductor 負責數據庫訪問。
-
6.openstack設計思路(轉)
http://blog.csdn.net/cloudman6/article/details/51235388
(1)API 前端服務
OpenStack是一個組件復雜的平台,每個組件都包含這若干的子服務,其中每個服務中必定會有一個API負責接收外部請求。
以 Nova 為例,nova-api 是作為 Nova 組件對外的唯一窗口,向User暴露 Nova 能夠提供的功能。
當User需要執行虛機相關的操作,能且只能向 nova-api 發送 REST 請求。
這里的客戶包括終端用戶、命令行和 OpenStack 其他組件。
設計 API 前端服務的好處在於:
- 對外提供統一接口,隱藏實現細節
- API 提供 REST 標准調用服務,便於與第三方系統集成
- 可以通過運行多個 API 服務實例輕松實現 API 的高可用,比如運行多個 nova-api 進程
(2)Scheduler 調度服務
對於某項操作,如果有多個實體都能夠完成任務,那么通常會有一個 scheduler 負責從這些實體中挑選出一個最合適的來執行操作。
在前面的例子中,Nova 有多個計算節點。
當需要創建虛機時,nova-scheduler 會根據計算節點當時的資源使用情況選擇一個最合適的計算節點來運行虛機。
調度服務就好比是一個開發團隊中的項目經理,當接到新的開發任務時,項目經理會評估任務的難度,考察團隊成員目前的工作負荷和技能水平,然后將任務分配給最合適的開發人員。
(3)Worker 工作服務
調度服務只管分配任務,真正執行任務的是 Worker 工作服務。
在 Nova 中,這個 Worker 就是 nova-compute 了。
將 Scheduler 和 Worker 從職能上進行划分使得 OpenStack 非常容易擴展:
當計算資源不夠了無法創建虛機時,可以增加計算節點(增加 Worker)
當客戶的請求量太大調度不過來時,可以增加 Scheduler
(4)Driver 框架
OpenStack 作為開放的 Infrastracture as a Service 雲操作系統,支持業界各種優秀的技術。
這些技術可能是開源免費的,也可能是商業收費的。
這種開放的架構使得 OpenStack 能夠在技術上保持先進性,具有很強的競爭力,同時又不會造成廠商鎖定(Lock-in)。
那 OpenStack 的這種開放性體現在哪里呢?
一個重要的方面就是采用基於 Driver 的框架。
以 Nova 為例,OpenStack 的計算節點支持多種 Hypervisor。
包括 KVM, Hyper-V, VMWare, Xen, Docker, LXC 等。
Nova-compute 為這些 Hypervisor 定義了統一的接口,hypervisor 只需要實現這些接口,就可以 driver 的形式即插即用到 OpenStack 中。
下面是 nova driver 的架構示意圖
在 nova-compute 的配置文件 /etc/nova/nova.conf 中由 compute_driver 配置項指定該計算節點使用哪種 Hypervisor 的 driver
在我們的環境中因為是 KVM,所以配置的是 Libvirt 的 driver。
不知大家是否還記得我們在學習 Glance 時談到:
OpenStack 支持多種 backend 來存放 image。
可以是本地文件系統,Cinder,Ceph,Swift 等。
其實這也是一個 driver 架構。
只要符合 Glance 定義的規范,新的存儲方式可以很方便的加入到 backend 支持列表中。
(5)消息隊列服務
在前面創建虛機的流程示意圖中,我們看到 nova- 子服務之間的調用嚴重依賴 消息隊列服務。
消息隊列是 nova- 子服務交互的中樞。
以前沒接觸過分布式系統的同學可能會不太理解為什么不讓 API 直接調用Scheduler,或是讓Scheuler 直接調用 Compute,而是非要通過 Messaging 進行中轉。
這里做一些解釋。
程序之間的調用通常分兩種:同步調用和異步調用。
同步調用
API 直接調用 Scheduler 的接口就是同步調用。
其特點是 API 發出請求后需要一直等待,直到 Scheduler 完成對 Compute 的調度,將結果返回給 API 后 API 才能夠繼續做后面的工作。
異步調用
API 通過 Messaging 間接調用 Scheduler 就是異步調用。
其特點是 API 發出請求后不需要等待,直接返回,繼續做后面的工作。
Scheduler 從 Messaging 接收到請求后執行調度操作,完成后將結果也通過 Messaging 發送給 API。
在 OpenStack 這類分布式系統中,通常采用異步調用的方式,其好處是:
解耦各子服務
子服務不需要知道其他服務在哪里運行,只需要發送消息給 Messaging 就能完成調用。
提高性能
異步調用使得調用者無需等待結果返回。這樣可以繼續執行更多的工作,提高系統總的吞吐量。
提高伸縮性
子服務可以根據需要進行擴展,啟動更多的實例處理更多的請求,在提高可用性的同時也提高了整個系統的伸縮性。而且這種變化不會影響到其他子服務,也就是說變化對別人是透明的。
(6)Database
OpenStack 各組件都需要維護自己的狀態信息。
比如 Nova 中有虛機的規格、狀態,這些信息都是在數據庫中維護的。
每個 OpenStack 組件在 MySQL 中有自己的數據庫。