天天看點

阿裡巴巴正式開源其自研容器技術Pouch

在中國開源年會現場,阿裡巴巴正式開源了基于 Apache 2.0 協定的容器技術 Pouch。Pouch 是一款輕量級的容器技術,擁有快速高效、可移植性高、資源占用少等特性,主要幫助阿裡更快的做到内部業務的傳遞,同時提高超大規模下資料中心的實體資源使用率。開源之後,Pouch 成為一項普惠技術,人人都可以在 GitHub 上擷取,GitHub 項目位址:

<a href="https://github.com/alibaba/pouch" target="_blank">https://github.com/alibaba/pouch</a>

阿裡巴巴正式開源其自研容器技術Pouch

Pouch 的開源,是阿裡看好容器技術的一個信号。時至今日,全球範圍内,容器技術在大多數企業中落地,已然成為一種共識。如何做好容器的技術選型,如何讓容器技術可控,相信是每一個企業必須考慮的問題。Pouch 無疑使得容器生态再添利器,在全球巨頭壟斷的容器開源生态中,為中國技術赢得了一塊陣地。

<b></b>

<b>Pouch 技術現狀</b>

此次開源 Pouch,相信行業中很多專家都會對阿裡目前的容器技術感興趣。到底阿裡玩容器是一個俠之大者,還是後起之秀呢?以過去看未來,技術領域尤其如此,技術的沉澱與積累,大緻可以看清一家公司的技術實力。

<b>Pouch 演進</b>

追溯 Pouch 的曆史,我們會發現 Pouch 起源于 2011 年。當時,Linux 核心之上的 namespace、cgroup 等技術開始成熟,LXC 等工具也在同時期誕生不久。阿裡巴巴作為一家技術公司,即基于 LXC 研發了容器技術 t4,并在當時以産品形态給集團内部提供服務。此舉被視為阿裡對容器技術的第一次探索,也為阿裡的容器技術積澱了最初的經驗。随着時間的推移,兩年後,Docker 橫空出世,其鏡像技術層面,極大程度上解決了困擾行業多年的“軟體封裝”問題。鏡像技術流行開來後,阿裡沒有理由不去融合這個給行業帶來巨大價值的技術。于是,在 2015 年,t4 在自身容器技術的基礎上,逐漸吸收社群中的 Docker 鏡像技術,慢慢演變,打磨為 Pouch。

帶有鏡像創新的容器技術,似一陣飓風,所到之處,國内外無不叫好,阿裡巴巴不外如是。2015 年末始,阿裡巴巴集團内部在基礎設施層面也在悄然發生變化。原因很多,其中最簡單的一條,相信大家也不難了解,阿裡巴巴體量的網際網路公司,背後必定有巨大的資料中心在支撐,業務的爆炸式增長,必定導緻基礎設施需求的增長,也就造成基礎設施成本的大幅提高。容器的輕量級與資源消耗低,加上鏡像的快速分發,迅速讓阿裡巴巴下定決心,在容器技術領域加大投入,幫助資料中心全面更新。

<b>阿裡容器規模</b>

經過兩年多的投入,阿裡容器技術 Pouch 已經在集團基礎技術中,扮演着極其重要的角色。2017 年雙 11,巨額交易 1682 億背後,Pouch 在“超級工程”中做到了:

100% 的線上業務 Pouch 化

容器規模達到百萬級

回到阿裡集團内部,Pouch 的日常服務已經覆寫絕大部分的事業部,覆寫的業務場景包括:電商、廣告、搜尋等;覆寫技術棧包括:電商應用、資料庫、大資料、流計算等;覆寫程式設計語言:Java、C++、NodeJS 等。

<b>Pouch 技術優勢</b>

阿裡巴巴容器技術如此之廣的應用範圍,對行業來說實屬一大幸事,因為阿裡已經用事實說明:容器技術已經在大規模生産環境下得到驗證。然而,由于 Pouch 源自阿裡,而非社群,是以在容器效果、技術實作等方面,兩套體系存在差異。換言之,Pouch 存在不少獨有的技術優勢。

<b>隔離性強</b>

隔離性是企業走雲化之路過程中,無法回避的一個技術難題。隔離性強,意味着技術具備了商用的初步條件;反之則幾乎沒有可能在業務線上鋪開。哪怕是阿裡巴巴這樣的技術公司,實踐容器技術伊始,安全問題都無法幸免。衆所周知,行業中的容器方案大多基于 Linux 核心提供的 cgroup 和 namespace 來實作隔離,然後這樣的輕量級方案存在弊端:

容器間,容器與宿主間,共享同一個核心;

核心實作的隔離資源,次元不足。

面對如此的核心現狀,阿裡巴巴采取了三個方面的工作,來解決容器的安全問題:

使用者态增強容器的隔離次元,比如網絡帶寬、磁盤使用量等;

給核心送出 patch,修複容器的資源可見性問題,cgroup 方面的 bug;

實作基于 Hypervisor 的容器,通過建立新核心來實作容器隔離。

