當Unikernels遇上Docker!
【編者的話】
本文主要是對在巴塞羅那舉辦的DockerCon大會上介紹的unikernels總結。unikernels是一種新的容器化發展方向,使用 Rump Kernels構建Rump Kernels微服務,可以像傳統的容器一樣管理使用,能充分利用到現有容器生態系統的優點。
今天,在歐盟巴塞羅那舉辦的DockerCon大會上,unikernels閃亮登場!
作為閉幕黑科技主題keynote的一部分, Anil Madhavapeddy( MirageOS 項目負責人),展示了如何像其他任何容器一樣使用unikernels。他先用Docker創建了一個unikernel微服務,然后接著部署了一個真正的Web應用,數據庫、Web服務和PHP代碼運行在使用 Rump Kernels 構建的隔離的unikernel微服務上。Docker像管理Linux容器一樣管理unikernels,但是不用再部署一個傳統的操作系統!
這種集成使得各地的開發者都可以使用unikernels,并把容器生態中熟悉的工具和實際工作流與unikernels改進的安全性、效率和專 業化結合起來。在這篇文章中我們會透露讓你如何參與其中的更多細節,不過在我們進入Anil演示的更多細節前,我們先了解一些關于unikernels的 背景以及為什么可以這樣使用Docker。
為什么是Unikernels?
隨著公司開始使用云計算,對單一用途的機器映像一直處于增長趨勢,但很顯然這還有巨大的改進余地。當前,每臺運行應用的虛擬機都必須有一個操作系統副本,特別是對隔離要求高的應用。
運行在虛擬機上的應用程序也受到操作系統漏洞影響,包括那些與應用日常功能毫無關系的漏洞。例如,USB驅動-存在于操作系統但是與云部署毫無關系-這個驅動有 多個漏洞 ,允許執行任意代碼。修補這樣的漏洞是一個完全沒必要的維護負擔。
Unikernels采取不同的方法:應用代碼只與它需要用來創建一個專業,單地址空間機器鏡像相關的OS組件鏈接— 這樣就減少了不必要的代碼。使用'操作系統庫'的技術創建,與傳統的操作系統相比unikernels提供很多好處,包括:
- 改進的安全性 - unikernels不包含與部署無關的代碼,大大減少應用程序的攻擊面。
- 更小的空間 - unikernel代碼通常要比傳統當量小幾個數量級,并且可以更容易地進行管理。
- 細粒度優化 - 由于unikernels通過一個關聯的編譯器工具鏈構建,可以在設備驅動程序和應用程序邏輯層面進行全系統優化,無形中更提高了專業化。
- 快速啟動時間 - 由于unikernels可以在不到一秒鐘啟動,資源分配會變得更加動態。
這些好處與 微服務 和'不可變基礎設施'發展理念尤其相關-虛擬機被視為一次性消耗品并可定期從版本庫的代碼重新分配。這樣的虛擬機是不允許直接修改的:所有的更改必須通過修改源代碼進行。
Unikernels自然借用了微服務架構和不可變基礎設施的概念:源代碼和生成的二進制是緊密關聯的,可以輕松控制版本。如果說傳統的棧,使我們走向微服務,那么unikernels將推動我們走向不變的nanoservices世界。
雖然unikernels提供了一種方式,但是在生產配置中采用它們還有很大的挑戰。unikernel生態系統才剛剛興起,并且這種新技術需要適應現有的工作流程和工具。
進入Docker!
為什么是Docker?
Linux的容器通過允許在傳統操作系統為其上的多個'容器化'應用程序提供功能,已經讓開發者更快地邁向微服務。這些容器相互隔離,因此可以單獨替換或修改,這也是微服務架構模式的核心。
雖然容器技術出來已經有一段時間了,而且應用的步伐也在快速增長。從過去幾年可以看到,工具的激增包括鏡像庫,編排工具等等,使得容器更易于大規模使用。在Docker的帶領和培育下,建設了一個充滿活力、開放和欣欣向榮的生態系統,幫助改善了每個人的開發工作流程。
隨著越來越多的支持工具和基礎設施,可以明確看出生態系統已經不僅僅是Linux容器本身了。unikernels是否適合這個生態系統?如果適合,unikernels與容器有什么關聯?
容器和unikernels其實是一體的。一方面,在最上層,我們使用傳統方法在一個VM中運行一個包括單一應用的全OS棧。下一步自然是在OS 上使用容器,這會有更好的資源使用體驗并允許每個應用更加自包含。如果從這個角度來看,unikernels只是在這條道路上又邁出的一步,可以被看作是 極端的、自包含的應用程序。現在我們面臨的挑戰是讓unikernels與容器一樣簡單易用。
應對這一挑戰的第一步是將unikernels與現有容器基礎設施,特別是Docker工具和生態系統集成。
利用廣泛使用和大家都理解的包模型和運行框架,把unikernels看作只是另一種類型的容器,這將幫助我們讓各地的開發人員都用上unikernels。
它還使得unikernels可以使用整個容器生態的工具,包括業務流程和其他任何可用的。采用現有的工具鏈將加速unikernels的進程, 同時也展現了Docker生態系統的靈活性和廣度。通過使用Docker抽象掉了底層操作系統的復雜性,開發人員可以選擇如何 'containerise'他們的應用程序,無論是針對一個傳統的Linux容器,或者一個新的unikernel'容器'。
DockerCon演示
也正是這些最初的步驟使開發人員能夠利用現有的Docker工具,構建和運行unikernel微服務,正像今天Anil在DockerCon的演示一樣!
首先,他用Docker創建一個unikernel微服務,然后他啟動unikernels集群部署包括數據庫,Web服務和PHP代碼的Web 應用。整個構建系統包含在一個易于使用的Dockerfile,每個微服務變成一個專門unikernel。這些unikernels在自己有硬件保障的 KVM虛擬機上運行。Docker像管理Linux容器一樣管理unikernel容器和網絡!
這些早期的工作使得unikernels實現了像Docker部署方式一樣的可用目標!既然現在unikernels可以通過Docker進行管理,那么它就可以為unikernels帶來所有現有生態系統編排和管理方面的優點。
該演示包括Nginx,MySQL和PHP,LAMP環境典型的幾個組件。這些沒有改動過的,現成的組件采用Docker工具鏈使用 unikernels創建,而不是用典型的操作系統!為了運行這些特定的應用,為這些unikernels創建了一個集群。觀看下面視頻了解更多詳情!
參與其中!
這里描述的演示僅僅是個開始。unikernels實現有很多種,并有大量的工作要做,以確保它們都能獲得集成后的好處,同樣提升Docker充分利用這些新技術的能力。 查看相關的unikernel項目,并向這篇博客貢獻你的體驗吧!