1. 程式人生 > >Openstack計算Nova元件

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