OpenStack技術(shù)源碼模塊解讀_第1頁
OpenStack技術(shù)源碼模塊解讀_第2頁
OpenStack技術(shù)源碼模塊解讀_第3頁
OpenStack技術(shù)源碼模塊解讀_第4頁
OpenStack技術(shù)源碼模塊解讀_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 OpenStack 技術(shù)源碼模塊解讀 雖然OpenStack項(xiàng)目眾多,組件繁雜,但幾乎所有的服務(wù)骨架脈絡(luò)基本是一樣的,熟悉了其中一個(gè)項(xiàng)目的架構(gòu),深入讀了其中一個(gè)項(xiàng)目源碼,再去看其它項(xiàng)目可謂輕車熟路。本文以Nova項(xiàng)目為例,一步一步剖析源碼結(jié)構(gòu)。閱讀完之后,再去看Cinder項(xiàng)目,會(huì)發(fā)現(xiàn)非常輕松。1 OpenStack基礎(chǔ)1.1 OpenStack組件介紹OpenStack是一個(gè)IaaS層的云計(jì)算平臺(tái)開源實(shí)現(xiàn),其對(duì)標(biāo)產(chǎn)品為AWS。最開始OpenStack只有兩個(gè)組件,分別為提供計(jì)算服務(wù)的Nova以及提供對(duì)象存儲(chǔ)服務(wù)的Swift,其中Nova不僅提供計(jì)算服務(wù),還包含了網(wǎng)絡(luò)服務(wù)、塊存儲(chǔ)服務(wù)、鏡像服

2、務(wù)以及裸機(jī)管理服務(wù)。之后隨著項(xiàng)目的不斷發(fā)展,從Nova中根據(jù)功能拆分為多個(gè)獨(dú)立的項(xiàng)目,如nova-volume拆分為Cinder項(xiàng)目提供塊存儲(chǔ)服務(wù),nova-image拆分為Glance項(xiàng)目,提供鏡像存儲(chǔ)服務(wù),nova-network則是neutron的前身,裸機(jī)管理也從Nova中分離出來為Ironic項(xiàng)目。最開始容器服務(wù)也是由Nova提供支持的,作為Nova的driver之一來實(shí)現(xiàn),而后遷移到Heat,到現(xiàn)在已經(jīng)獨(dú)立為一個(gè)單獨(dú)的項(xiàng)目Magnum,后來Magnum的愿景調(diào)整為主要提供容器編排服務(wù),單純的容器服務(wù)則由Zun項(xiàng)目接管。最開始OpenStack并沒有認(rèn)證功能,從E版開始才加入認(rèn)證服務(wù)

3、Keystone。OpenStack基礎(chǔ)服務(wù)組件如下:Keystone:認(rèn)證服務(wù)。Glance:鏡像服務(wù)。Nova:計(jì)算服務(wù)。Cinder:塊存儲(chǔ)服務(wù)。Neutorn:網(wǎng)絡(luò)服務(wù)。Swift:對(duì)象存儲(chǔ)服務(wù)。E版之后,在這些核心服務(wù)之上,又不斷涌現(xiàn)新的服務(wù),如面板服務(wù)Horizon、編排服務(wù)Heat、數(shù)據(jù)庫服務(wù)Trove、文件共享服務(wù)Manila、大數(shù)據(jù)服務(wù)Sahara、工作流服務(wù)Mistral以及前面提到的容器編排服務(wù)Magnum等,這些服務(wù)幾乎都依賴于以上的基礎(chǔ)服務(wù)。比如Sahara大數(shù)據(jù)服務(wù)會(huì)先調(diào)用Heat模板服務(wù),Heat又會(huì)調(diào)用Nova創(chuàng)建虛擬機(jī),調(diào)用Glance獲取鏡像,調(diào)用Cinde

4、r創(chuàng)建數(shù)據(jù)卷,調(diào)用Neutron創(chuàng)建網(wǎng)絡(luò)等。OpenStack服務(wù)越來越多、越來越復(fù)雜,覆蓋的技術(shù)生態(tài)越來越龐大,宛如一個(gè)龐然大物,剛接觸如此龐大的分布式系統(tǒng),都或多或少感覺有點(diǎn)如盲人摸象的感覺。不過不必先過于絕望,好在OpenStack項(xiàng)目具有非常良好的設(shè)計(jì),雖然OpenStack項(xiàng)目眾多,組件繁雜,但幾乎所有的服務(wù)骨架脈絡(luò)基本是一樣的,熟悉了其中一個(gè)項(xiàng)目的架構(gòu),深入讀了其中一個(gè)項(xiàng)目源碼,再去看其它項(xiàng)目可謂輕車熟路。本文會(huì)以Nova項(xiàng)目為例,一步一步剖析源碼結(jié)構(gòu),閱讀完之后,你再去看Cinder項(xiàng)目,發(fā)現(xiàn)非常輕松。1.2 工欲善其事必先利其器要閱讀源代碼首先需要安裝科學(xué)的代碼閱讀工具,圖形界

5、面使用pycharm沒有問題,不過通常在虛擬機(jī)中是沒有圖形界面的,首選vim,需要簡單的配置使其支持代碼跳轉(zhuǎn)和代碼搜索,可以參考GitHub - int32bit/dotfiles: A set of vim, zsh, git, and tmux configuration files.。如圖:OpenStack所有項(xiàng)目都是基于Python開發(fā),都是標(biāo)準(zhǔn)的Python項(xiàng)目,通過setuptools工具管理項(xiàng)目,負(fù)責(zé)Python包的安裝和分發(fā)。想知道一個(gè)項(xiàng)目有哪些服務(wù)組成,入口函數(shù)(main函數(shù))在哪里,最直接的方式就是查看項(xiàng)目根目錄下的setup.cfg文件,其中console_script

6、s就是所有服務(wù)組件的入口,比如nova的setup.cfg的console_scripts如下:由此可知nova項(xiàng)目安裝后會(huì)包含21個(gè)可執(zhí)行程序,其中nova-compute服務(wù)的入口函數(shù)為nova/cmd/compute.py(. - /)模塊的main函數(shù):其它服務(wù)依次類推。由于OpenStack使用Python語言開發(fā),而Python是動(dòng)態(tài)類型語言,參數(shù)類型不容易從代碼中看出,因此必須部署一個(gè)allinone的OpenStack開發(fā)測試環(huán)境,建議使用RDO部署:Packstack quickstart,當(dāng)然樂于折騰使用DevStack也是沒有問題的。要想深入研究源碼,最有效的方式就是一步

7、一步跟蹤代碼執(zhí)行,因此會(huì)使用debug工具是關(guān)鍵技能之一。Python的debug工具有很多,為了簡便起見,pdb工具就夠了。使用方法也非常簡單,只要在你想設(shè)置斷點(diǎn)的地方,嵌入以下代碼:然后在命令行(不能通過systemd執(zhí)行)直接運(yùn)行服務(wù)即可。假如想跟蹤nova創(chuàng)建虛擬機(jī)的過程,首先在nova/api/openstack/compute/servers.py模塊的create方法打上斷點(diǎn),如下:然后注意需要通過命令行在終端下直接運(yùn)行,而不能通過systemd啟動(dòng):此時(shí)調(diào)用創(chuàng)建虛擬機(jī)API,nova-api進(jìn)程就會(huì)彈出pdb shell,此時(shí)你可以通過s或者n命令一步一步執(zhí)行了。1.3 Ope

8、nStack項(xiàng)目通用骨骼脈絡(luò)閱讀源碼的首要問題就是就要對(duì)代碼的結(jié)構(gòu)了然于胸,需要強(qiáng)調(diào)的是,OpenStack項(xiàng)目的目錄結(jié)構(gòu)并不是根據(jù)組件嚴(yán)格劃分,而是根據(jù)功能劃分,以Nova為例,compute目錄并不是一定在nova-compute節(jié)點(diǎn)上運(yùn)行,而主要是和compute相關(guān)(虛擬機(jī)操作相關(guān))的功能實(shí)現(xiàn),同樣的,scheduler目錄代碼并不全在scheduler服務(wù)節(jié)點(diǎn)運(yùn)行,但主要是和調(diào)度相關(guān)的代碼。不過目錄結(jié)構(gòu)并不是完全沒有規(guī)律,它遵循一定的套路。通常一個(gè)服務(wù)的目錄都會(huì)包含api.py、rpcapi.py、manager.py,這三個(gè)是最重要的模塊。api.py: 通常是供其它組件調(diào)用的封裝

