Openstack計算Nova元件
歡迎來到虛擬機器的世界,如果我們將Openstack環境裡執行在各個無力節點上的各種服務看座生命體,而不是死的指令集合,那麼就是一個虛擬機器的世界。
Openstack的計算元件,也就是Nova專案實現了虛擬機器世界的抽象,控制者一個個虛擬機器的狀態變遷與生老病死,管理者它們的資源分配。
Nova的體系結構
Nova主要由API、Compute、Conductor、Scheduler四個核心服務組成,它們之前通過AMQP訊息佇列進行通訊
API上進去Nova的HTTP藉口,Compute和VMM(虛擬機器管理器)互動來進行虛擬機器並管理虛擬機器的生命週期,Scheduler從可用池中選擇最合適的計算節點來建立新的虛擬機器例項,Conductor為資料庫的訪問提供一層安全保障,Scheduler只是讀取資料庫的內容,API則由Policy保護,因此它們都可以直接操作資料庫,但是社群還是希望涉及資料庫的操作都通過Conductor
以建立虛擬機器為例,首先使用者執行novaclient提供的用於建立虛擬機器的命令,API服務間聽到novaclient傳送的HTTP請求並且將它轉換成AMQP訊息,通過訊息佇列呼叫Conductor服務,Conductor服務通過訊息佇列接受到任務之後,做一些準備工作(例如彙總虛擬機器引數等),再通過訊息佇列告訴Scheduler去選擇一個滿足虛擬機器建立要求的主機,Conductor拿到Scheduler提供的目標主機之後,會要求Compute服務建立虛擬機器
並不是所有的業務流程都像虛擬機器那樣需要所有的服務,比如刪除虛擬機器時,不需要Scheduler服務,API通過訊息佇列告訴Compute刪除指定虛擬機器,Computed通過Conductor更新資料庫即完成業務的流程
1.Nova原始碼目錄結構
看到這裡的想法是Openstack從入門到勸退
在一個城市裡面尋找一個地方 最快的方法是開啟地圖,所以對新人來說,這裡面最重要的檔案是setup.cfg,作為Openstack的原始碼地圖,setup.cfg檔案就是瀏覽程式碼時候最為依仗的檔案,它引導我們去認識一個新的專案,並瞭解它的程式碼結構
1 [entry_points] 2 console_scripts = 3 nova-api = nova.cmd.api:main 4 nova-api-metadata = nova.cmd.api_metadata:main 5 nova-api-os-compute = nova.cmd.api_os_compute:main 6 nova-compute = nova.cmd.compute:main 7 nova-conductor = nova.cmd.conductor:main 8 nova-manage = nova.cmd.manage:main 9 nova-novncproxy = nova.cmd.novncproxy:main 10 nova-policy = nova.cmd.policy:main 11 nova-rootwrap = oslo_rootwrap.cmd:main 12 nova-rootwrap-daemon = oslo_rootwrap.cmd:daemon 13 nova-scheduler = nova.cmd.scheduler:main 14 nova-serialproxy = nova.cmd.serialproxy:main 15 nova-spicehtml5proxy = nova.cmd.spicehtml5proxy:main 16 nova-status = nova.cmd.status:main
每個setup.cfg檔案的"entry_points"中都有會個比較特殊的組,或者說namespace。
console.scripts中的檔案在部署的時候會生產執行檔案,它也是入口檔案
1 # nova/compute/rpcapi.py 2 @profiler.trace_cls("rpc") 3 class ComputeAPI(object): 4 def live_migration(self, ctxt, instance, dest, block_migration, host, 5 migration, migrate_data=None): 6 version = '5.0' 7 client = self.router.client(ctxt) 8 # 獲取目標機的RPC Client 9 cctxt = client.prepare(server=host, version=version) 10 # RPC cast主要用於非同步任務,比如建立虛擬機器,在建立過程可能需要很長時間 11 # 如果使用RPC call會等待 顯然對效能有很大影響,csta()第二個引數是 12 # RPC呼叫對函式名,後面的引數將作為引數被傳入該函式 13 cctxt.cast(ctxt, 'live_migration', instance=instance, 14 dest=dest, block_migration=block_migration, 15 migrate_data=migrate_data, migration=migration)
類ComputedAPI中的函式即為Compute服務提供給RPC呼叫的介面,其他服務呼叫前需要使用這個模組,比如
1 # nova/conductor/tasks/live_migrate.py 2 class LiveMigrationTask(base.TaskBase): 3 def __init__(self, context, instance, destination, 4 block_migration, disk_over_commit, migration, compute_rpcapi, 5 servicegroup_api, query_client, report_client, 6 request_spec=None): 7 super(LiveMigrationTask, self).__init__(context, instance) 8 ... 9 self.compute_rpcapi = compute_rpcapi 10 def _execute(self): 11 .... 12 return self.compute_rpcapi.live_migration(self.context, 13 host=self.source, 14 instance=self.instance, 15 dest=self.destination, 16 block_migration=self.block_migration, 17 migration=self.migration, 18 migrate_data=self.migrate_data)
類ComputeAPI只是暴露給其他服務的RPC呼叫介面,Compute服務的RPC Server接受RPC請求後,真正完成任務的是nova.compute.manager
# nova/compute/manager.py class ComputeManager(manager.Manager): """Manages the running instances from creation to destruction.""" target = messaging.Target(version='5.10') def _do_live_migration(self, context, dest, instance, block_migration, migration, migrate_data): ...
從ComputeAPI到ComputeManager的過程即是RPC呼叫過程
&n