什么是Unikernel?
隨著以Docker引領(lǐng)的容器化模型持續(xù)升溫,現(xiàn)在很有必要關(guān)注一下持續(xù)快速發(fā)展的Unikernel領(lǐng)域。
Unikernel是精簡(jiǎn)專屬的庫(kù)操作系統(tǒng)(LibraryOS),它能夠使用高級(jí)語(yǔ)言編譯并直接運(yùn)行在商用云平臺(tái)虛擬機(jī)管理程序之上。

相比于容器技術(shù)它們有很多的優(yōu)點(diǎn),不僅僅是超快的啟動(dòng)時(shí)間和更小的攻擊面。還有很多技術(shù)仍然處于研究階段,例如微軟研發(fā)的Drawbridge、MirageOS和HaLVM等,與無(wú)服務(wù)器架構(gòu)技術(shù)可以無(wú)縫結(jié)合。目前,Docker已收編了Unikernel。
目前的容器技術(shù)
Docker,已經(jīng)被證實(shí)是一種有效的應(yīng)用管理技術(shù)。它方便了不同環(huán)境的應(yīng)用程序部署,解決了“在這里正常工作,但在別的環(huán)境不行”這類問(wèn)題,類似于gradle的包裝器。
我們已經(jīng)看到了使用Docker的熱潮,以及特別是圍繞Docker的生態(tài)圈的形成,這使得Docker的應(yīng)用已經(jīng)超出了開發(fā)/測(cè)試環(huán)境而進(jìn)入了生產(chǎn)環(huán)境。它逐步從一個(gè)工具進(jìn)化成了復(fù)雜的技術(shù)平臺(tái)。
開發(fā)團(tuán)隊(duì)之所以喜愛Docker是因?yàn)镈ocker的鏡像格式更容易實(shí)現(xiàn)開發(fā)和生產(chǎn)環(huán)境之間的對(duì)等。
與虛擬機(jī)相比,容器有著輕量級(jí)、啟動(dòng)速度快、隔離性好等優(yōu)點(diǎn),它也在一定程度上提高了不同應(yīng)用之間共享云基礎(chǔ)設(shè)施時(shí)的安全性。此外容器技術(shù)對(duì)于在同一操作系統(tǒng)之中運(yùn)行多個(gè)應(yīng)用提供了專門的安全和兼容性上的優(yōu)化。
容器技術(shù)就真的一點(diǎn)問(wèn)題都沒有嗎?
在云端運(yùn)行的應(yīng)用程序大多數(shù)并不是針對(duì)在云端運(yùn)行而經(jīng)過(guò)優(yōu)化的。通常一個(gè)容器的大小通常在MB甚至GB級(jí)別,顯而易見真正的應(yīng)用只占了這其中很小的一個(gè)部分。容器本身假設(shè)需要依附底層操作系統(tǒng),太過(guò)笨重,其中包括安全漏洞和臃腫軟件,即使已經(jīng)進(jìn)行了簡(jiǎn)化實(shí)際上也依舊如此。
將大型服務(wù)器分隔成一個(gè)個(gè)小型虛擬機(jī)讓許多新的公司得以成功創(chuàng)辦起來(lái)、實(shí)現(xiàn)規(guī)?;?。這對(duì)新服務(wù)來(lái)說(shuō)是好事,可是那些虛擬機(jī)有許多是單一用途的,不過(guò)含有基本上整個(gè)操作系統(tǒng),在進(jìn)行操作系統(tǒng)復(fù)制時(shí)所有的服務(wù)和子系統(tǒng)不管有用沒用都被復(fù)制了,這種操作系統(tǒng)本身像Web服務(wù)器那樣運(yùn)行應(yīng)用程序。這就意味著,占用的一大部分資源沒有被使用,也沒有必要,這不僅導(dǎo)致成本高昂,還帶來(lái)了安全風(fēng)險(xiǎn)(更大的攻擊面)。
容器技術(shù)對(duì)于傳統(tǒng)操作系統(tǒng)的依賴可能會(huì)導(dǎo)致它的敗亡。
Unikernel能帶來(lái)什么?
Unikernel使用戶可以從一個(gè)服務(wù)庫(kù)中選擇應(yīng)用需要的操作系統(tǒng)服務(wù)而無(wú)須整個(gè)操作系統(tǒng),用戶選擇的服務(wù)則會(huì)成為應(yīng)用的一部分。
Unikernel是與某種語(yǔ)言緊密相關(guān)的,一種Unikernel只能用一種語(yǔ)言寫程序,這個(gè)LibraryOS加上你自己寫的程序最終被編譯成成一個(gè)操作系統(tǒng),這個(gè)操作系統(tǒng)只跑你的程序,里面也只有你這一個(gè)程序,沒有其它冗余的程序,沒有多進(jìn)程切換,所以系統(tǒng)很小也很簡(jiǎn)單。
雖然Docker容器的image比傳統(tǒng)的虛擬機(jī)(以G計(jì))要小很多,但是一般也是好幾百兆,而Unikernel由于不包含其它不必要的程序(ls、echo、cd、tar等),體積非常小,通常只有幾兆甚至可以更小。比如mirageOS的示例mirage-skeleton編譯出來(lái)的xen虛擬機(jī)只有2M。
Unikernel在整個(gè)服務(wù)器的架構(gòu)中取消了操作系統(tǒng),應(yīng)用直接運(yùn)行在hypervisor或者硬件上。試圖抹去現(xiàn)代操作系統(tǒng)帶來(lái)的一些復(fù)雜性。因?yàn)?ldquo;通用”的操作系統(tǒng)(就像任何Linux和Windows的發(fā)行版),通常會(huì)伴隨著帶來(lái)一些對(duì)你的應(yīng)用來(lái)說(shuō)并不需要的驅(qū)動(dòng)、依賴包、服務(wù)、等等。