9、庫。換句話說,該模塊通常并不會(huì)由本模塊調(diào)用。比如compute目錄的api.py,通常由nova-api服務(wù)的controller調(diào)用。rpcapi.py:這個(gè)是RPC請(qǐng)求的封裝,或者說是RPC封裝的client端,該模塊封裝了RPC請(qǐng)求調(diào)用。manager.py: 這個(gè)才是真正服務(wù)的功能實(shí)現(xiàn),也是RPC的服務(wù)端,即處理RPC請(qǐng)求的入口,實(shí)現(xiàn)的方法通常和rpcapi實(shí)現(xiàn)的方法一一對(duì)應(yīng)。比如對(duì)一個(gè)虛擬機(jī)執(zhí)行關(guān)機(jī)操作:前面提到OpenStack項(xiàng)目的目錄結(jié)構(gòu)是按照功能劃分的,而不是服務(wù)組件,因此并不是所有的目錄都能有對(duì)應(yīng)的組件。仍以Nova為例:cmd:這是服務(wù)的啟動(dòng)腳本,即所有服務(wù)的main函數(shù)

10、。看服務(wù)怎么初始化,就從這里開始。db: 封裝數(shù)據(jù)庫訪問,目前支持的driver為sqlalchemy。conf:Nova的配置項(xiàng)聲明都在這里。locale: 本地化處理。image: 封裝Glance調(diào)用接口。network: 封裝網(wǎng)絡(luò)服務(wù)接口,根據(jù)配置不同,可能調(diào)用nova-network或者neutron。volume: 封裝數(shù)據(jù)卷訪問接口,通常是Cinder的client封裝。virt: 這是所有支持的hypervisor驅(qū)動(dòng),主流的如libvirt、xen等。objects: 對(duì)象模型,封裝了所有實(shí)體對(duì)象的CURD操作,相對(duì)以前直接調(diào)用db的model更安全,并且支持版本控制。pol

11、icies: policy校驗(yàn)實(shí)現(xiàn)。tests: 單元測試和功能測試代碼。以上同樣適用于其它服務(wù),比如Cinder等。另外需要了解的是,所有的API入口都是從xxx-api開始的,RESTFul API是OpenStack服務(wù)的唯一入口,也就是說,閱讀源碼就從api開始。而api組件也是根據(jù)實(shí)體劃分的,不同的實(shí)體對(duì)應(yīng)不同的controller,比如servers、flavors、keypairs等,controller的index方法對(duì)應(yīng)list操作、show方法對(duì)應(yīng)get操作、create創(chuàng)建、delete刪除、update更新等。根據(jù)進(jìn)程閱讀源碼并不是什么好的實(shí)踐,因?yàn)楣饫斫夥?wù)如何初始化

12、、如何通信、如何發(fā)送心跳等就不容易,各種高級(jí)封裝太復(fù)雜了。我認(rèn)為比較好的閱讀源碼方式是追蹤一個(gè)任務(wù)的執(zhí)行過程,比如看啟動(dòng)虛擬機(jī)的整個(gè)流程,因此接下來本文將以創(chuàng)建一臺(tái)虛擬機(jī)為例,一步步分析其過程。2 創(chuàng)建虛擬機(jī)過程分析這里以創(chuàng)建虛擬機(jī)過程為例,根據(jù)前面的總體套路,一步步跟蹤其執(zhí)行過程。需要注意的是,Nova支持同時(shí)創(chuàng)建多臺(tái)虛擬機(jī),因此在調(diào)度時(shí)需要選擇多個(gè)宿主機(jī)。S1 nova-api入口為nova/api/openstack/compute/servers.py的create方法,該方法檢查了一堆參數(shù)以及policy后,調(diào)用compute_api的create方法。這里的compute_api即

13、前面說的nova/compute/api.py模塊,找到該模塊的create方法,該方法會(huì)創(chuàng)建數(shù)據(jù)庫記錄、檢查參數(shù)等,然后調(diào)用compute_task_api的build_instances方法:compute_task_api即conductor的api.py。conductor的api并沒有執(zhí)行什么操作,直接調(diào)用了conductor_compute_rpcapi的build_instances方法:該方法即時(shí)conductor RPC調(diào)用api,即nova/conductor/rpcapi.py模塊,該方法除了一堆的版本檢查,剩下的就是對(duì)RPC調(diào)用的封裝,代碼只有兩行:其中cast表示異步

