DevOps/SRE 必懂概念:不可變基礎(chǔ)設(shè)施
如果你正在學(xué)習(xí)或剛開(kāi)始接觸DevOps和基礎(chǔ)設(shè)施自動(dòng)化,這篇文章將幫助你詳細(xì)了解不可變基礎(chǔ)設(shè)施(Immutable infrastructure)模型。
在進(jìn)入技術(shù)解釋之前,首先,你應(yīng)該對(duì)可變和不可變這兩個(gè)詞的字面意思有一個(gè)清晰的認(rèn)識(shí)。
- 可變的(Mutable): 可以被改變的東西。意味著你可以在它被創(chuàng)建后繼續(xù)對(duì)它進(jìn)行修改。
- 不變的(Immutable): 不能改變的東西。一旦它被創(chuàng)建,你就不能改變其中的任何東西。
現(xiàn)在讓我們看一個(gè)真實(shí)世界的例子,即一所房子。在一所房子里,有一些你可以改變的對(duì)象(可變的),也有一些必須被替換的對(duì)象(不可變的),如果它們發(fā)生了什么變化。例如,你可以給一扇門(mén)涂上不同的顏色,更換門(mén)把手,給它一個(gè)不同的外觀。在這里門(mén)是一個(gè)可變的對(duì)象。同時(shí),一個(gè)洗臉盆是一個(gè)不可變的對(duì)象。如果你想改變臉盆的顏色,你需要用一個(gè)新的臉盆來(lái)替換它。這一點(diǎn)也適用于地磚。
在IT界,我們?cè)谲浖こ毯虳evOps中都有可變性和不可變性的概念。在軟件工程中,這一概念被應(yīng)用于面向?qū)ο蟮木幊蹋贒evOps中,它被應(yīng)用于基礎(chǔ)設(shè)施自動(dòng)化。在本指南中,我們將從DevOps的角度重點(diǎn)討論不可變的基礎(chǔ)設(shè)施。
什么是不可變的基礎(chǔ)設(shè)施?
要理解不可變的基礎(chǔ)設(shè)施,首先,你應(yīng)該知道服務(wù)器的生命周期。
下面是一個(gè)帶有應(yīng)用程序的服務(wù)器的簡(jiǎn)略的生命周期(僅供參考,各組織的流程有所不同)。
- 部署一個(gè)服務(wù)器。
- SSH進(jìn)入服務(wù)器。
- 安裝所需的工具。
- 配置安全代理、防火墻和實(shí)用程序以保證安全。(安全加固)
- 安裝和配置所需的應(yīng)用程序。
- 修改應(yīng)用程序和服務(wù)器配置,以提高應(yīng)用程序的性能。
- 使服務(wù)器用于生產(chǎn)工作。
- 每個(gè)月登錄服務(wù)器,為服務(wù)器打上安全補(bǔ)?。ǚ?wù)器更新)。
- 在應(yīng)用程序可用時(shí)進(jìn)行升級(jí)。
正如你所看到的,上面提到的步驟是一個(gè)可變的模型。這是因?yàn)槲覀冋诟鶕?jù)要求對(duì)服務(wù)器進(jìn)行修改。因此,當(dāng)你使用Ansible、Puppet或Chef等配置管理工具來(lái)管理服務(wù)器時(shí),你遵循的是可變模式。
「不可變」,就像它的字面意思一樣,不可變的基礎(chǔ)設(shè)施是一個(gè)概念,在你部署服務(wù)器之后,你不會(huì)對(duì)它做任何改變。意思是說(shuō),服務(wù)器在部署的時(shí)候已經(jīng)預(yù)先配置好了配置、安裝好了工具和應(yīng)用程序。服務(wù)器出現(xiàn)的那一刻,應(yīng)用程序就開(kāi)始運(yùn)行。
如果您想進(jìn)行任何更改,則應(yīng)銷毀現(xiàn)有服務(wù)并用新服務(wù)替換。更改可能是打補(bǔ)丁、應(yīng)用程序升級(jí)、服務(wù)器配置更改等。
圖片
你可以為大多數(shù)現(xiàn)代應(yīng)用遵循不可變的基礎(chǔ)設(shè)施模型,包括數(shù)據(jù)庫(kù)集群。
例如,如果你有應(yīng)用程序在自動(dòng)縮放組中運(yùn)行,而你遵循的是不可變的服務(wù)器部署模型。每當(dāng)你想部署新的代碼時(shí),你需要銷毀現(xiàn)有的虛擬機(jī),這樣由自動(dòng)縮放啟動(dòng)的新虛擬機(jī)就會(huì)下載最新的代碼。另一種方法是,你需要用帶有代碼的最新鏡像來(lái)改變啟動(dòng)模板。
在一個(gè)不可變的模型中,在配置方面應(yīng)遵循標(biāo)準(zhǔn)的最佳實(shí)踐。
例如,使用配置存儲(chǔ)或服務(wù)發(fā)現(xiàn)工具,將經(jīng)常改變的配置外部化。一個(gè)典型的例子是Nginx的upstream配置。
這樣一來(lái),你就不必為小的變化和配置而重新生成服務(wù)器。
如果你知道容器,它是不可變基礎(chǔ)設(shè)施的最好例子。除了外部化的配置,對(duì)容器的任何改變都會(huì)導(dǎo)致重建。
用于CI/CD的不可變的基礎(chǔ)設(shè)施模型
那么,不可變的基礎(chǔ)設(shè)施模式如何用在CI/CD過(guò)程?
當(dāng)你在虛擬機(jī)環(huán)境的CI管道中遵循不可變的基礎(chǔ)設(shè)施模式時(shí),可部署的工件將是一個(gè)虛擬機(jī)鏡像或一個(gè)docker鏡像。
例如,一旦CI完成,利用Docker或packer等工具,你可以把程序代碼塞到容器或虛擬機(jī)鏡像(AWS AMI)中,并使用它在相關(guān)環(huán)境中進(jìn)行部署。
當(dāng)涉及到部署時(shí),你可以遵循藍(lán)綠部署或金絲雀部署。讓我們來(lái)看看這兩種方法。
- 藍(lán)綠模式: 在這種模式下,使用最新的應(yīng)用程序鏡像,你將一組新的服務(wù)器(藍(lán)色)與生產(chǎn)服務(wù)器(綠色)一起部署,但它不會(huì)提供流量。當(dāng)藍(lán)色服務(wù)器被驗(yàn)證OK之后,流量將被重定向到新的(藍(lán)色)服務(wù)器組,舊的(綠色)服務(wù)器將被銷毀。
- 金絲雀模型: 在這個(gè)模型中,不是將全部流量導(dǎo)到新的服務(wù)器集上,而是只將流量的一個(gè)子集導(dǎo)到新的服務(wù)器上。流量切換是根據(jù)團(tuán)隊(duì)制定的時(shí)間節(jié)奏逐漸發(fā)生的。一旦流量完全切換到新的服務(wù)器集,舊的服務(wù)器就會(huì)被刪除。
鏡像生命周期管理和補(bǔ)丁
在不可改變的基礎(chǔ)設(shè)施模型中,虛擬機(jī)或容器鏡像的創(chuàng)建和修補(bǔ)起到了關(guān)鍵作用。你需要利用CI/CD工具,制定良好的鏡像生命周期管理。
在云和容器環(huán)境中,首先我們需要一個(gè)基礎(chǔ)鏡像。之后基于這個(gè)基礎(chǔ)鏡像創(chuàng)建應(yīng)用鏡像。在實(shí)際的項(xiàng)目環(huán)境中,這個(gè)過(guò)程會(huì)比較復(fù)雜。
下面我們來(lái)聊一下這一切在實(shí)際項(xiàng)目環(huán)境中是如何發(fā)生的,以及如何根據(jù)公司的安全策略建立應(yīng)用程序鏡像。
因此,這里列出了在安全的項(xiàng)目環(huán)境中遵循的通用鏡像生命周期管理(虛擬機(jī)和容器)步驟。
注意:該列表是為了給你一個(gè)關(guān)于鏡像生命周期管理的總體情況。它在每個(gè)組織中都是不同的。
圖片
- 在一個(gè)安全、合規(guī)的環(huán)境中,你不允許使用云提供商提供的基礎(chǔ)鏡像或docker hub等公共容器注冊(cè)處提供的docker基礎(chǔ)鏡像。
- 每個(gè)組織都會(huì)用標(biāo)準(zhǔn)的安全工具(各種agent)、DNS/Proxy、LDAP配置等創(chuàng)建虛擬機(jī)/容器基礎(chǔ)鏡像(它根據(jù)每個(gè)組織的安全政策而改變)。通常,這種鏡像是由中央平臺(tái)團(tuán)隊(duì)或安全團(tuán)隊(duì)創(chuàng)建和維護(hù)的。你可以叫它黃金鏡像。
- 經(jīng)過(guò)批準(zhǔn)和認(rèn)證的基本鏡像將與組織中的所有團(tuán)隊(duì)共享。它可以是一個(gè)單一的云賬戶或與組織內(nèi)的多個(gè)子賬戶共享。
- 然后,每個(gè)團(tuán)隊(duì)可以在批準(zhǔn)的基礎(chǔ)鏡像上創(chuàng)建自己的應(yīng)用鏡像。(這里使用像Docker和Packer這樣的工具)。
- 團(tuán)隊(duì)創(chuàng)建的新鏡像將被測(cè)試并部署到生產(chǎn)中。
- 現(xiàn)在,當(dāng)基礎(chǔ)鏡像得到新的更新或補(bǔ)丁時(shí),平臺(tái)或企業(yè)安全團(tuán)隊(duì)會(huì)發(fā)布新版本的基礎(chǔ)鏡像并通知所有項(xiàng)目團(tuán)隊(duì)。
- 每個(gè)組織都有一個(gè)打補(bǔ)丁的生命周期。意思是說(shuō),安全團(tuán)隊(duì)對(duì)VMS的更新和補(bǔ)丁的應(yīng)用有一定的準(zhǔn)則。例如,它可能是一個(gè)月或三個(gè)月一次。
- 對(duì)于虛擬機(jī),補(bǔ)丁可以是 “就地” 的,也就是對(duì)現(xiàn)有實(shí)例進(jìn)行補(bǔ)丁,也可以是不可更改的,也就是用新的鏡像替換現(xiàn)有的鏡像。容器在本質(zhì)上是不可變的。
- 基于補(bǔ)丁的生命周期,每個(gè)團(tuán)隊(duì)都會(huì)用新的基礎(chǔ)鏡像更新現(xiàn)有的應(yīng)用鏡像,并將其部署到生產(chǎn)中,而不管應(yīng)用的代碼是否有變化。這同時(shí)適用于虛擬機(jī)和容器。
結(jié)論
我們已經(jīng)看了不可變的基礎(chǔ)設(shè)施的關(guān)鍵概念。
作為一名DevOps工程師,你應(yīng)該在構(gòu)建和部署不可變鏡像時(shí)遵循所有標(biāo)準(zhǔn)的最佳實(shí)踐,以減少攻擊面。
如果你正在使用容器或容器編排工具(如Kubernetes),你已經(jīng)在遵循應(yīng)用程序部署的不可變模式。
原文:https://devopscube.com/immutable-infrastructure/
譯者:秦曉輝