什么是Unikernel?
隨著以Docker引領的容器化模型持續升溫,現在很有必要關注一下持續快速發展的Unikernel領域。
Unikernel是精簡專屬的庫操作系統(LibraryOS),它能夠使用高級語言編譯并直接運行在商用云平臺虛擬機管理程序之上。
相比于容器技術它們有很多的優點,不僅僅是超快的啟動時間和更小的攻擊面。還有很多技術仍然處于研究階段,例如微軟研發的Drawbridge、MirageOS和HaLVM等,與無服務器架構技術可以無縫結合。目前,Docker已收編了Unikernel。
目前的容器技術
Docker,已經被證實是一種有效的應用管理技術。它方便了不同環境的應用程序部署,解決了“在這里正常工作,但在別的環境不行”這類問題,類似于gradle的包裝器。
我們已經看到了使用Docker的熱潮,以及特別是圍繞Docker的生態圈的形成,這使得Docker的應用已經超出了開發/測試環境而進入了生產環境。它逐步從一個工具進化成了復雜的技術平臺。
開發團隊之所以喜愛Docker是因為Docker的鏡像格式更容易實現開發和生產環境之間的對等。
與虛擬機相比,容器有著輕量級、啟動速度快、隔離性好等優點,它也在一定程度上提高了不同應用之間共享云基礎設施時的安全性。此外容器技術對于在同一操作系統之中運行多個應用提供了專門的安全和兼容性上的優化。
容器技術就真的一點問題都沒有嗎?
在云端運行的應用程序大多數并不是針對在云端運行而經過優化的。通常一個容器的大小通常在MB甚至GB級別,顯而易見真正的應用只占了這其中很小的一個部分。容器本身假設需要依附底層操作系統,太過笨重,其中包括安全漏洞和臃腫軟件,即使已經進行了簡化實際上也依舊如此。
將大型服務器分隔成一個個小型虛擬機讓許多新的公司得以成功創辦起來、實現規模化。這對新服務來說是好事,可是那些虛擬機有許多是單一用途的,不過含有基本上整個操作系統,在進行操作系統復制時所有的服務和子系統不管有用沒用都被復制了,這種操作系統本身像Web服務器那樣運行應用程序。這就意味著,占用的一大部分資源沒有被使用,也沒有必要,這不僅導致成本高昂,還帶來了安全風險(更大的攻擊面)。
容器技術對于傳統操作系統的依賴可能會導致它的敗亡。
Unikernel能帶來什么?
Unikernel使用戶可以從一個服務庫中選擇應用需要的操作系統服務而無須整個操作系統,用戶選擇的服務則會成為應用的一部分。
Unikernel是與某種語言緊密相關的,一種Unikernel只能用一種語言寫程序,這個LibraryOS加上你自己寫的程序最終被編譯成成一個操作系統,這個操作系統只跑你的程序,里面也只有你這一個程序,沒有其它冗余的程序,沒有多進程切換,所以系統很小也很簡單。
雖然Docker容器的image比傳統的虛擬機(以G計)要小很多,但是一般也是好幾百兆,而Unikernel由于不包含其它不必要的程序(ls、echo、cd、tar等),體積非常小,通常只有幾兆甚至可以更小。比如mirageOS的示例mirage-skeleton編譯出來的xen虛擬機只有2M。
Unikernel在整個服務器的架構中取消了操作系統,應用直接運行在hypervisor或者硬件上。試圖抹去現代操作系統帶來的一些復雜性。因為“通用”的操作系統(就像任何Linux和Windows的發行版),通常會伴隨著帶來一些對你的應用來說并不需要的驅動、依賴包、服務、等等。
這就使得它獲得了下面幾個優勢:
大小
對比虛擬機或者容器,Unikernel只需要運行應用所必須的服務,因此應用可以減小很多。甚至是在Linux內核的核心模塊都并不是需要每一次都完全加載。像USB驅動這類東西在虛擬化的“云”環境是無用的,均可以去除。這意味著應用若需要部署到不同的服務器上將會變得方便一些,省下的不光是時間,如果云計算提供商對流量收費的話,還有真金白銀。
速度
Unikernel快得就剩一個快字了。最快的Unikernel啟動只需要20毫秒。這意味著Unikernel甚至可以在用戶請求時才啟動并對用戶請求做出響應。MirageOS正開發一個叫做Jitsu的的工具來幫助用戶在云計算環境中快速啟動和關閉Unikernel。
安全
確保系統安全的一個方法是對其進行簡化,這樣就減小了出現漏洞受到攻擊的可能性。對于Unikernel來說可攻擊的面非常小,這就使它有了很高的安全性。沒有其它不必要的程序,使其受到漏洞攻擊的可能性大大降低,Docker里面雖然大多數情況只跑一個程序,但是里面含有其它Coreutils,只要其中任何一個有安全漏洞,整個服務可能就會受到攻擊。沒有多進程任務切換,CPU可以非常高效地運行。
兼容性
雖然Unikernel需要應用在設計時就考慮到使用Unikernel來部署。然而已經出現了Rump Kernels這樣的工具可以將一般的應用以Unikernel的方式來運行。
上面所列舉的四個優勢完全符合微服務的發展趨勢。Docker和CoreOS已經在很大程度上改變了我們消費基礎設施的方式然而它們能否適應Unikernel的崛起還未可知。
今后五年Unikernel有可能完全取代容器技術,就算不能取代它也會成為容器技術的強力補充,值得關注。
目前的Unikernel實現
成熟些的有MirageOS(OCaml)、RumpRun(C、NetBSD)。
其他的有HaLVM(Haskell)、Clive(Go)、IncludeOS(cpp)、Ling(Erlang)、Runtime.js(JavaScript)等。
Unikernel的愿景
Unikernel是容器技術發展的必然產物,小、簡單、安全、高效,當你看到云客戶端時就像看到單應用硬件一樣,那就是Unikernel試圖解決的:刪除應用與硬件中間臃腫的部分,從而讓最“精簡”的操作系統運行你的代碼。
























