日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
聊聊NovaComputeDriver的那些趣事

Openstack設(shè)計(jì)準(zhǔn)則

創(chuàng)新互聯(lián)建站專(zhuān)注于企業(yè)營(yíng)銷(xiāo)型網(wǎng)站、網(wǎng)站重做改版、歷城網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)商城網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為歷城等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

OpenStack是一個(gè)開(kāi)源云計(jì)算平臺(tái)項(xiàng)目,旨在為公共及私有云的建設(shè)與管理提供軟件的開(kāi)源實(shí)現(xiàn)。可擴(kuò)展性和彈性是Openstack設(shè)計(jì)的準(zhǔn)則之一,即Openstack的各個(gè)組件以及組件內(nèi)部的模塊都應(yīng)該是可插拔的,并且可以隨意的增加插件而不需要修改已有的接口。Driver機(jī)制就是其中的一個(gè)很好的例子,Nova通過(guò)不同的driver支持不同的hypervisor,Cinder通過(guò)不同的driver支持不同的存儲(chǔ)后端,Neutron通過(guò)各種agent支持不同的網(wǎng)絡(luò)類(lèi)型,Sahara通過(guò)各種plugin支持不同的Hadoop發(fā)行版等等,在Openstack幾乎處處存在這樣的影子。所有的driver都是可配置的,通過(guò)配置不同的driver,各個(gè)組件就能注冊(cè)不同的驅(qū)動(dòng),從而支持不同的資源類(lèi)型。

何謂Compute Driver

說(shuō)到Nova,相信大家都會(huì)想到它的功能就是管虛擬機(jī)的,甚至無(wú)意識(shí)地和Libvirt、QEMU、KVM等概念自動(dòng)關(guān)聯(lián)起來(lái)。我基本每次面試都會(huì)問(wèn)及Nova的實(shí)現(xiàn)原理,大多數(shù)面試者都能回答說(shuō):Nova的原理嘛,就是調(diào)用Libvirt的API管理QEMU/KVM虛擬機(jī)。是的,我們部署Openstack時(shí)大都會(huì)使用libvirt driver,以至于很多人都誤以為Nova只是Libvirt的封裝,Nova只能管理虛擬機(jī)??墒聦?shí)上,Nova的功能遠(yuǎn)非如此,我特別需要強(qiáng)調(diào)的是:

  • Libvirt只是眾多compute driver的其中一種。
  • Nova可管的不僅僅是虛擬機(jī)。

要理解以上兩點(diǎn),我們首先需要理解Compute Driver究竟是什么?驅(qū)動(dòng)的概念相信大家都明白,我們買(mǎi)了一個(gè)新的相機(jī)或者U盤(pán)需要接入筆記本,完成的第一件事就是要安裝驅(qū)動(dòng)。許多驅(qū)動(dòng)是通用的,比如U盤(pán),插入U(xiǎn)SB接口后就能用,這是因?yàn)閮?nèi)核內(nèi)置了該類(lèi)型存儲(chǔ)設(shè)備的驅(qū)動(dòng)程序。有些設(shè)備的驅(qū)動(dòng)不是通用的,通常這種情況下,你購(gòu)買(mǎi)設(shè)備時(shí)會(huì)順便配備一個(gè)小光盤(pán),里面放的就是驅(qū)動(dòng)程序,需要安裝到你的電腦上才能使用該設(shè)備。因此,這里的驅(qū)動(dòng)可以認(rèn)為是設(shè)備與操作系統(tǒng)的交互接口,或者說(shuō)代理。雖然硬件設(shè)備多種多樣,但操作系統(tǒng)定義的接口通常是固定的,比如open()、read()、write()、ioctl()、close()等,驅(qū)動(dòng)程序只要實(shí)現(xiàn)了這些接口,就能被操作系統(tǒng)識(shí)別、管理。同理,Nova相當(dāng)于操作系統(tǒng),而各種形形色色的hypervisor相當(dāng)于各種設(shè)備,而Compute Driver就相當(dāng)于驅(qū)動(dòng)程序。Compute Driver定義了將近120個(gè)接口,所有接口都在nova/virt/driver.py上定義和描述,如:

  • spawn: 創(chuàng)建一個(gè)實(shí)例。
  • destroy: 刪除一個(gè)實(shí)例。
  • start: 對(duì)應(yīng)虛擬機(jī),就是開(kāi)機(jī)操作。
  • stop: 對(duì)應(yīng)虛擬機(jī),就是關(guān)機(jī)操作。
  • reboot: 對(duì)應(yīng)虛擬機(jī),就是重啟操作。

