溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

技術(shù)解析系列 | PouchContainer 富容器技術(shù)

發(fā)布時(shí)間:2020-08-02 18:13:48 來源:網(wǎng)絡(luò) 閱讀:556 作者:阿里系統(tǒng)軟件技術(shù) 欄目:建站服務(wù)器





技術(shù)解析系列 | PouchContainer 富容器技術(shù)

劃重點(diǎn)

本文將從什么是富容器、富容器適用場景、富容器技術(shù)實(shí)現(xiàn)三個(gè)角度全方位向大家解釋富容器技術(shù),同時(shí)對(duì)富容器感興趣的同學(xué)可以掃描文章末尾二維碼參與關(guān)于富容器的技術(shù)討論。本文作者 PouchContainer 團(tuán)隊(duì)孫宏亮,更多信息掃描二維碼見真人。

PouchContainer 是阿里巴巴集團(tuán)開源的高效、輕量級(jí)企業(yè)級(jí)富容器引擎技術(shù),擁有隔離性強(qiáng)、可移植性高、資源占用少等特性。可以幫助企業(yè)快速實(shí)現(xiàn)存量業(yè)務(wù)容器化,同時(shí)提高超大規(guī)模下數(shù)據(jù)中心的物理資源利用率。


PouchContainer 源自阿里巴巴內(nèi)部場景,誕生初期,在如何為互聯(lián)網(wǎng)應(yīng)用保駕護(hù)航方面,傾盡了阿里巴巴工程師們的設(shè)計(jì)心血。PouchContainer 的強(qiáng)隔離、富容器等技術(shù)特性是最好的證明。在阿里巴巴的體量規(guī)模下,PouchContainer 對(duì)業(yè)務(wù)的支撐得到雙 11 史無前例的檢驗(yàn),開源之后,阿里容器成為一項(xiàng)普惠技術(shù),定位于「助力企業(yè)快速實(shí)現(xiàn)存量業(yè)務(wù)容器化」。


初次接觸容器技術(shù)時(shí),阿里巴巴內(nèi)部有著驚人規(guī)模的存量業(yè)務(wù),如何通過技術(shù)快速容器化存量業(yè)務(wù),是阿里容器技術(shù)當(dāng)年在內(nèi)部鋪開時(shí)的重點(diǎn)難題。發(fā)展到今天,開源容器技術(shù)逐漸普及,面對(duì)落地,相信不少存在大量存量業(yè)務(wù)的企業(yè),同樣為這些業(yè)務(wù)的如何容器化而犯愁。云原生領(lǐng)域,CNCF 基金會(huì)推崇的眾多先進(jìn)理念,絕大多數(shù)都建立在業(yè)務(wù)容器化的基礎(chǔ)之上。倘若企業(yè)業(yè)務(wù)在云原生的入口容器化方面沒有踩準(zhǔn)步點(diǎn),后續(xù)的容器編排、Service Mesh 等行業(yè)開源技術(shù)紅利更是無從談起。


通過七年的實(shí)踐經(jīng)驗(yàn),阿里巴巴容器技術(shù) PouchContainer 用事實(shí)向行業(yè)傳遞這樣的信息 —— 富容器是實(shí)現(xiàn)企業(yè)存量業(yè)務(wù)快速容器化的首選技術(shù)。


什么是富容器

富容器是企業(yè)打包業(yè)務(wù)應(yīng)用、實(shí)現(xiàn)業(yè)務(wù)容器化過程中,采用的一種容器模式。此模式可以幫助企業(yè)IT技術(shù)人員打包業(yè)務(wù)應(yīng)用時(shí),幾乎不費(fèi)吹灰之力。通過富容器技術(shù)打包的業(yè)務(wù)應(yīng)用可以達(dá)到以下兩個(gè)目的:


  • 容器鏡像實(shí)現(xiàn)業(yè)務(wù)的快速交付

  • 容器環(huán)境兼容企業(yè)原有運(yùn)維體系


