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




