14、調(diào)用,build_instances是遠(yuǎn)程調(diào)用的方法,kw是傳遞的參數(shù)。參數(shù)是字典類型,沒有復(fù)雜對(duì)象結(jié)構(gòu),因此不需要特別的序列化操作。截至到現(xiàn)在,雖然目錄由api-compute-conductor,但仍在nova-api進(jìn)程中運(yùn)行,直到cast方法執(zhí)行,該方法由于是異步調(diào)用,因此nova-api任務(wù)完成,此時(shí)會(huì)響應(yīng)用戶請(qǐng)求,虛擬機(jī)狀態(tài)為building。S2 nova-conductor由于是向nova-conductor發(fā)起的RPC調(diào)用,而前面說了接收端肯定是manager.py,因此進(jìn)程跳到nova-conductor服務(wù),入口為nova/conductor/manager.py的bui

15、ld_instances方法,該方法首先調(diào)用了_schedule_instances方法,該方法調(diào)用了scheduler_client的select_destinations方法:scheduler_client和compute_api以及compute_task_api都是一樣對(duì)服務(wù)的client調(diào)用,不過scheduler沒有api.py,而是有個(gè)單獨(dú)的client目錄,實(shí)現(xiàn)在client目錄的_init_.py,這里僅僅是調(diào)用query.py下的SchedulerQueryClient的select_destinations實(shí)現(xiàn),然后又很直接的調(diào)用了scheduler_rpcapi的se

16、lect_destinations方法,終于又到了RPC調(diào)用環(huán)節(jié)。毫無疑問,RPC封裝同樣是在scheduler的rpcapi中實(shí)現(xiàn)。該方法RPC調(diào)用代碼如下:注意這里調(diào)用的call方法,即同步RPC調(diào)用,此時(shí)nova-conductor并不會(huì)退出,而是堵塞等待直到nova-scheduler返回。因此當(dāng)前狀態(tài)為nova-conductor為blocked狀態(tài),等待nova-scheduler返回,nova-scheduler接管任務(wù)。S3 nova-scheduler同理找到scheduler的manager.py模塊的select_destinations方法,該方法會(huì)調(diào)用driver方法

17、,這里的driver其實(shí)就是調(diào)度算法實(shí)現(xiàn),通常用的比較多的就是filter_scheduler的,對(duì)應(yīng)filter_scheduler.py模塊,該模塊首先通過host_manager拿到所有的計(jì)算節(jié)點(diǎn)信息,然后通過filters過濾掉不滿足條件的計(jì)算節(jié)點(diǎn),剩下的節(jié)點(diǎn)通過weigh方法計(jì)算權(quán)值,最后選擇權(quán)值高的作為候選計(jì)算節(jié)點(diǎn)返回。最后nova-scheduler返回調(diào)度結(jié)果的hosts集合,任務(wù)結(jié)束,返回到nova-conductor服務(wù)。S4 nova-condutor回到scheduler/manager.py的build_instances方法,nova-conductor等待nova

18、-scheduler返回后,拿到調(diào)度的計(jì)算節(jié)點(diǎn)列表。因?yàn)榭赡芡瑫r(shí)啟動(dòng)多個(gè)虛擬機(jī),因此循環(huán)調(diào)用了compute_rpcapi的build_and_run_instance方法??吹絰xxrpc立即想到對(duì)應(yīng)的代碼位置,位于compute/rpcapi模塊,該方法向nova-compute發(fā)起RPC請(qǐng)求:由于是cast調(diào)用,因此發(fā)起的是異步RPC,因此nova-conductor任務(wù)結(jié)束,緊接著終于輪到nova-compute登場了。S5 nova-compute到了nova-compute服務(wù),入口為compute/manager.py,找到build_and_run_instance方法,該方法調(diào)用了driver的spawn方法,這里的driver就是各種hypervisor的實(shí)現(xiàn),所有實(shí)現(xiàn)的driver都在virt目錄下,入口為driver.py,比如libvirt driver實(shí)現(xiàn)對(duì)應(yīng)為virt/libvirt/driver.py,找到spawn方法,該方法拉取鏡像創(chuàng)建根磁盤、生成xml文件、define domain,啟動(dòng)domain等。最后虛擬機(jī)完成創(chuàng)建。nova-compute服務(wù)結(jié)束。3 一張圖總結(jié)以上是創(chuàng)建虛擬機(jī)的各個(gè)服務(wù)的交互過程以及調(diào)用關(guān)系,需要注

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論