技術(shù)角度而言,富容器提供了有效路徑,幫助業(yè)務(wù)在單個(gè)容器鏡像中除了業(yè)務(wù)應(yīng)用本身之外,還打包更多業(yè)務(wù)所需的運(yùn)維套件、系統(tǒng)服務(wù)等;同時(shí)相比于較為簡單的單進(jìn)程容器,富容器在進(jìn)程組織結(jié)構(gòu)層面,也有著巨大的變革:容器運(yùn)行時(shí)內(nèi)部自動(dòng)運(yùn)行 systemd 等管家進(jìn)程。如此一來,富容器模式下的應(yīng)用,有能力在不改變?nèi)魏螛I(yè)務(wù)代碼、運(yùn)維代碼的情況下,像在物理機(jī)上運(yùn)行一模一樣。可以說,這是一種更為通用的「面向應(yīng)用」的模式。


換言之,富容器在保障業(yè)務(wù)交付效率的同時(shí),在開發(fā)和運(yùn)維層面對(duì)應(yīng)用沒有任何的侵入性,從而有能力幫助 IT 人員更多聚焦業(yè)務(wù)創(chuàng)新。



適用場景

富容器的適用場景極廣??梢哉f企業(yè)幾乎所有的存量業(yè)務(wù),都可以采納富容器作為容器化方案首選。容器技術(shù)流行之前,有接近二十年的時(shí)間,企業(yè) IT 服務(wù)運(yùn)行在裸金屬或者虛擬機(jī)中。企業(yè)業(yè)務(wù)的穩(wěn)定運(yùn)行,有非常大的功勞來源于運(yùn)維工作,如果細(xì)分,包括「基礎(chǔ)設(shè)施運(yùn)維」以及「業(yè)務(wù)運(yùn)維」。所有的應(yīng)用運(yùn)行,都依賴于物理資源;所有的業(yè)務(wù)穩(wěn)定,都仰仗于監(jiān)控系統(tǒng)、日志服務(wù)等運(yùn)維體系。那么,我們有理由相信,在業(yè)務(wù)容器化過程中,企業(yè)堅(jiān)決不能對(duì)運(yùn)維體系置之不理,否則后果可想而知。


因此,存量業(yè)務(wù)容器化過程中,需要考慮兼容企業(yè)原有運(yùn)維體系的場景,都在 PouchContainer 富容器技術(shù)的使用范圍之內(nèi)。



富容器技術(shù)實(shí)現(xiàn)

既然可以業(yè)務(wù)兼容原有運(yùn)維體系,那么富容器技術(shù)又是通過什么樣的技術(shù)來實(shí)現(xiàn)的呢?下圖清晰的描述了富容器技術(shù)的內(nèi)部情況。


富容器技術(shù)可以完全百分百兼容社區(qū)的 OCI 鏡像,容器啟動(dòng)時(shí)將鏡像的文件系統(tǒng)作為容器的 rootfs。運(yùn)行模式上,功能層面,除了內(nèi)部運(yùn)行進(jìn)程,同時(shí)還包括容器啟停時(shí)的鉤子方法(prestart hook 和 poststop hook)。

富容器內(nèi)部運(yùn)行進(jìn)程

如果從內(nèi)部運(yùn)行進(jìn)程的角度來看待 PouchContainer 的富容器技術(shù),我們可以把內(nèi)部運(yùn)行進(jìn)程分為 4 類:


  • pid=1 的 init 進(jìn)程

  • 容器鏡像的 CMD

  • 容器內(nèi)部的系統(tǒng) service 進(jìn)程

  • 用戶自定義運(yùn)維組件


pid=1 的 init 進(jìn)程


富容器技術(shù)與傳統(tǒng)容器最明顯的差異點(diǎn),即容器內(nèi)部運(yùn)行一個(gè) init 進(jìn)程,而傳統(tǒng)的容器(如 docker 容器等)將容器鏡像中指定的 CMD 作為容器內(nèi) pid=1 的進(jìn)程。PouchContainer 的富容器模式可以運(yùn)行從三種 init 進(jìn)程中選擇:


  • systemd

  • sbin/init

  • dumb-init