這就使得它獲得了下面幾個(gè)優(yōu)勢(shì):
大小
對(duì)比虛擬機(jī)或者容器,Unikernel只需要運(yùn)行應(yīng)用所必須的服務(wù),因此應(yīng)用可以減小很多。甚至是在Linux內(nèi)核的核心模塊都并不是需要每一次都完全加載。像USB驅(qū)動(dòng)這類東西在虛擬化的“云”環(huán)境是無(wú)用的,均可以去除。這意味著應(yīng)用若需要部署到不同的服務(wù)器上將會(huì)變得方便一些,省下的不光是時(shí)間,如果云計(jì)算提供商對(duì)流量收費(fèi)的話,還有真金白銀。
速度
Unikernel快得就剩一個(gè)快字了。最快的Unikernel啟動(dòng)只需要20毫秒。這意味著Unikernel甚至可以在用戶請(qǐng)求時(shí)才啟動(dòng)并對(duì)用戶請(qǐng)求做出響應(yīng)。MirageOS正開發(fā)一個(gè)叫做Jitsu的的工具來(lái)幫助用戶在云計(jì)算環(huán)境中快速啟動(dòng)和關(guān)閉Unikernel。
安全
確保系統(tǒng)安全的一個(gè)方法是對(duì)其進(jìn)行簡(jiǎn)化,這樣就減小了出現(xiàn)漏洞受到攻擊的可能性。對(duì)于Unikernel來(lái)說(shuō)可攻擊的面非常小,這就使它有了很高的安全性。沒有其它不必要的程序,使其受到漏洞攻擊的可能性大大降低,Docker里面雖然大多數(shù)情況只跑一個(gè)程序,但是里面含有其它Coreutils,只要其中任何一個(gè)有安全漏洞,整個(gè)服務(wù)可能就會(huì)受到攻擊。沒有多進(jìn)程任務(wù)切換,CPU可以非常高效地運(yùn)行。
兼容性
雖然Unikernel需要應(yīng)用在設(shè)計(jì)時(shí)就考慮到使用Unikernel來(lái)部署。然而已經(jīng)出現(xiàn)了Rump Kernels這樣的工具可以將一般的應(yīng)用以Unikernel的方式來(lái)運(yùn)行。
上面所列舉的四個(gè)優(yōu)勢(shì)完全符合微服務(wù)的發(fā)展趨勢(shì)。Docker和CoreOS已經(jīng)在很大程度上改變了我們消費(fèi)基礎(chǔ)設(shè)施的方式然而它們能否適應(yīng)Unikernel的崛起還未可知。
今后五年Unikernel有可能完全取代容器技術(shù),就算不能取代它也會(huì)成為容器技術(shù)的強(qiáng)力補(bǔ)充,值得關(guān)注。
目前的Unikernel實(shí)現(xiàn)
成熟些的有MirageOS(OCaml)、RumpRun(C、NetBSD)。
其他的有HaLVM(Haskell)、Clive(Go)、IncludeOS(cpp)、Ling(Erlang)、Runtime.js(JavaScript)等。
Unikernel的愿景
Unikernel是容器技術(shù)發(fā)展的必然產(chǎn)物,小、簡(jiǎn)單、安全、高效,當(dāng)你看到云客戶端時(shí)就像看到單應(yīng)用硬件一樣,那就是Unikernel試圖解決的:刪除應(yīng)用與硬件中間臃腫的部分,從而讓最“精簡(jiǎn)”的操作系統(tǒng)運(yùn)行你的代碼。