nova 之compute服务
首先回顧一下nova的體系結構,nova-api接到client發來的創建虛擬機請求之后將請求轉發給conductor,conductor將請求發送給scheduler,scheduler接到請求后,對主機進行篩選,選擇合適的主機,接著把結果告訴conductor,最后到了compute節點,compute節點完成虛擬機的創建。
所以,scheduler的工作是選主機,而compute節點的任務就是在主機上創建虛擬機,openstack的核心是nova。而nova的核心是compute,所以compute是openstack的核心中的核心。那么compute服務是如何創建虛擬機的呢?
Compute節點接到請求后,首先調用的是computeManager類中的build_and_run_instance方法,然后執行_locked_do_build_and_run_instance方法,這個方法是一個加了鎖的方法,保證同一時刻只能執行一個任務。接下來,調用該類中的_do_build_and_run_intance方法,然后直接調用_build_and_run_instance方法,這個方法的作用就是做一些準備工作,例如更新數據庫中虛擬機的狀態,選擇虛擬機上的一個可用節點作為運行虛擬機的節點,準備工作做好之后開始執行核心工作,調用spawn方法。這個computeDriver中的spawn方法是一個抽象方法,而實際執行的是它的子類libvirtlDriver類中的spawn方法,該方法脈絡十分清晰,主要做了三件事:第一件:就是創建image,第二件就是創建xml文件,第三件就是創建虛擬機和網絡,也就是前兩個方法為后面的方法打下基礎。第一個_create_image方法中,做的工作是檢查鏡像緩存的目錄是否存在,如果不存在則創建一個目錄,這個目錄等下要用來存儲鏡像,接著再獲取實例的類型,然后調用了Image類中的cache方法,cache方法會根據實際情況決定執行的是哪一個子類的create_image方法,以Qcow2為例,就是執行Qcow2類中的create_image方法,在該方法中,會判斷本地的是否有緩存的鏡像,如果沒有緩存的鏡像,就要從glance下載,檢查下載的格式是否正確,如果是非raw格式,且配置文件中有要求,要求一定是raw格式的話,就把鏡像轉化為raw格式。鏡像文件搞定之后就可以為虛擬機創建磁盤鏡像文件了。調用libvirtutils包中的create_cow_image方法,該方法就會告訴libvirt創建虛擬機磁盤鏡像文件。鏡像文件創建好之后,開始創建xml文件,get_guest_xml方法調用get_guest_config方法, get_guest_config創建了LibvirtManager對象,這個對象里面存儲了虛擬機的相關信息,初始值均為空值,在get_guest_config中以各種方法,為其賦值,處理完成后,再調用to_xml方法,將對象中的值轉為xml的形式,最后創建xml文件。最后一步,創建虛擬機和網絡,在create_domain_and_nework方法中直接調用libvirt的接口,完成虛擬機的創建。
以上有沒有什么問題?沒有,那好
下面對row格式與qcow2格式進行一個比對:
創建一個20G的raw格式image——立馬用掉20G的空間
創建一個20G的qcow2格式image ——如果沒有寫入數據,幾乎不會占用空間
raw格式不支持快照
qcow2格式支持快照
用row創建20臺虛擬機的話,假設每個虛擬機是20G,則要復制20個20G,時間很長,而用qcow2格式就不需要這么長的時間,因為qcow2占用空間較少,所以適合批量創建虛擬機。而只需要有一個backing file就行了
對于compute的實現是離不開libvirt的。
云計算管理存在兩個問題:1.如果采用混合虛擬技術,上層就需要對不同的虛擬化技術調用不同管理工具,很是麻煩。2.虛擬化技術發展很迅速,系統虛擬化和容器虛擬化均在發展和演化中。可能有新的虛擬化技術更加符合現在的應用場景,需要遷移過去。這樣管理平臺就需要大幅改動。
llibvirt是為了更方便地管理平臺虛擬化技術而設計的,應用程序接接口、守護進程、管理工具。支持python\perl\java\ruby\php\Ocaml等
可以看出,一些虛擬機的管理,可以通過libvirt實現很好的解耦。
然后,沒了。
總結
以上是生活随笔為你收集整理的nova 之compute服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程实现有关SMS4的2个程序之——编程
- 下一篇: python实现八皇后问题(百练OJ:2