中國(guó)五礦和阿里巴巴聯(lián)手打造的鋼鐵服務(wù)專業(yè)平臺(tái)五阿哥,通過(guò)集結(jié)阿里巴巴在大數(shù)據(jù)、電商平臺(tái)和互聯(lián)網(wǎng)產(chǎn)品技術(shù)上的優(yōu)勢(shì),為終端用戶帶來(lái)一站式采購(gòu)體驗(yàn)。本文是五阿哥運(yùn)維技術(shù)團(tuán)隊(duì)針對(duì)Docker容器技術(shù)在如何在持續(xù)交付過(guò)程中探索和實(shí)踐,目前已經(jīng)將發(fā)布部署權(quán)限開(kāi)放給應(yīng)用開(kāi)發(fā)的owner,實(shí)現(xiàn)7*24小時(shí)“一站式”的持續(xù)交付,整體提高了公司研發(fā)過(guò)程的交付能力。
前言
作為創(chuàng)業(yè)公司和推行DevOps工程師們來(lái)說(shuō),都遇到過(guò)這樣的問(wèn)題:
硬件資源利用率的問(wèn)題,造成部分成本的浪費(fèi)
在網(wǎng)站功能中不同的業(yè)務(wù)場(chǎng)景有計(jì)算型的、有IO讀寫(xiě)型的、有網(wǎng)絡(luò)型、有內(nèi)存型的,集中部署應(yīng)用就會(huì)導(dǎo)致資源利用率不合理的問(wèn)題。比如,一個(gè)機(jī)器上部署的服務(wù)都是內(nèi)存密集型,那么CPU資源就都很容易浪費(fèi)了。
單物理機(jī)多應(yīng)用無(wú)法對(duì)無(wú)法進(jìn)行有效的隔離,導(dǎo)致應(yīng)用對(duì)資源的搶占和相互影響
一個(gè)物理機(jī)器跑多個(gè)應(yīng)用,無(wú)法進(jìn)行所使用的CPU、內(nèi)存、進(jìn)程進(jìn)行限制,如果一個(gè)應(yīng)用出現(xiàn)對(duì)資源的搶占問(wèn)題,就會(huì)引起連鎖反應(yīng),最終導(dǎo)致網(wǎng)站部分功能不可用。
環(huán)境、版本管理復(fù)雜,上線部署流程缺乏,增加問(wèn)題排查的復(fù)雜度
由于內(nèi)部開(kāi)發(fā)流程的不規(guī)范,代碼在測(cè)試或者上線過(guò)程中,對(duì)一些配置項(xiàng)和系統(tǒng)參數(shù)進(jìn)行隨意的調(diào)整,在發(fā)布時(shí)進(jìn)行增量發(fā)布,一旦出現(xiàn)問(wèn)題,就會(huì)導(dǎo)致測(cè)試的代碼和線上運(yùn)行的代碼是不一致的,增加了服務(wù)上線的風(fēng)險(xiǎn),也增加了線上服務(wù)故障排查的難度。
環(huán)境不穩(wěn)定,遷移成本高,增加上線風(fēng)險(xiǎn)
在開(kāi)發(fā)過(guò)程中存在多個(gè)項(xiàng)目并行開(kāi)發(fā)和服務(wù)的依賴問(wèn)題,由于環(huán)境和版本的復(fù)雜性很高,不能快速搭建和遷移一個(gè)環(huán)境,導(dǎo)致無(wú)法在測(cè)試環(huán)境中無(wú)法模擬出線上的流程進(jìn)行測(cè)試,很多同學(xué)在線上環(huán)境進(jìn)行測(cè)試,這里有很高的潛在風(fēng)險(xiǎn),同時(shí)導(dǎo)致開(kāi)發(fā)效率降低。
傳統(tǒng)虛擬機(jī)和物理機(jī)占用空間大,啟動(dòng)慢,管理復(fù)雜等問(wèn)題
傳統(tǒng)虛擬機(jī)和物理機(jī)在啟動(dòng)過(guò)程進(jìn)行加載內(nèi)核,執(zhí)行內(nèi)核和init進(jìn)行,導(dǎo)致在啟動(dòng)過(guò)程占用很長(zhǎng)時(shí)間,而且在管理過(guò)程中會(huì)遇到各種各樣的管理問(wèn)題。
基于Docker容器技術(shù),運(yùn)維技術(shù)團(tuán)隊(duì)開(kāi)發(fā)了五阿哥網(wǎng)站的容器云平臺(tái)。通過(guò)容器云平臺(tái)95%的應(yīng)用服務(wù)已經(jīng)實(shí)現(xiàn)容器化部署。這些應(yīng)用支持業(yè)務(wù)按需拓展,秒級(jí)伸縮,提供與用戶友好的交互過(guò)程,規(guī)范了測(cè)試和生產(chǎn)的發(fā)布流程,讓開(kāi)發(fā)和測(cè)試同學(xué)從基礎(chǔ)的環(huán)境配置和發(fā)布解放出來(lái),使其更聚焦自己的項(xiàng)目開(kāi)發(fā)和測(cè)試。
圖1 五阿哥容器云整體架構(gòu)
結(jié)合五阿哥容器云平臺(tái)和Docker容器技術(shù)的實(shí)踐,本文先介紹如何實(shí)現(xiàn)7*24小時(shí)“一站式”的持續(xù)交付,實(shí)現(xiàn)產(chǎn)品的上線。關(guān)于容器云平臺(tái)的介紹,請(qǐng)關(guān)注:https://zhuanlan.zhihu.com/idevops
Docker鏡像標(biāo)準(zhǔn)化
眾所周知,Docker的鏡像是分層的。對(duì)鏡像分層進(jìn)行約定:
第一層是操作系統(tǒng)層,由CentOS/Alpine等基礎(chǔ)鏡像構(gòu)成,安裝一些通用的基礎(chǔ)組件; 第二層是中間件層,根據(jù)不同的應(yīng)用程序,安裝它們運(yùn)行時(shí)需要使用到的各種中間件和依賴軟件包,如,nginx、tomcat等; 第三層是應(yīng)用層,這層僅包含已經(jīng)打好包的各應(yīng)用程序代碼。
圖2:Docker鏡像分層約定
經(jīng)驗(yàn)總結(jié):如何讓自己的鏡像變的更小,PUSH的更快?
圖3 優(yōu)化前后對(duì)比
dockerfile構(gòu)建應(yīng)用鏡像,在中間件層遇到一些需要安裝的軟件包時(shí),盡可能的使用包管理工具(如yum)或以git clone方式下載源碼包進(jìn)行安裝,目的是將軟件包的copy和安裝控制在同一層,軟件部署成功后清除一些無(wú)用的rpm包或源碼包,讓基礎(chǔ)鏡像的尺寸更小。 Java應(yīng)用鏡像中并沒(méi)有將jdk軟件包打入鏡像,將jdk部署在每臺(tái)宿主上,在運(yùn)行鏡像時(shí),通過(guò)掛載目錄的方式將宿主機(jī)上的java家目錄掛載至容器指定目錄下。因?yàn)樗鼤?huì)把基礎(chǔ)鏡像撐得非常大; 在構(gòu)建應(yīng)用鏡像時(shí),docker會(huì)對(duì)這兩層進(jìn)行緩存并直接使用,僅會(huì)重新創(chuàng)建代碼出現(xiàn)變動(dòng)的應(yīng)用層,這樣就提高了應(yīng)用鏡像的構(gòu)建速度和構(gòu)建成功后向鏡像倉(cāng)庫(kù)推送的速度,從整體流程上提升了應(yīng)用的部署效率。