這些接口通常是固定不變的,也是所有具體實(shí)現(xiàn)必須遵循的規(guī)范,其描述了所有接口的作用、參數(shù)、返回類(lèi)型等信息,比如spawn接口:

 
 
 
 
  1. def spawn(self, context, instance, image_meta, injected_files, 
  2.               admin_password, network_info=None, block_device_info=None): 
  3.         """Create a new instance/VM/domain on the virtualization platform. 
  4.  
  5.         Once this successfully completes, the instance should be 
  6.         running (power_state.RUNNING). 
  7.  
  8.         If this fails, any partial instance should be completely 
  9.         cleaned up, and the virtualization platform should be in the state 
  10.         that it was before this call began. 
  11.  
  12.         :param context: security context 
  13.         :param instance: nova.objects.instance.Instance 
  14.                          This function should use the data there to guide 
  15.                          the creation of the new instance. 
  16.         :param nova.objects.ImageMeta image_meta: 
  17.             The metadata of the image of the instance. 
  18.         :param injected_files: User files to inject into instance. 
  19.         :param admin_password: Administrator password to set in instance. 
  20.         :param network_info: instance network information 
  21.         :param block_device_info: Information about block devices to be 
  22.                                   attached to the instance. 
  23.         """ 
  24.         ... 

注意:定義的接口并不要求全部實(shí)現(xiàn),根據(jù)具體的后端實(shí)現(xiàn),可以只實(shí)現(xiàn)其中的一部分接口,其它未實(shí)現(xiàn)的接口只需要簡(jiǎn)單地拋出NotImplementedError異常即可。

LibvirtDriver是其中的一個(gè)實(shí)現(xiàn),它位于nova/virt/libvirt/driver.py,其中spawn()方法相當(dāng)于調(diào)用了libvirt的define()和start()方法。destroy()則相當(dāng)于調(diào)用了libvirt的destroy()方法和undefine方法,其它方法也都能找到對(duì)應(yīng)的調(diào)用關(guān)系。

理解了什么是Compute Driver,在回過(guò)頭來(lái)思考之前的兩個(gè)問(wèn)題:

Libvirt只是眾多compute driver的其中一種。相信只要深入了解過(guò)Nova并閱讀過(guò)Nova源碼,不會(huì)有什么疑問(wèn),當(dāng)前最新版本的Nova項(xiàng)目中原生支持的Compute Driver包括:

  • libvirt
  • hyperv
  • xenapi
  • vmwareapi
  • ironic

Nova可管的不僅僅是虛擬機(jī)。這很有趣,甚至難以置信,但這卻是事實(shí)。Nova管理的除了虛擬機(jī)之外的東西,有些可能只是一種嘗試,有些早已成為了歷史,也有些獨(dú)立門(mén)戶。帶著好奇心,不妨好好盤(pán)點(diǎn)下Nova除了能管虛擬機(jī),還能管理哪些有趣的玩意。

Openstack

有人看到這,開(kāi)始質(zhì)疑這里標(biāo)題是不是錯(cuò)了,明明是談Nova能管什么,怎么突然岔開(kāi)話題談Openstack,Nova不是Openstack其中一個(gè)組件么?難道Nova管理Nova?不管你信不信,這是真的。其實(shí)原理很簡(jiǎn)單,把Compute Driver的所有實(shí)現(xiàn)替換為對(duì)另一個(gè)Nova API調(diào)用即可。比如spawn()方法,轉(zhuǎn)化為對(duì)另一個(gè)Nova API的"POST /servers"請(qǐng)求。我們把這種模式稱(chēng)作級(jí)聯(lián)Openstack。

這有什么用呢?我們知道,Openstack目前越來(lái)越成熟穩(wěn)定,但一直沒(méi)能很好的支持大規(guī)模的擴(kuò)展,當(dāng)規(guī)模大到一定程度時(shí),數(shù)據(jù)庫(kù)、消息隊(duì)列等都會(huì)成為性能瓶頸,限制了單一Openstack規(guī)模的增長(zhǎng)。社區(qū)為此也思考了一些方案,分Region、分Cell以及前面提到的級(jí)聯(lián)Openstack都是社區(qū)的一些嘗試,這些嘗試都是可行的,但又有其各自的問(wèn)題。Region和Cell會(huì)在后續(xù)的文章中重點(diǎn)介紹,這里僅僅介紹下級(jí)聯(lián)Openstack,官方文檔參考OpenStack cascading solution。其原理如圖:

其實(shí)不僅Nova如此,其它所有組件都可以使用類(lèi)似方法實(shí)現(xiàn)級(jí)聯(lián)從而實(shí)現(xiàn)大規(guī)模擴(kuò)展:

