Omri Gazitt 陳琳華
為了充分利用容器所帶來的敏捷性,團(tuán)隊(duì)必須重新設(shè)計(jì)他們的軟件交付工作流程。
容器正迅速成為企業(yè)應(yīng)用程序的打包和部署工具。然而,許多IT人員仍然只是將容器視為從物理服務(wù)器向虛擬機(jī)遷移進(jìn)程中的一個(gè)邏輯環(huán)節(jié)而已,他們認(rèn)為,相對(duì)于運(yùn)行在物理服務(wù)器上的虛擬機(jī)數(shù)量而言,容器在計(jì)算密度上又增加了一個(gè)量級(jí)。
雖然這種觀點(diǎn)認(rèn)識(shí)到了容器意味著IT部門需要管理的事物在數(shù)量級(jí)上又將出現(xiàn)一次爆炸,但他們沒有認(rèn)識(shí)到容器生態(tài)系統(tǒng)帶來的最重要的變化,即容器將導(dǎo)致軟件交付工作流程發(fā)生根本性變革。
在傳統(tǒng)的軟件交付工作流程中,兩個(gè)獨(dú)立的團(tuán)隊(duì)負(fù)責(zé)堆棧的不同層:運(yùn)維團(tuán)隊(duì)負(fù)責(zé)操作系統(tǒng)鏡像,開發(fā)團(tuán)隊(duì)負(fù)責(zé)應(yīng)用程序構(gòu)件。在這一工作流程中,應(yīng)用程序構(gòu)件和相關(guān)性將通過操作系統(tǒng)打包方式,如RPM(紅帽打包管理器)、MSI(Windows打包管理)等等……由開發(fā)轉(zhuǎn)至運(yùn)維。運(yùn)維團(tuán)隊(duì)會(huì)將這些構(gòu)件部署在符合公司策略且包含有監(jiān)測和日志記錄軟件的操作系統(tǒng)鏡像上。隨后,這一復(fù)合鏡像會(huì)在生產(chǎn)中運(yùn)行。開發(fā)團(tuán)隊(duì)會(huì)通過將新軟件包交給運(yùn)維團(tuán)隊(duì)的方式來不斷推動(dòng)應(yīng)用程序的發(fā)展,同時(shí)運(yùn)維團(tuán)隊(duì)會(huì)通過使用腳本或配置管理軟件的方式部署這些更新以及任何其他的更新(例如解決操作系統(tǒng)漏洞的補(bǔ)?。?。
基于容器的軟件交付方式不同于傳統(tǒng)方式
容器交付工作流程完全不同于傳統(tǒng)的軟件交付工作流程。開發(fā)團(tuán)隊(duì)和運(yùn)維團(tuán)隊(duì)將合作創(chuàng)建一個(gè)由不同層組成的單一容器鏡像。這些層從操作系統(tǒng)開始,然后添加相關(guān)性(每個(gè)都在自己的層中),最后是應(yīng)用程序構(gòu)件。更重要的是,容器鏡像在軟件交付過程中被視為不可變的鏡像:對(duì)底層軟件的任何改動(dòng)都需要重建整個(gè)容器鏡像。通過使用聯(lián)合文件系統(tǒng)將基本操作系統(tǒng)鏡像與應(yīng)用程序及相關(guān)性組合在一起,容器技術(shù)和Docker鏡像比虛擬機(jī)鏡像結(jié)構(gòu)等早期方法更具實(shí)用性。對(duì)每個(gè)層的修改只需要重建該層即可。這使得每個(gè)容器鏡像的重建比重新創(chuàng)建一個(gè)完整的虛擬機(jī)鏡像要便宜許多。此外,架構(gòu)出色的容器只運(yùn)行一個(gè)前臺(tái)進(jìn)程,這也與將應(yīng)用程序分解為眾多微服務(wù)的實(shí)踐完全相符。因此,與傳統(tǒng)的操作鏡像相比,容器鏡像更小且更容易重建,這也使得后者的部署和啟動(dòng)時(shí)間大幅降低。
不可變性和微服務(wù)架構(gòu)的一個(gè)重要影響是,運(yùn)維團(tuán)隊(duì)用于進(jìn)行配置管理、監(jiān)視和日志記錄的軟件代理通常無法在容器鏡像中找到。相反,如果軟件必須進(jìn)行修改,那么容器化應(yīng)用要重建整個(gè)鏡像。日志記錄和監(jiān)視同樣要外部化到容器編排系統(tǒng)。換言之,代理不會(huì)在運(yùn)行時(shí)進(jìn)行軟件修改,因?yàn)樗鼈兪窃跇?gòu)建時(shí)創(chuàng)建的。通過使用自動(dòng)化的構(gòu)建/測試/部署周期(通常稱為持續(xù)集成/持續(xù)交付,CI/CD),自動(dòng)化工作從運(yùn)行時(shí)活動(dòng)轉(zhuǎn)變成了構(gòu)建時(shí)活動(dòng)。
在容器范式背景下交付IT
當(dāng)然,我們?cè)贗T中所關(guān)注的核心問題并沒有消失,即我們需要一些機(jī)制來確保應(yīng)用程序沒有漏洞,運(yùn)行已經(jīng)過IT認(rèn)證的最新軟件版本,讓它們可以隨負(fù)載進(jìn)行擴(kuò)展,同時(shí)能夠提供數(shù)據(jù)痕跡從而使記錄和監(jiān)測系統(tǒng)能夠幫助我們發(fā)現(xiàn)問題,甚至在問題發(fā)生之前對(duì)其進(jìn)行預(yù)測。
為了充分利用容器帶來的敏捷性,以及為我們提供運(yùn)營業(yè)務(wù)所需的安全、管理、合規(guī)和審計(jì)跟蹤,我們必須重新設(shè)計(jì)軟件交付工作流程。容器編排系統(tǒng)和容器交付管道是我們當(dāng)前需要維護(hù)和運(yùn)營的兩個(gè)最重要的技術(shù)。
關(guān)于前者,在過去兩年中,Kubernetes已成為多廠商開源標(biāo)準(zhǔn)。Kubernetes提供的功能曾經(jīng)是每個(gè)IT部門都需要掌握的:工作負(fù)載調(diào)度、日志聚合、擴(kuò)展、運(yùn)行狀況監(jiān)控和無縫應(yīng)用程序升級(jí)。IT部門不是通過保留舊的工作流程和工具來對(duì)抗這些內(nèi)置功能,而是需要接受它們作為新“操作系統(tǒng)”的一部分,并圍繞Kubernetes提供的內(nèi)容構(gòu)建其工作流程。
第二個(gè)關(guān)鍵組件是容器交付管道。這個(gè)系統(tǒng)可以為每個(gè)代碼簽入實(shí)現(xiàn)構(gòu)建/測試周期自動(dòng)化,并將成功的簽入部署到容器編排系統(tǒng)中。運(yùn)維工作流程中最關(guān)鍵的變化是將軟件交付生命周期的核心部分(如漏洞修復(fù))移出生產(chǎn)系統(tǒng)的運(yùn)行時(shí)監(jiān)控并將其轉(zhuǎn)入構(gòu)建管道。例如,運(yùn)維團(tuán)隊(duì)不需要在正在運(yùn)行的容器上修補(bǔ)易受攻擊的軟件包,取而代之的是需要使用容器檢查工具標(biāo)記易受攻擊的軟件包版本,觸發(fā)容器鏡像的重建,掃描鏡像以查找CI/CD管道中易受攻擊的軟件包,以及僅部署通過這些掃描的鏡像。
通過新的容器工作流程統(tǒng)一開發(fā)與運(yùn)維
對(duì)于IT來說,他們可能會(huì)認(rèn)為這是一個(gè)可怕的轉(zhuǎn)變,但實(shí)際上這一轉(zhuǎn)變與向開發(fā)運(yùn)維的轉(zhuǎn)變完全一致。通過讓開發(fā)和運(yùn)維在應(yīng)用程序的構(gòu)建階段協(xié)同工作,可以在軟件交付生命周期的早期發(fā)現(xiàn)問題,并且通過為開發(fā)和運(yùn)維提供更密切的工作流程,可消除為解決這些問題所帶來的大量浪費(fèi)。
IT現(xiàn)在有兩個(gè)額外的任務(wù)關(guān)鍵系統(tǒng)可為業(yè)務(wù)進(jìn)行標(biāo)準(zhǔn)化和運(yùn)維:容器編排系統(tǒng)和容器交付管道。但是,配置管理系統(tǒng)、日志聚合系統(tǒng)和監(jiān)控系統(tǒng)等常見IT設(shè)備會(huì)發(fā)生什么?它們不會(huì)在容器世界中消失。相反,他們承擔(dān)不同的角色。配置管理系統(tǒng)用于部署和管理核心分布式系統(tǒng)的生命周期,例如容器編排系統(tǒng)、容器交付管道以及未在容器中運(yùn)行的數(shù)據(jù)管理系統(tǒng)等其他相關(guān)的東西。日志聚合系統(tǒng)通過提供來自容器編排系統(tǒng)和容器交付管道的日志,繼續(xù)為審計(jì)、取證和預(yù)測分析提供關(guān)鍵功能。監(jiān)控系統(tǒng)則將對(duì)來自容器編排系統(tǒng)的數(shù)據(jù)與其他外部數(shù)據(jù)源進(jìn)行聚合。
利用開發(fā)運(yùn)維和容器建立結(jié)構(gòu)性競爭優(yōu)勢
那些能夠?qū)⒁氲钠髽I(yè)標(biāo)準(zhǔn)容器編排系統(tǒng)和容器交付管道與開發(fā)運(yùn)維轉(zhuǎn)型相結(jié)合的企業(yè)將享受到這一新工作流程與生俱來的敏捷性優(yōu)勢,能夠更快地進(jìn)行測試和從客戶那里總結(jié)經(jīng)驗(yàn),并最終比競爭對(duì)手更快地向客戶提供適當(dāng)功能。這些有遠(yuǎn)見的企業(yè)將建立起重要的結(jié)構(gòu)性競爭優(yōu)勢,并將成為新的開發(fā)運(yùn)維和容器領(lǐng)域中的主要受益者。