侯前明
我于2009年加入阿里,那時(shí),阿里還沒有容器產(chǎn)品。當(dāng)時(shí),阿里進(jìn)行了有史以來最大的架構(gòu)升級,即從集中式走向分布式。架構(gòu)升級后,淘寶從最初的應(yīng)用拆分成很多小服務(wù),通過軟負(fù)載做負(fù)載均衡,很多服務(wù)協(xié)同完成整個(gè)淘寶的功能。隨著服務(wù)拆分、業(yè)務(wù)量增長,服務(wù)拆分得越來越細(xì)。分布式服務(wù)架構(gòu)的演進(jìn)經(jīng)歷了很多年,到現(xiàn)在也還是基本模式。分布式服務(wù)拆分對運(yùn)維層面造成的最大挑戰(zhàn)是服務(wù)的實(shí)例變多了,由于服務(wù)的單個(gè)實(shí)例在物理機(jī)上面,所以物理服務(wù)器在分布式服務(wù)拆分之后不夠用了。當(dāng)時(shí),引進(jìn)了虛擬化技術(shù),把一臺(tái)物理機(jī)分成三臺(tái),數(shù)量一下翻了三倍,一段時(shí)間內(nèi)撐住了業(yè)務(wù)的增長。但是,虛擬化技術(shù)存在很多的問題。比如,它是有開銷的,一些技術(shù)本身受瓶頸限制,使得一臺(tái)物理機(jī)不能虛擬出多臺(tái)使用,物理機(jī)的利用率很低。我們在思考,用什么方法能把物理機(jī)的資源做更小力度的拆分,讓一臺(tái)物理機(jī)運(yùn)行更多的服務(wù)實(shí)例。
我們考察了淘寶業(yè)務(wù)量的增長,分布式服務(wù)體系把服務(wù)拆分得非常多、非常細(xì),隨著服務(wù)的拆分,功能不斷完善,新成立了一套支撐分布式服務(wù)架構(gòu)的運(yùn)維體系。這個(gè)運(yùn)維體系對服務(wù)實(shí)例的運(yùn)行有四點(diǎn)要求:第一,要有獨(dú)立的IP;第二,能夠ssh登陸;第三,有獨(dú)立的、隔離的文件系統(tǒng);第四,資源隔離—使用量和可見性。我們嘗試根據(jù)這四點(diǎn)要求模擬一個(gè)虛擬化環(huán)境,讓服務(wù)跑起來,有獨(dú)立的IP,用虛擬的網(wǎng)卡,在自己的內(nèi)核上做PouchContainer,實(shí)現(xiàn)內(nèi)核可見性隔離。經(jīng)過驗(yàn)證,模擬的虛擬化環(huán)境能夠行得通,阿里容器第一代版本正式實(shí)施。
阿里容器第一代在2015年已經(jīng)有很廣泛的應(yīng)用,應(yīng)用范圍包括在線業(yè)務(wù)、電商、業(yè)務(wù)系統(tǒng)。2015年,我們仔細(xì)研究了Docker,我們看到Docker系統(tǒng)化解決文件的構(gòu)建,可以非常明確的定義服務(wù)實(shí)例,使運(yùn)行時(shí)的環(huán)境可以被重建恢復(fù)、可以很方便地分發(fā),所以我們把Docker鏡像機(jī)制引入阿里容器里,形成了現(xiàn)在的Pouch Container產(chǎn)品形態(tài)。我們引入Docker鏡像系統(tǒng)之后,面臨的第一個(gè)問題是怎么讓鏡像在大規(guī)模的現(xiàn)場環(huán)境快速分發(fā)。我們引入Docker鏡像之前,應(yīng)用服務(wù)交付的產(chǎn)物是一個(gè)代碼包,只有幾百兆,要依賴基礎(chǔ)的SDK、基礎(chǔ)的二方和三方以及系統(tǒng)服務(wù)。那時(shí),我們的規(guī)模服務(wù)量非常多,倉庫的壓力和網(wǎng)絡(luò)的壓力非常大,我們引入了P2P技術(shù),通過P2P二級分發(fā)網(wǎng)絡(luò)來解決鏡像分發(fā)的問題。
阿里巴巴集團(tuán)的測試環(huán)境很特殊,應(yīng)用服務(wù)非常多,鏡像做開發(fā)時(shí)經(jīng)常超時(shí)、經(jīng)常卡頓。我們做了一個(gè)方案,把應(yīng)用的鏡像直接放到遠(yuǎn)端的分布式存儲(chǔ)里面,鏡像構(gòu)建的時(shí)候每一層都推到遠(yuǎn)端的分布式存儲(chǔ)集群里面,把遠(yuǎn)端的ID作為內(nèi)容傳到倉庫,然后把ID遠(yuǎn)程到本地,到本地目錄里面做文件系統(tǒng),再映射到容器里面。這樣處理后,在容器啟動(dòng)時(shí),一啟動(dòng)看到遠(yuǎn)程盤,執(zhí)行使用文件時(shí)才做原始加載,從而在分發(fā)期解決了超時(shí)和卡頓的問題。這個(gè)過程中,我們支持對遠(yuǎn)程分布式存儲(chǔ)系統(tǒng)的對接,包括容器編排系統(tǒng)和容器遠(yuǎn)程分布式系統(tǒng)的對接。阿里巴巴集團(tuán)內(nèi)部有多個(gè)網(wǎng)絡(luò)環(huán)境,虛擬化網(wǎng)絡(luò)集團(tuán)內(nèi)部也在做網(wǎng)絡(luò)的虛擬化,有一些微鏈的網(wǎng)絡(luò),內(nèi)部有插件去適配不同的網(wǎng)絡(luò)環(huán)境,容器編排系統(tǒng)叫Sigma。2018年開始做全面兼容的接口,演化的過程需要CNA的接口,我們做了到內(nèi)部網(wǎng)絡(luò)插件的適配。我們內(nèi)部的在線系統(tǒng)向無盤化演進(jìn),操作系統(tǒng)在做遠(yuǎn)程加載,鏡像在做遠(yuǎn)程化,應(yīng)用本身的數(shù)據(jù)和日志在做分離,最終形態(tài)是計(jì)算節(jié)點(diǎn)只跑計(jì)算服務(wù)。
阿里巴巴從2012年開始,都是基于Pouch引入鏡像化,Pouch支持了絕大部分在線業(yè)務(wù),現(xiàn)在的實(shí)例有百萬的級別。我們覆蓋不同的模式、不同的場景、不同的編程語言和監(jiān)測站,也包括新興的業(yè)務(wù)。阿里巴巴從2011年開始推動(dòng)內(nèi)部產(chǎn)品開源,目前阿里巴巴開源和維護(hù)的開源項(xiàng)目有150多個(gè),涵蓋中間件、開發(fā)框架、數(shù)據(jù)庫和各種工具類軟件。Pouch Container于2017年初醞釀開源,和浙江大學(xué)SEL實(shí)驗(yàn)室合作孵化,2017年11月正式開源。我們內(nèi)部的Pouch版本和內(nèi)部的運(yùn)維體系、工具體系監(jiān)控,有非常緊密的集成,耦合性比較多,解決方法不夠通用,沒辦法把代碼直接放出來。所以,我們的開源項(xiàng)目是在外部重新孵化。
Pouch Container現(xiàn)在的版本已經(jīng)到了Pouch Container0.5,準(zhǔn)備于2018年“雙11”返遷集團(tuán)內(nèi)部,讓一部分業(yè)務(wù)使用起來。Pouch Container開源過程中的策略是盡量融入社區(qū)生態(tài),追隨社區(qū)的標(biāo)準(zhǔn)、規(guī)范和接口。Pouch Container開源希望提供獨(dú)特價(jià)值:友好的兼容性,更好的隔離性;存量業(yè)務(wù)的快速容器化支持;規(guī)?;瘧?yīng)用中的最佳實(shí)踐沉淀。我們在容器核心的管理層用了RunD,內(nèi)部存儲(chǔ)管理系統(tǒng)會(huì)引入CSI對接存儲(chǔ)和容器。同時(shí),會(huì)在內(nèi)部適配網(wǎng)絡(luò)環(huán)境,在外部用通用的方式去適配外部環(huán)境。但是,外部特殊的解決方式不太通用,我們引入一些開源解決方案來解決特定問題。比如,我們引入lxcfs、采用prjquota等。Pouch Container的開源之路,已經(jīng)形成開源的生態(tài)架構(gòu),開源項(xiàng)目已經(jīng)開發(fā),已經(jīng)有60多個(gè)貢獻(xiàn)者。 (根據(jù)演講內(nèi)容整理,未經(jīng)本人審核)