nova-compute運行的節點為計算節點,虛擬機運行於計算節點上。例如對於創建虛擬機請求,nova-api接收到客戶端請求后,經過nova-scheduler調度器調度,再將請求發送給某個選定的nova-compute節點,nova-compute模塊經過一系列的動作之后將命令下發到真正的hypervisor進行虛擬機的創建。這篇文章,我們將分析nova-compute關鍵的代碼流程及類關系。
我們看一下nova-compute的main函數:
在main函數中,調用service.Service.create創建一個服務,server為nova.service.Service對象,表示一個服務,然后調用service.serve(server)啟動該服務,代碼如下:
記住了,server變量是nova.service.Service類型的對象。我們看下這個nova.service.Service類的構造函數__init__(),如下圖:
目前我們主要關注其中一個成員變量self.manager,它是nova.compute.manager.ComputeManager對象實例。經過和nova-api類似的調用流程后,nova.service.Service.start函數被調用,代碼如下圖:
在start函數中,調用self.rpcserver.start()啟動了一個rpc服務,從打印的變量值中可以看到,和這個rpc服務關聯之target的topic為compute,server值也為compute,endpoints中有一個nova.compute.manager.ComputeManager,虛擬機相關的操作之后都由這個對象來處理。如果我們繼續跟蹤這個rpcserver的啟動代碼,則可看到如下信息:
它最后是調用oslo.messaging._drivers.amqpdriver.py的listen()來監聽。
我們看下nova.compute.manager.ComputeManager類的構造函數__init__(),如下圖:
構造函數里通過driver.load_compute_driver函數初始化了一個成員變量self.driver,再看下load_compute_driver函數,如下圖:
根據我當前環境的配置,我們看到加載后driver是一個nova.virt.libvirt.driver.LibvirtDriver對象實例,它對libvirt進行了封裝,與底層的hypervisor通信。
nova-compute主要類關系圖如下:
以上是個人的粗淺理解,由於細節過多這里只解析關鍵部分,歡迎各位同仁指正!