以nova kilo版本為例
nova主要組件及功能
組件 | 功能 |
---|---|
nova-api | 負(fù)責(zé)接收和響應(yīng)用戶請求 |
nova-conductor | 負(fù)責(zé)數(shù)據(jù)庫的訪問權(quán)限控制倚搬,避免nova-compute直接訪問數(shù)據(jù)庫 |
nova-scheduler | 負(fù)責(zé)選擇虛擬機(jī)的宿主機(jī) |
nova-cert | 用于管理證書 |
nova-novncproxy | 提供vnc訪問功能 |
nova-compute | 管理虛擬機(jī)的整個(gè)生命周期(從創(chuàng)建到刪除)兔簇,并實(shí)現(xiàn)虛擬機(jī)遷移、快照等功能 |
nova-consoleauth | 為vpn代理服務(wù)器提供token驗(yàn)證功能 |
按功能劃分其主要組件有:
(1) 虛擬機(jī)管理: nova-api、nova-compute、nova-scheduler
(2) 虛擬機(jī)VNC及日志管理: nova-console、nova-consoleauth
(3) 數(shù)據(jù)庫管理: nova-conductor
(4) 安全管理: nova-consoleauth欲芹、nova-cert
nova rpc 服務(wù)
nova的各個(gè)服務(wù)之間的通信都使用了基于AMQP實(shí)現(xiàn)的RPC機(jī)制,其中nova-compute吟吝、nova-conductor和nova-schduler在啟動時(shí)都會注冊一個(gè)RPC Server菱父,而nova-api因?yàn)閚ova內(nèi)部并沒有服務(wù)會調(diào)用它提供的接口,所以無需注冊。以nova-compute為例:
#nova/compute/rpcapi.py
class ComputeAPI(object):
#定義了非常多的方法浙宜,每個(gè)方法里都有下面兩行
cctxt = self.client.prepare(server=host, version=version) #獲得目標(biāo)主機(jī)的RPC client
#rpc cast是異步調(diào)用官辽,第二個(gè)參數(shù)是RPC調(diào)用的函數(shù)名,后面的參數(shù)根據(jù)方法不同而不同
cctxt.cast(ctxt, 'live_migration', instance=instance,
dest=dest, block_migration=block_migration, migrate_data=migrate_data, **args)
nova/compute/rpcapi.py里面只是定義了服務(wù)的RPC調(diào)用接口粟瞬,真正完成任務(wù)的是nova/compute/manager.py里面的方法
nova conductor
nova/conductor/api.py定義了四個(gè)controller:LocalAPI同仆、API、LocalComputeTaskAPI裙品、ComputeTaskAPI
nova服務(wù)的conductor_api對象的類型可能是LocalAPI類或API類俗批。API方法檢查nova.conf配置文件中的use_local配置項(xiàng),如果為True,則創(chuàng)建LocalAPI對象;否則市怎,創(chuàng)建API對象岁忘。
nova/conductor/init.py定義如下:
def API(*args, **kwargs):
use_local = kwargs.pop('use_local', False)
if oslo_config.cfg.CONF.conductor.use_local or use_local:
api = conductor_api.LocalAPI
else:
api = conductor_api.API
return api(*args, **kwargs)
def ComputeTaskAPI(*args, **kwargs):
use_local = kwargs.pop('use_local', False)
if oslo_config.cfg.CONF.conductor.use_local or use_local:
api = conductor_api.LocalComputeTaskAPI
else:
api = conductor_api.ComputeTaskAPI
return api(*args, **kwargs)
所以可以看到conductor的API和ComputeTaskAPI是根據(jù)/etc/nova/nova.conf配置文件中的conductor字段中的use_local參數(shù)值或者從上層函數(shù)傳遞下來的use_local值進(jìn)行設(shè)置的。有Local和沒有Local的主要區(qū)別是:Local不會發(fā)起RPC請求区匠。
LocalAPI
class LocalAPI(object):
"""A local version of the conductor API that does database updates
locally instead of via RPC. """
def __init__(self):
# 定義了一個(gè)ConductorManager對象干像,它的定義在nova/conductor/manager.py中,
# 其中定義了許多數(shù)據(jù)庫訪問的方法驰弄,這些方法都在本機(jī)建立與數(shù)據(jù)庫的連接麻汰。
# LocalAPI類定義了許多接口方法供Nova其他服務(wù)(如Scheduler服務(wù))調(diào)用,
# 而這些方法底層都是直接調(diào)用了ConductorManager對象中定義的相應(yīng)方法,并沒有向nova conductor發(fā)送RPC請求
self._manager = utils.ExceptionHelper(manager.ConductorManager())
API
class API(object):
def __init__(self):
#API對象的初始化方法也很簡單戚篙,它創(chuàng)建了一個(gè)Conductor RPC API對象什乙。
#Conductor RPC API類中定義了許多接口方法向Nova conductor發(fā)送RPC請求。
self._manager = rpcapi.ConductorAPI()