眾所周知,傳統(tǒng)容器作為一個(gè)獨(dú)立運(yùn)行環(huán)境,內(nèi)部進(jìn)程的管理存在一定的弊端:比如無法回收僵尸進(jìn)程,導(dǎo)致容器消耗太多進(jìn)程數(shù)、消耗額外內(nèi)存等;比如無法友好管理容器內(nèi)部的系統(tǒng)服務(wù)進(jìn)程,導(dǎo)致一些業(yè)務(wù)應(yīng)用所需要的基本能力欠缺等,比如 cron 系統(tǒng)服務(wù)、syslogd 系統(tǒng)服務(wù)等;比如,無法支持一些系統(tǒng)應(yīng)用的正常運(yùn)行,主要原因是某些系統(tǒng)應(yīng)用需要調(diào)用 systemd 來安裝 RPM 包……


富容器的 init 進(jìn)程在運(yùn)維模式上,毫無疑問可以解決以上問題,給應(yīng)用帶來更好的體驗(yàn)。init 進(jìn)程在設(shè)計(jì)時(shí)就加入了可以 wait 消亡進(jìn)程的能力,即可以輕松解決上圖中業(yè)務(wù)進(jìn)程運(yùn)行過程中誕生的 Zombie 僵尸進(jìn)程;同時(shí)管理系統(tǒng)服務(wù)也是它的本職工作之一。如果一來,一些最為基本的傳統(tǒng)運(yùn)維能力,init 進(jìn)程即幫助用戶解決了大半,為運(yùn)維體系做好了堅(jiān)實(shí)的基礎(chǔ)。


容器鏡像的CMD


容器鏡像的 CMD,也就是傳統(tǒng)意義上我們希望在容器內(nèi)部運(yùn)行的業(yè)務(wù)。比如,用戶在容器化一個(gè) Golang 的業(yè)務(wù)系統(tǒng)打包成鏡像時(shí),肯定會(huì)在 Dockerfile 中將該業(yè)務(wù)系統(tǒng)的啟動(dòng)命令指定為 CMD,從而保證未來通過該鏡像運(yùn)行容器起,會(huì)執(zhí)行這條 CMD 命令運(yùn)行業(yè)務(wù)系統(tǒng)。


當(dāng)然,容器鏡像的 CMD 代表業(yè)務(wù)應(yīng)用,是整個(gè)富容器的核心部分,所有的運(yùn)維適配都是為了保障業(yè)務(wù)應(yīng)用更加穩(wěn)定的運(yùn)行。


容器內(nèi)系統(tǒng) service 進(jìn)程


服務(wù)器編程發(fā)展了數(shù)十年,很多的業(yè)務(wù)系統(tǒng)開發(fā)模式均基于裸金屬上的 Linux 操作系統(tǒng),或者虛擬化環(huán)境的下的 Linux 環(huán)境。長此以往,很多業(yè)務(wù)應(yīng)用的開發(fā)范式,會(huì)非常頻繁地與系統(tǒng)服務(wù)進(jìn)程交互。比如,使用 Java 編程語言編寫的應(yīng)用程序,很有可能通過 log4j 來配置日志的管理方式,也可以通過 log4j.properties 配置把應(yīng)用日志重定向到運(yùn)行環(huán)境中的 syslogd,倘若應(yīng)用運(yùn)行環(huán)境中沒有 syslogd 的運(yùn)行,則極有可能影響業(yè)務(wù)的啟動(dòng)運(yùn)行;再比如,業(yè)務(wù)應(yīng)用需要通過 crond 來管理業(yè)務(wù)需要的周期性任務(wù),倘若應(yīng)用運(yùn)行環(huán)境中沒有 crond 系統(tǒng)守護(hù)進(jìn)程,業(yè)務(wù)應(yīng)用也就不可能通過 crontab 來配置周期任務(wù);再比如,容器內(nèi)部的 sshd 系統(tǒng)服務(wù)系統(tǒng),可以快速幫助運(yùn)維工程師快速進(jìn)度應(yīng)用運(yùn)行現(xiàn)場,定位并解決問題等。


PouchContainer 的富容器模式,考慮到了行業(yè)大量有需求和系統(tǒng)服務(wù)交付的應(yīng)用,富容器內(nèi)部的 init 進(jìn)程有能力非常方面的原生管理多種系統(tǒng)服務(wù)進(jìn)程。


