概述
云原生的核心(xin)理念之(zhi)一(yi)就是容(rong)(rong)器化(hua),指的是使(shi)用容(rong)(rong)器化(hua)技術(shu)將應用程(cheng)序(xu)和(he)服務打(da)包(bao)城容(rong)(rong)器,以實現 應用程(cheng)序(xu)的可(ke)(ke)移植性(xing)和(he)可(ke)(ke)擴展(zhan)性(xing)。
云(yun)原生(Cloud Native)是一種基于云(yun)計算的(de)(de)軟件開發和(he)(he)部署方法論,它(ta)強調將應用(yong)程序和(he)(he)服(fu)務 設計為云(yun)環境(jing)下的(de)(de)原生應用(yong),以實現高可用(yong)性(xing)、可擴展性(xing)和(he)(he)靈活性(xing)。
容(rong)器是一(yi)個(ge)運(yun)行(xing)時概念,它是一(yi)個(ge)獨立運(yun)行(xing)的(de)應用程序及(ji)其所有運(yun)行(xing)時依賴項的(de)輕(qing)量級、可執行(xing)單(dan)元。 容(rong)器在運(yun)行(xing)時與主機(ji)操作系統共享內核,因此具有較低的(de)資源(yuan)開銷和啟(qi)動時間(jian),這(zhe)使得(de)容(rong)器相比傳統 虛擬機(ji)更(geng)為高(gao)效。
鏡(jing)(jing)(jing)(jing)像(xiang)則是(shi)容(rong)器技術的(de)基礎(chu),可以將鏡(jing)(jing)(jing)(jing)像(xiang)看作是(shi)一(yi)個(ge)只讀模(mo)板,包含了運(yun)行應用(yong)程(cheng)序(xu)所需的(de)所有代(dai)碼、 運(yun)行時庫、環境變量和配置(zhi)文件等(deng)。鏡(jing)(jing)(jing)(jing)像(xiang)由多個(ge)層次構成,每(mei)個(ge)層次代(dai)表一(yi)個(ge)文件系統(tong)的(de)快(kuai)照。這(zhe)種 分層存儲機制使得(de)鏡(jing)(jing)(jing)(jing)像(xiang)可以重(zhong)用(yong)和共享,大大減少了鏡(jing)(jing)(jing)(jing)像(xiang)的(de)體積。容(rong)器以鏡(jing)(jing)(jing)(jing)像(xiang)為基礎(chu),在鏡(jing)(jing)(jing)(jing)像(xiang)上添加(jia) 一(yi)個(ge)可寫(xie)(xie)層,任何對容(rong)器的(de)更改都將存儲在該可寫(xie)(xie)層中。
相對于容器,鏡像是一(yi)個靜態的概(gai)念,它和軟件代碼(ma),可(ke)執行代碼(ma)一(yi)樣,是開發(fa)活動的產(chan)物,因(yin)此(ci)鏡像 制作(zuo)可(ke)依看作(zuo)一(yi)個開發(fa)活動。
本(ben)文從如何鏡像(xiang)開(kai)發的(de)角度(du),來(lai)探討(tao)如何制作優質(zhi)的(de)好鏡像(xiang)。
“好”的標準
那么,如何才是(shi)“好”鏡像呢?
如(ru)果說鏡像(xiang)是開發活(huo)動的(de)產物,其(qi)質(zhi)量當然有好有壞。一個(ge)鏡像(xiang)除(chu)了能夠實現(xian)其(qi)相應(ying)(ying)的(de)業(ye)務和(he)(he)應(ying)(ying)用功能 之外,還需(xu)要從性(xing)(xing)能和(he)(he)可維護性(xing)(xing)來進行評價。
首先,鏡像要考慮容器加載的性能,具體來說,就是鏡像的大小,鏡像的大小直接決定了從鏡像倉庫拉 鏡像的網絡流量,也直接影響了容器的啟動性能。當然鏡像的分層設計和Docker(或其他CRI)的緩存機制 大大的降低的這個影響。一個極小的輕量級鏡像可以大大加快容器的啟動性能,這也是許多go生態的鏡像 以scratch作為基(ji)礎鏡像的原(yuan)因。
其(qi)次,鏡像(xiang)需要(yao)考慮可維(wei)護性,運維(wei)人員日(ri)常對容(rong)(rong)器的運維(wei)操(cao)作包(bao)括查(cha)看日(ri)志(zhi),進容(rong)(rong)器內(nei)部進行(xing)(xing)調(diao)試等。 鏡像(xiang)中日(ri)志(zhi)的輸出業務性太強(qiang),暫且不說。個人認為進入(ru)容(rong)(rong)器進行(xing)(xing)shell調(diao)試非常重(zhong)要(yao),比如(ru)檢查(cha)容(rong)(rong)器網絡 時(shi),需要(yao)進行(xing)(xing)一些(xie)必要(yao)的ping或者curl操(cao)作等。一個好(hao)維(wei)護的鏡像(xiang)需要(yao)內(nei)置一個強(qiang)大(da)的shell。
目前許多開源鏡像出于種種原因,故意忽略這一點,比如直接從scratch上構建鏡像,鏡像內部沒(mei)有shell, 運維(wei)人員(yuan)根本無法進(jin)入容(rong)器(qi),根本無法維(wei)護。 在后續(xu)章節中,我們將(jiang)介紹(shao)相應(ying)的(de)技巧(qiao),為(wei)此類(lei)鏡像增加shell
最(zui)后,鏡(jing)像需要(yao)考慮可定(ding)制(zhi)(zhi)(zhi)性(xing)。這里的(de)可定(ding)制(zhi)(zhi)(zhi)性(xing),包括了二(er)次(ci)開發的(de)定(ding)制(zhi)(zhi)(zhi)和運(yun)行時定(ding)制(zhi)(zhi)(zhi)。二(er)次(ci)開發的(de)定(ding)制(zhi)(zhi)(zhi)指的(de) 是(shi)他人(ren)是(shi)否能夠繼承(cheng)你的(de)鏡(jing)像實現它的(de)個性(xing)化需求,比如(ru)說(shuo)定(ding)制(zhi)(zhi)(zhi)配(pei)置文件或(huo)環境變(bian)量,增(zeng)加其他應用功能等。 運(yun)行時定(ding)制(zhi)(zhi)(zhi)指的(de)是(shi)在容器(qi)啟動或(huo)運(yun)行過程中,定(ding)制(zhi)(zhi)(zhi)環境變(bian)量,配(pei)置文件等等。
因此,我(wo)們初步可以(yi)認為:一個好的鏡(jing)像(xiang),需(xu)要包括下列特性:
- 輕量,鏡像體積必須小,盡量減少網絡傳輸,和拉起容器所需的時間;
- 易調試,具備必要的shell和調試工具
- 易定制,可輕易通過環境變量注入,或者文件注入來定制鏡像業務功能。