容器安全的研究,在行業中将會持續相當長時間。而阿裡在開源 Pouch 中,将在原有的安全基礎上,繼續融合 lxcfs 等特性與社群共享。同時阿裡巴巴也在計劃開源“阿裡核心”,将多年來阿裡對 Linux 核心的增強回饋行業。

<b>P2P 鏡像分發</b>

随着阿裡業務爆炸式增長,以及 2015 年之後容器技術的迅速普及,阿裡容器鏡像的分發也同時成為亟待解決的問題。雖然,容器鏡像已經幫助企業在應用檔案複用等方面,相較傳統方法做了很多優化,但是在數以萬計的叢集規模下,分發效率依然令人抓狂。舉一個簡單例子:如果資料中心中有 10000 台實體節點,每個節點同時向鏡像倉庫發起鏡像下載下傳,鏡像倉庫所在機器的網絡壓力,CPU 壓力可想而知。

基于以上場景,阿裡巴巴鏡像分發工具“蜻蜓”應運而生。蜻蜓是基于智能 P2P 技術的通用檔案分發系統。解決了大規模檔案分發場景下分發耗時、成功率低、帶寬浪費等難題。大幅提升釋出部署、資料預熱、大規模容器鏡像分發等業務能力。目前,“蜻蜓”和 Pouch 同時開源,項目位址為:

<a href="https://github.com/alibaba/dragonfly" target="_blank">https://github.com/alibaba/dragonfly </a>

Pouch 與蜻蜓的使用架構圖如下:

阿裡巴巴正式開源其自研容器技術Pouch

<b>富容器技術</b>

阿裡巴巴集團内部囊括了各式各樣的業務場景,幾乎每種場景都對 Pouch 有着自己的要求。如果使用外界“單容器單程序”的方案,在業務部門推行容器化存在令人難以置信的阻力。阿裡巴巴内部,基礎技術起着巨大的支撐作用,需要每時每刻都更好的支撐業務的運作。當業務運作時,技術幾乎很難做到讓業務去做改變,反過來适配自己。是以,一種對應用開發、應用運維都沒有侵入性的容器技術,才有可能大規模的迅速鋪開。否則的話,容器化過程中,一方面得不到業務方的支援,另一方面也需要投入大量人力幫助業務方,非标準化的實作業務運維。

阿裡深谙此道,内部的 Pouch 技術可以說對業務沒有任何的侵入性,也正是因為這一點在集團内部做到 100% 容器化。這樣的容器技術,被無數阿裡人稱為“富容器”。

“富容器”技術的實作,主要是為了在 Linux 核心上建立一個與虛拟機體驗完全一緻的容器。如此一來,比一般容器要功能強大,内部有完整的 init 程序,以及業務應用需要的任何服務,當然這也印證了 Pouch 為什麼可以做到對應用沒有“侵入性”。技術的實作過程中,Pouch 需要将容器的執行入口定義為 systemd,而在核心态,Pouch 引入了 cgroup namespace 這一最新的核心 patch,滿足 systemd 在富容器模式的隔離性。從企業運維流程來看,富容器同樣優勢明顯。它可以在應用的 Entrypoint 啟動之前做一些事情,比如統一要做一些安全相關的事情,運維相關的 agent 拉起。這些需要統一做的事情,倘若放到使用者的啟動腳本,或鏡像中就對使用者的應用誕生了侵入性,而富容器可以透明的處理掉這些事情。

<b>核心相容性</b>

容器技術的井噴式發展,使得不少走在技術前沿的企業享受到技術紅利。然後,“長尾效應”也注定技術演進存在漫長周期。Pouch 的發展也在規模化程序中遇到相同問題。

但凡規模達到一定量,“摩爾定律”決定了資料中心會存有遺留資源,如何利用與處理這些實體資源,是一個大問題。阿裡集團内部也是如此,不管是不同型号的機器,還是從 2.6.32 到 3.10+ 的 Linux 核心,異構現象依然存在。倘若要使所有應用運作 Pouch 之中,Pouch 就必須支援所有核心版本,而現有的容器技術支援的 Linux 核心都在 3.10 以上。不過技術層面萬幸的是,對 2.6.32 等老版本核心而言,namespace 的支援僅僅缺失 user namespace;其他 namespace 以及常用的 cgroup 子系統均存在;但是 /proc/self/ns 等用來記錄 namespace 的輔助檔案當時還不存在,setns 等系統調用也需要在高版本核心中才能支援。而阿裡的技術政策是,通過一些其他的方法,來繞過某些系統調用,實作老版本核心的容器支援。

當然,從另一個角度而言,富容器技術也很大程度上,對老版本核心上的其他運維系統、監控系統、使用者使用習慣等實作了适配,保障 Pouch 在核心相容性方面的高可用性。

是以綜合來看,在 Pouch 的技術優勢之上,我們不難發現适用 Pouch 的應用場景:傳統 IT 架構的的迅速容器化,企業大規模業務的部署,安全隔離要求高穩定性要求高的金融場景等。

<b>Pouch 架構</b>

憑借差異化的技術優勢,Pouch 在阿裡巴巴大規模的應用場景下已經得到很好的驗證。然而,不得不說的是:目前阿裡巴巴内部的 Pouch 與目前開源版本依然存在一定的差異。

雖然優勢明顯,但是如果把内部的 Pouch 直接開源,這幾乎是一件不可能的事。多年的發展,内部 Pouch 在服務業務的同時,存在與阿裡内部基礎設施、業務場景耦合的情況。耦合的内容,對于行業來說通用性并不強,同時涉及一些其他問題。是以,Pouch 開源過程中,第一要務即解耦内部依賴,把最核心的、對社群同樣有巨大價值的部分開源出來。同時,阿裡希望在開源的最開始,即與社群站在一起,共建 Pouch 的開源社群。随後,以開源版本的 Pouch 逐漸替換阿裡巴巴集團内部的 Pouch,最終達成 Pouch 内外一緻的目标。當然,在這過程中,内部 Pouch 的解耦工作,以及插件化演進工作同樣重要。而在 Pouch 的開源計劃中,明年 3 月底會是一個重要的時間點,彼時 Pouch 的 1.0 版本将釋出。

從計劃開源的第一刻開始,Pouch 在生态中的架構圖就設計如下:

阿裡巴巴正式開源其自研容器技術Pouch

Pouch 的生态架構可以從兩個方面來看:第一,如何對接容器編排系統;第二,如何加強容器運作時。

容器編排系統的支援,是 Pouch 開源計劃的重要闆塊。是以,設計之初,Pouch 就希望自身可以原生支援 Kubernetes 等編排系統。為實作這點,Pouch 在行業中率先支援 container 1.0.0。目前行業中的容器方案 containerd 主要停留在 0.2.3 版本,新版本的安全等功能還無法使用,而 Pouch 已經是第一個吃螃蟹的人。目前 Docker 依然是 Kubernetes 體系中較火的容器引擎方案,而 Kubernetes 在 runtime 層面的戰略計劃為使用 cri-containerd 降低自身與商業産品的耦合度,而走相容社群方案的道路,比如 cri-containerd 以及 containerd 社群版。另外,需要額外提及的是,内部的 Pouch 是阿裡巴巴排程系統 Sigma 的重要組成部分,同時支撐着“混部”工程的實作。Pouch 開源路線中,同樣會以支援“混部”為目标。未來,Sigma 的排程(scheduling)以及混部(co-location)能力有望服務行業。

生态方面,Pouch 立足開放;容器運作時方面,Pouch 主張“豐富”與“安全”。runC 的支援,可謂順其自然。runV 的支援,則表現出了和生态的差異性。雖然 docker 預設支援 runV,然而在 docker 的 API 中并非做到對“容器”與“虛拟機”的相容,進而 Docker 并非是一個統一的管理入口。而據我們所知,現有企業中仍有衆多存量虛拟機的場景,是以,在迎接容器時代時,如何通過統一的運維入口,同時管理容器和虛拟機,勢必會是“虛拟機邁向容器”這個變遷過渡期中,企業最為關心的方案之一。Pouch 的開源形态,很好的覆寫了這一場景。runlxc 是阿裡巴巴自研的 lxc 容器運作時,Pouch 對其的支援同時也意味着 runlxc 會在不久後開源,覆寫企業内部擁有大量低版本 Linux 核心的場景。

Pouch 對接生态的架構如下,而 Pouch 内部自身的架構可參考下圖:

阿裡巴巴正式開源其自研容器技術Pouch

和傳統的容器引擎方案相似,Pouch 也呈現出 C/S 的軟體架構。指令行 CLI 層面,可以同時支援 Pouch CLI 以及 Docker CLI。對接容器 runtime,Pouch 内部通過 container client 通過 gRPC 調用 containerd。Pouch Daemon 的内部采取元件化的設計理念,抽離出相應的 System Manager、Container Manager、Image Manager、Network Manager、Volume Manager 提供統一化的對象管理方案。

<b>寫在最後</b>

如今 Pouch 的開源,意味着阿裡積累的容器技術将走出阿裡,面向行業。而 Pouch 的技術優勢,決定了其自身會以一個差異化的容器解決方案,供使用者選擇。企業在走雲化之路,擁抱雲原生(Cloud Native)時,Pouch 緻力于成為一款強有力的軟體,幫助企業的數字化轉型做到最穩定的支援。

Pouch 目前已經在 GitHub 上開源,歡迎任何形式的開源參與。GitHub 位址為: 

<b>作者介紹</b>

孫宏亮,阿裡巴巴技術專家,畢業于浙江大學,目前在阿裡巴巴負責容器項目 Pouch 的開源建設。數年來一直從事雲計算領域,是國内第一批研究和實踐容器技術的工程師,在國内起到極為重要的容器技術布道作用。擁有著作《Docker 源碼分析》,個人崇尚開源精神,同時是 Docker Swarm 項目的全球 Maintainer。

繼續閱讀