理論上,這種方法可以無(wú)限擴(kuò)展Openstack的節(jié)點(diǎn),沒(méi)有規(guī)模限制。事實(shí)上,部署和實(shí)現(xiàn)上還是存在不少挑戰(zhàn)問(wèn)題的,比如如何同步各個(gè)child集群的信息以及網(wǎng)絡(luò)通信等。

目前社區(qū)已經(jīng)把這一部分實(shí)現(xiàn)邏輯單獨(dú)拿出來(lái),并新開(kāi)了兩個(gè)相關(guān)項(xiàng)目[Tricircle]((https://wiki.openstack.org/wiki/Tricircle)以及Trio2o,二者基本都是由華為在主導(dǎo),一個(gè)負(fù)責(zé)網(wǎng)絡(luò)管理,另一個(gè)負(fù)責(zé)實(shí)現(xiàn)級(jí)聯(lián)。目前這兩個(gè)項(xiàng)目還不是特別成熟,但還是提供了一種支持大規(guī)模Openstack集群的參考。

Docker

Docker這幾年非常火熱,甚至有人說(shuō)Docker會(huì)代替虛擬機(jī),K8S會(huì)代替Openstack,雖然這種描述過(guò)于夸張,也欠缺合理性,但這卻足以證明Docker的熱度。

也因此社區(qū)很早就開(kāi)始嘗試集成Docker。在K版本Openstack中,Nova已經(jīng)支持了Docker驅(qū)動(dòng),能夠通過(guò)Nova來(lái)啟動(dòng)Docker容器。實(shí)現(xiàn)原理其實(shí)也不難,spawn()方法相當(dāng)于調(diào)用Docker的run接口(其實(shí)是調(diào)用的create()和start()API),而destory()方法則調(diào)用Docker的rm接口。其它接口與之類(lèi)似。Nova的Docker驅(qū)動(dòng)項(xiàng)目地址為nova-docker。

但是,Docker畢竟是容器,它與虛擬機(jī)還是有差別的,使用Nova集成Docker,難以支持Docker的一些高級(jí)特性,比如link、volume等。于是又有人提出與Heat集成,通過(guò)Heat能夠充分利用Docker API,但缺乏調(diào)度機(jī)制。于是干脆單獨(dú)一個(gè)新的項(xiàng)目來(lái)專(zhuān)門(mén)提供容器服務(wù),支持多租戶和資源調(diào)度,這個(gè)項(xiàng)目名稱(chēng)為magnum。再后來(lái),magnum想專(zhuān)注于容器編排服務(wù),集成K8S、Docker Swarm等容器編排服務(wù),而單容器服務(wù)則又獨(dú)立一個(gè)項(xiàng)目Zun。

裸機(jī)

Nova既然能管理虛擬機(jī),那肯定會(huì)有人想,能不能管理我們的物理機(jī)呢?很好,Nova做到了。Nova很早就支持了裸機(jī)管理,原理就是原來(lái)對(duì)接Libvirt的接口,現(xiàn)在替換為調(diào)用IPMI接口,從而實(shí)現(xiàn)了裸機(jī)的管理。因此Nova的裸機(jī)驅(qū)動(dòng)其實(shí)就相當(dāng)于封裝了ipmitool命令,事實(shí)上,也正是對(duì)ipmitool的shell調(diào)用。

最開(kāi)始,裸機(jī)管理的代碼實(shí)現(xiàn)是直接放在Nova源碼中的,后來(lái)分離出單獨(dú)的Ironic項(xiàng)目,提供裸機(jī)管理服務(wù)。

原來(lái)的IPMI封裝放在了ironic-conductor服務(wù),所有的裸機(jī)操作必須通過(guò)ironic-api調(diào)用。因此原來(lái)的Nova裸機(jī)驅(qū)動(dòng)實(shí)現(xiàn)由直接的IPMI封裝,替換為了ironic-api的封裝。

總結(jié)

除了以上提到的虛擬機(jī)、Openstack本身、Docker容器以及物理機(jī),Nova未來(lái)還有可能支持更多的東西,也許現(xiàn)在想不到,誰(shuí)又說(shuō)得準(zhǔn)以后的事呢。

【本文是專(zhuān)欄作者“付廣平”的原創(chuàng)文章,如需轉(zhuǎn)載請(qǐng)通過(guò)獲得聯(lián)系】


當(dāng)前標(biāo)題:聊聊NovaComputeDriver的那些趣事
本文網(wǎng)址:http://www.dlmjj.cn/article/dpiissd.html