用戶自定義運(yùn)維組件


系統(tǒng)服務(wù)的存在可以輔助業(yè)務(wù)的正常運(yùn)行,但是很多情況下這還不夠,企業(yè)自身針對(duì)基礎(chǔ)設(shè)施以及應(yīng)用配備的運(yùn)維組件,同時(shí)起到為業(yè)務(wù)保駕護(hù)航的作用。比如,企業(yè)運(yùn)維團(tuán)隊(duì)需要統(tǒng)一化的為業(yè)務(wù)應(yīng)用貼近配置監(jiān)控組件;運(yùn)維團(tuán)隊(duì)必須通過自定義的日志 agent 來管理容器內(nèi)部的應(yīng)用日志;運(yùn)維團(tuán)隊(duì)需要自定義自己的基礎(chǔ)運(yùn)維工具,以便要求應(yīng)用運(yùn)行環(huán)境符合內(nèi)部的審計(jì)要求等。


正因?yàn)楦蝗萜鲀?nèi)部存在 init 進(jìn)程,用戶自定義的運(yùn)維組件,可以如往常健康穩(wěn)定的運(yùn)行,提供運(yùn)維能力。


富容器啟停執(zhí)行 hook

最終富容器內(nèi)部運(yùn)行的任務(wù)進(jìn)程,可以保障應(yīng)用的運(yùn)行時(shí)穩(wěn)定正常,然而對(duì)于運(yùn)維團(tuán)隊(duì)而言,負(fù)責(zé)內(nèi)容的范疇往往要比單一的運(yùn)行時(shí)廣得多。通俗而言,運(yùn)維的職責(zé)還需要覆蓋運(yùn)行時(shí)之前的環(huán)境準(zhǔn)備工作,以及運(yùn)行時(shí)結(jié)束后的善后工作。對(duì)于應(yīng)用而言,也就是我們通常意義上提到的 prestart hook 以及  poststop hook。


PouchContainer 的富容器模式,可以允許用戶非常方便的指定應(yīng)用的啟停執(zhí)行 hook: prestart hook 以及 poststop hook。 運(yùn)維團(tuán)隊(duì)指定 prestart hook,可以幫助應(yīng)用在運(yùn)行之前,在容器內(nèi)部做符合運(yùn)維需求的一些初始化操作,比如:初始化網(wǎng)絡(luò)路由表、獲取應(yīng)用執(zhí)行權(quán)限、下載運(yùn)行時(shí)所需的證書等。運(yùn)維團(tuán)隊(duì)指定 poststop hook,可以幫助應(yīng)用在運(yùn)行結(jié)束或者異常退出之后,執(zhí)行統(tǒng)一的善后工作,比如,對(duì)中間數(shù)據(jù)的清理以便下一次啟動(dòng)時(shí)的純凈環(huán)境;倘若是異常退出的話,可以即時(shí)匯報(bào)出錯(cuò)信息,滿足運(yùn)維需求等。


我們可以發(fā)現(xiàn),富容器內(nèi)部的啟停 hook,對(duì)容器的運(yùn)維能力又做了一層拔高,大大釋放了運(yùn)維團(tuán)隊(duì)對(duì)應(yīng)用的靈活管理能力。



總結(jié)

經(jīng)過阿里巴巴內(nèi)部大量業(yè)務(wù)的錘煉,PouchContainer 已經(jīng)幫助超大體量的互聯(lián)網(wǎng)公司實(shí)現(xiàn)了所有在線業(yè)務(wù)的容器化。毫無疑問,富容器技術(shù)是最為實(shí)用、對(duì)應(yīng)用開發(fā)以及應(yīng)用運(yùn)維沒有任何侵入性的一項(xiàng)技術(shù)。


開源的PouchContainer 更是希望技術(shù)可以普惠行業(yè),幫助大量的企業(yè)在存量業(yè)務(wù)的容器化方面,贏得自己的時(shí)間,快速擁抱云原生技術(shù),大步邁向數(shù)字化轉(zhuǎn)型。






向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI