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