導(dǎo)讀:2017年天貓雙十一再次刷新了記錄, 交易峰值32.5萬筆/秒,支付峰值25.6萬次/秒。
往往在大促等高峰時段都需要對流量提前預(yù)估,但實際上預(yù)先計算好的資源和應(yīng)用容量,依然可能不足以支撐流量高峰,需要緊急擴容;而容器技術(shù)則非常適合這種場景,在需要時快速地、自動彈性伸縮。那么在業(yè)務(wù)需求極速上升的情況下,大量服務(wù)器資源啟動時如何抗住并發(fā)部署的壓力呢?
在本次雙十一期間容器鏡像服務(wù)參與并提供了服務(wù)支撐,其具備在十分鐘之內(nèi)快速萬臺服務(wù)其部署的能力。
作為一種輕量級的虛擬化技術(shù),容器技術(shù)所具備的敏捷、可移植、可控性,使得它一經(jīng)推出就受到眾多開發(fā)者的追捧。但其實更重要的是,容器技術(shù)定義了一種標準化的交付方式——容器鏡像。
容器鏡像將應(yīng)用的代碼以及代碼環(huán)境依賴都都打包在一起,這是一個與環(huán)境無關(guān)的交付物,可以應(yīng)用在軟件生命周期的任何階段。就像集裝箱改變了傳統(tǒng)的運輸體系,創(chuàng)造了容器鏡像的容器技術(shù)徹底改變了傳統(tǒng)的軟件交付模式。
縱觀全球,整個容器技術(shù)在近三年得到了爆發(fā)式的增長。據(jù)統(tǒng)計有67%的企業(yè)在生產(chǎn)環(huán)節(jié)或者嘗試在生產(chǎn)環(huán)節(jié)中使用Docker,幫助他們敏捷進化,提高研發(fā)交付的效率。據(jù)Docker Con 2017的統(tǒng)計,近三年應(yīng)用數(shù)增長了30倍,約有百萬級別的容器化應(yīng)用數(shù)。而容器鏡像的拉取個數(shù),近三年更是趨于了指數(shù)級別增長,承載了約110億次拉取。
DockerCon2017年容器鏡像拉取情況的最新統(tǒng)計
早在2015年,阿里巴巴就在嘗試使用容器技術(shù)。2016年雙十一就已經(jīng)將所有交易核心應(yīng)用容器化,幾十萬容器撐起了雙 11 交易 17.5 萬筆/秒的下單峰值。而在今年雙十一,阿里巴巴已在集團范圍實現(xiàn)在線服務(wù)全部容器化,內(nèi)部已達到百萬級容器部署規(guī)模,其中雙十一交易峰值到32.5萬筆/秒并且可以實現(xiàn)十分鐘內(nèi)萬臺服務(wù)器的快速部署。
截止目前,容器鏡像服務(wù)支撐了集團10萬鏡像的托管,共計2億次的鏡像下載量。
在早期的容器推行演練中,由于當時發(fā)布系統(tǒng)日均的發(fā)布量上萬,很多應(yīng)用的規(guī)模開始破萬,發(fā)布失敗率開始增高,影響到了業(yè)務(wù)的正常迭代流程。這個困境的根本問題在于發(fā)布過程大量大應(yīng)用鏡像拉取的需求,而應(yīng)用鏡像內(nèi)容過于冗余臃腫,彼時存在大量超過5G的大鏡像,文件服務(wù)器扛不住大量的請求。
為了解決多規(guī)模、并發(fā)情況下容器鏡像的獲取問題,我們考慮了容器鏡像大小、容器內(nèi)容加速及流控、鏡像Registry性能等三個大維度的優(yōu)化。
容器鏡像大小優(yōu)化
Action 1:之前將所有的構(gòu)建過程編寫在同一個Dockerfile中,包括應(yīng)用及其依賴庫的編譯、測試、打包等流程,這里可能會帶來的一些問題:鏡像臃腫、鏡像層次嵌套深、也可能存在源代碼泄露的風險。我們進行了多階段鏡像構(gòu)建優(yōu)化,將鏡像制作過程中的中間產(chǎn)物與最終鏡像構(gòu)建產(chǎn)物分離,形成最精簡的應(yīng)用鏡像。
多階段鏡像構(gòu)建優(yōu)化后獲取最精簡應(yīng)用鏡像
Action 2:將功能統(tǒng)一的命令聚合到同一層來完成,將使用頻繁的應(yīng)用或環(huán)境制作成基礎(chǔ)鏡像復(fù)用,盡可能減少鏡像的層數(shù)。
容器內(nèi)容加速和流控
在大規(guī)模的鏡像分發(fā)場景之下,優(yōu)化鏡像本身的大小作用有限,我們依然需要考慮如何從系統(tǒng)上提升鏡像拉取的性能。最初很容易想到服務(wù)器擴容,可是擴容后又發(fā)現(xiàn)后端存儲成為瓶頸。此外,大量來自不同IDC的客戶端請求消耗了巨大的網(wǎng)絡(luò)帶寬,造成網(wǎng)絡(luò)擁堵。同時,很多業(yè)務(wù)走向國際化,大量的應(yīng)用部署在海外,海外服務(wù)器下載要回源國內(nèi),浪費了大量的國際帶寬,而且還很慢;如果傳輸大文件,網(wǎng)絡(luò)環(huán)境差,失敗的話又得重來一遍,效率極低。
為了解決這些問題,阿里推出了蜻蜓這個產(chǎn)品。蜻蜓通過使用P2P技術(shù)同時結(jié)合智能壓縮、智能流控等多種創(chuàng)新技術(shù),解決大規(guī)模文件下載以及跨網(wǎng)絡(luò)隔離等場景下各種文件分發(fā)難題,大幅提高數(shù)據(jù)預(yù)熱、大規(guī)模容器鏡像分發(fā)等業(yè)務(wù)能力。
在本地機器使用了分層的方式來下載鏡像,下面介紹下DockerPull的執(zhí)行過程:
Docker 鏡像分層下載圖
Docker Daemon調(diào)用RegistryAPI得到鏡像的Manifest,從Manifest中能算出每層的URL,Daemon隨后把所有鏡像層從Registry并行下載到Host本地倉庫。
所以最終,鏡像傳輸?shù)膯栴}變成了各鏡像層文件的并行下載的問題。而蜻蜓擅長的正是將每層鏡像文件從Registry用P2P模式傳輸?shù)奖镜貍}庫中。
那么具體又是如何做到的呢?
事實上蜻蜓會在Host上啟動proxy,Docker Engine的所有命令請求都會通過這個proxy,我們看下圖:
蜻蜓P2P容器鏡像分發(fā)示意圖
首先,docker pull命令,會被dfget proxy截獲。然后,由dfget proxy向CM發(fā)送調(diào)度請求,CM在收到請求后會檢查對應(yīng)的下載文件是否已經(jīng)被緩存到本地,如果沒有被緩存,則會從Registry中下載對應(yīng)的文件,并生成種子分塊數(shù)據(jù)(種子分塊數(shù)據(jù)一旦生成就可以立即被使用);如果已經(jīng)被緩存,則直接生成分塊任務(wù),請求者解析相應(yīng)的分塊任務(wù),并從其他peer或者supernode中下載分塊數(shù)據(jù),當某個Layer的所有分塊下載完成后,一個Layer也就下載完畢了,同樣,當所有的Layer下載完成后,整個鏡像也就下載完成了。
蜻蜓支持多種容器技術(shù),對容器本身無需做任何改造,鏡像分發(fā)比natvie方式提速可高達57倍,Registry網(wǎng)絡(luò)出流量降低99.5%以上。為阿里巴巴業(yè)務(wù)的極速擴張和雙十一大促保駕護航。
鏡像Registry性能優(yōu)化
蜻蜓利用P2P的模式解決了從Registry獲取鏡像層并傳輸?shù)奖镜氐膯栴},不過當鏡像拉取規(guī)模在幾萬并發(fā)的量級的時候,從Registry獲取鏡像的Manifest也會成為性能瓶頸。容器鏡像服務(wù)從代碼層面、基礎(chǔ)設(shè)施層面做了很多定制化的增強:
在代碼層面:容器鏡像服務(wù)增加了對于Docker Registry優(yōu)化,根據(jù)之前的鏡像請求,自動分析熱點數(shù)據(jù)并增加了熱點數(shù)據(jù)的緩存,從容應(yīng)對大規(guī)模并發(fā)下鏡像Manifest的拉取。增加了對鏡像下載源的動態(tài)判斷,根據(jù)鏡像下載請求的不同來源,自動返回離鏡像下載最近的Registry地址。
在基礎(chǔ)設(shè)施層面:為了應(yīng)對流量的突發(fā),容器鏡像服務(wù)加強了針對Registry流量、存儲的多維度監(jiān)控,定時進行監(jiān)控探活,并且實時收集監(jiān)控數(shù)據(jù),當達到監(jiān)控閾值,Registry會自動進行報警和基礎(chǔ)設(shè)施的彈性擴容。
自2015年起面向阿里集團內(nèi)部和對阿里云容器服務(wù)提供支撐以來,阿里云容器鏡像技術(shù)積累了深厚的經(jīng)驗。一般而言,大家認為容器鏡像服務(wù)是為用戶提供了安全穩(wěn)定的鏡像托管能力,但是實際上并不至于此:除了鏡像托管以及鏡像的上傳下載之外,容器鏡像服務(wù)還包含了從鏡像構(gòu)建到應(yīng)用部署等一整套的DevOps能力。
為了將阿里巴巴在容器技術(shù)上的積累帶給云上用戶,容器鏡像服務(wù)于2017年10月30日正式對外公測。容器鏡像服務(wù)(ContainerRegistry)免費提供了安全的鏡像托管能力,穩(wěn)定的國內(nèi)外鏡像構(gòu)建服務(wù),便捷的鏡像授權(quán)功能,方便用戶在云上進行容器鏡像全生命周期管理,體驗容器技術(shù)帶來的敏捷變革。
1)全球多地域支持及鏡像加速器:
阿里云容器鏡像服務(wù)提供了全球多地域支持,用戶可以在自己業(yè)務(wù)地就近托管容器鏡像,保障應(yīng)用鏡像的極速上傳、下載操作。我們也為每一位用戶提供了新一代專屬鏡像加速器,通過鏡像加速器可以快速獲取國外優(yōu)秀的鏡像。鏡像加速器采用了自主研發(fā)的智能路由及動態(tài)緩存技術(shù),極大提升了鏡像的下載速度和用戶體驗。并且完全兼容 Docker 原生參數(shù)配置方式,支持 Linux、MacOS、Windows 三大平臺。目前,容器鏡像服務(wù)已經(jīng)加速了千萬次的鏡像拉取,幫助用戶節(jié)省超過十萬個小時。
2)多階段構(gòu)建:
阿里云容器鏡像服務(wù)提供了豐富穩(wěn)定的鏡像構(gòu)建功能,包含自動構(gòu)建、海外構(gòu)建、多階段構(gòu)建(multi-stage build)支持,方便打造云上容器DevOps最佳實踐。用戶可以將應(yīng)用代碼托管在阿里云Code、Github、Bitbucket或者自建的GitLab之上,通過容器鏡像服務(wù)多階段構(gòu)建功能或者阿里云CodePipline進行代碼編譯測試,構(gòu)建完成后的鏡像將推送至容器鏡像服務(wù)托管。最后通過容器鏡像服務(wù)上的webhook,動態(tài)通知容器服務(wù)集群上相應(yīng)的應(yīng)用重新部署。
通過整個解決方案,用戶在將代碼提交至線上之后,可以實現(xiàn)自動的代碼測試,測試通過后應(yīng)用自動構(gòu)建成鏡像,最終部署到測試、預(yù)發(fā)或者生產(chǎn)環(huán)境的集群上。
阿里云容器化DevOps流程圖
3) 鏡像安全掃描
鏡像已經(jīng)成為企業(yè)的核心資產(chǎn),企業(yè)軟件交付流水線的中心,線上的應(yīng)用的安全問題也是至關(guān)重要的。容器鏡像服務(wù)提供了便捷的鏡像安全掃描功能,提供多維度的鏡像漏洞報告。鏡像漏洞報告中包含漏洞的CVE編號、漏洞的等級、漏洞位置及官方和社區(qū)提供的漏洞修復(fù)方案。
阿里云容器鏡像安全掃描示意圖
容器鏡像服務(wù)通過Registry性能優(yōu)化,蜻蜓通過P2P技術(shù)結(jié)合智能壓縮和流控等方案,共同解決了大規(guī)模文件下載以及跨網(wǎng)絡(luò)隔離等場景下各種文件分發(fā)難題,在阿里已然成為重要的基礎(chǔ)設(shè)施之一,為業(yè)務(wù)的極速擴張和雙十一大促保駕護航。
截止到目前為止,已經(jīng)有數(shù)萬用戶經(jīng)過容器鏡像服務(wù)(ContainerRegistry)享受了安全的鏡像托管能力、穩(wěn)定的國內(nèi)外鏡像構(gòu)建服務(wù)、便捷的鏡像授權(quán)功能,通過容器鏡像進行全生命周期管理。容器鏡像服務(wù)簡化了Registry的搭建運維工作,支持多地域的鏡像托管,并聯(lián)合容器服務(wù)、CodePipeline等云產(chǎn)品,為用戶打造云上使用Docker的一體化體驗。
作者簡介: