持續(xù)基礎(chǔ)設(shè)施:另一個(gè)CI
想要提升你的 DevOps 效率嗎?將基礎(chǔ)設(shè)施當(dāng)成你的 CI 流程中的重要的一環(huán)。
持續(xù)交付(CD)和持續(xù)集成(CI)是 DevOps 的兩個(gè)眾所周知的方面。但在 CI 大肆流行的今天卻忽略了另一個(gè)關(guān)鍵性的 I
:基礎(chǔ)設(shè)施。
曾經(jīng)有一段時(shí)間 “基礎(chǔ)設(shè)施”就意味著無頭的黑盒子、龐大的服務(wù)器,和高聳的機(jī)架 —— 更不用說漫長的采購流程和對盈余負(fù)載的錯(cuò)誤估計(jì)。后來到了虛擬機(jī)時(shí)代,把基礎(chǔ)設(shè)施處理得很好,虛擬化 —— 以前的世界從未有過這樣。我們不再需要管理實(shí)體的服務(wù)器。僅僅是簡單的點(diǎn)擊,我們就可以創(chuàng)建和銷毀、開始和停止、升級和降級我們的服務(wù)器。
有一個(gè)關(guān)于銀行的流行故事:它們實(shí)現(xiàn)了數(shù)字化,并且引入了在線表格,用戶需要手動填寫表格、打印,然后郵寄回銀行(LCTT 譯注:我真的遇到過有人問我這樣的需求怎么辦)。這就是我們今天基礎(chǔ)設(shè)施遇到的情況:使用新技術(shù)來做和以前一樣的事情。
在這篇文章中,我們會看到在基礎(chǔ)設(shè)施管理方面的進(jìn)步,將基礎(chǔ)設(shè)施視為一個(gè)版本化的組件并試著探索不可變服務(wù)器的概念。在后面的文章中,我們將了解如何使用開源工具來實(shí)現(xiàn)持續(xù)的基礎(chǔ)設(shè)施。
實(shí)踐中的持續(xù)集成流程
這是我們熟悉的 CI,盡早發(fā)布、經(jīng)常發(fā)布的循環(huán)流程。這個(gè)流程缺少一個(gè)關(guān)鍵的組件:基礎(chǔ)設(shè)施。
突擊小測試:
- 你怎樣創(chuàng)建和升級你的基礎(chǔ)設(shè)施?
- 你怎樣控制和追溯基礎(chǔ)設(shè)施的改變?
- 你的基礎(chǔ)設(shè)施是如何與你的業(yè)務(wù)進(jìn)行匹配的?
- 你是如何確保在正確的基礎(chǔ)設(shè)施配置上進(jìn)行測試的?
要回答這些問題,就要了解持續(xù)基礎(chǔ)設(shè)施。把 CI 構(gòu)建流程分為代碼持續(xù)集成(CIc)和基礎(chǔ)設(shè)施持續(xù)集成(CIi)來并行開發(fā)和構(gòu)建代碼和基礎(chǔ)設(shè)施,再將兩者融合到一起進(jìn)行測試。把基礎(chǔ)設(shè)施構(gòu)建視為 CI 流程中的重要的一環(huán)。
包含持續(xù)基礎(chǔ)設(shè)施的 CI 流程
關(guān)于 CIi 定義的幾個(gè)方面:
-
代碼
通過代碼來創(chuàng)建基礎(chǔ)設(shè)施架構(gòu),而不是通過安裝。基礎(chǔ)設(shè)施如代碼(IaC)是使用配置腳本創(chuàng)建基礎(chǔ)設(shè)施的現(xiàn)代***的方法。這些腳本遵循典型的編碼和單元測試周期(請參閱下面關(guān)于 Terraform 腳本的示例)。
-
版本
IaC 組件在源碼倉庫中進(jìn)行版本管理。這讓基礎(chǔ)設(shè)施的擁有了版本控制的所有好處:一致性,可追溯性,分支和標(biāo)記。
-
管理
通過編碼和版本化的基礎(chǔ)設(shè)施管理,你可以使用你所熟悉的測試和發(fā)布流程來管理基礎(chǔ)設(shè)施的開發(fā)。
CIi 提供了下面的這些優(yōu)勢:
-
一致性
版本化和標(biāo)記化的基礎(chǔ)設(shè)施意味著你可以清楚的知道你的系統(tǒng)使用了哪些組件和配置。這建立了一個(gè)非常好的 DevOps 實(shí)踐,用來鑒別和管理基礎(chǔ)設(shè)施的一致性。
-
可重現(xiàn)性
通過基礎(chǔ)設(shè)施的標(biāo)記和基線,重建基礎(chǔ)設(shè)施變得非常容易。想想你是否經(jīng)常聽到這個(gè):“但是它在我的機(jī)器上可以運(yùn)行!”現(xiàn)在,你可以在本地的測試平臺中快速重現(xiàn)類似生產(chǎn)環(huán)境,從而將環(huán)境像變量一樣在你的調(diào)試過程中刪除。
-
可追溯性
你是否還記得曾經(jīng)有過多少次尋找到底是誰更改了文件夾權(quán)限的經(jīng)歷,或者是誰升級了
ssh
包?代碼化的、版本化的,發(fā)布的基礎(chǔ)設(shè)施消除了臨時(shí)性變更,為基礎(chǔ)設(shè)施的管理帶來了可追蹤性和可預(yù)測性。 -
自動化
借助腳本化的基礎(chǔ)架構(gòu),自動化是下一個(gè)合乎邏輯的步驟。自動化允許你按需創(chuàng)建基礎(chǔ)設(shè)施,并在使用完成后銷毀它,所以你可以將更多寶貴的時(shí)間和精力用在更重要的任務(wù)上。
-
不變性
CIi 帶來了不可變基礎(chǔ)設(shè)施等創(chuàng)新。你可以創(chuàng)建一個(gè)新的基礎(chǔ)設(shè)施組件而不是通過升級(請參閱下面有關(guān)不可變設(shè)施的說明)。
持續(xù)基礎(chǔ)設(shè)施是從運(yùn)行基礎(chǔ)環(huán)境到運(yùn)行基礎(chǔ)組件的進(jìn)化。像處理代碼一樣,通過證實(shí)的 DevOps 流程來完成。對傳統(tǒng)的 CI 的重新定義包含了缺少的那個(gè) “i”,從而形成了連貫的 CD 。
(CIc + CIi) = CI -> CD
基礎(chǔ)設(shè)施如代碼 (IaC)
CIi 流程的一個(gè)關(guān)鍵推動因素是基礎(chǔ)設(shè)施如代碼(IaC)。IaC 是一種使用配置文件進(jìn)行基礎(chǔ)設(shè)施創(chuàng)建和升級的機(jī)制。這些配置文件像其他的代碼一樣進(jìn)行開發(fā),并且使用版本管理系統(tǒng)進(jìn)行管理。這些文件遵循一般的代碼開發(fā)流程:單元測試、提交、構(gòu)建和發(fā)布。IaC 流程擁有版本控制帶給基礎(chǔ)設(shè)施開發(fā)的所有好處,如標(biāo)記、版本一致性,和修改可追溯。
這有一個(gè)簡單的 Terraform 腳本用來在 AWS 上創(chuàng)建一個(gè)雙層基礎(chǔ)設(shè)施的簡單示例,包括虛擬私有云(VPC)、彈性負(fù)載(ELB),安全組和一個(gè) NGINX 服務(wù)器。Terraform 是一個(gè)通過腳本創(chuàng)建和更改基礎(chǔ)設(shè)施架構(gòu)和開源工具。
Terraform 腳本創(chuàng)建雙層架構(gòu)設(shè)施的簡單示例
完整的腳本請參見 GitHub。
不可變基礎(chǔ)設(shè)施
你有幾個(gè)正在運(yùn)行的虛擬機(jī),需要更新安全補(bǔ)丁。一個(gè)常見的做法是推送一個(gè)遠(yuǎn)程腳本單獨(dú)更新每個(gè)系統(tǒng)。
要是不更新舊系統(tǒng),如何才能直接丟棄它們并部署安裝了新安全補(bǔ)丁的新系統(tǒng)呢?這就是不可變基礎(chǔ)設(shè)施。因?yàn)橹暗幕A(chǔ)設(shè)施是版本化的、標(biāo)簽化的,所以安裝補(bǔ)丁就只是更新該腳本并將其推送到發(fā)布流程而已。
現(xiàn)在你知道為什么要說基礎(chǔ)設(shè)施在 CI 流程中特別重要了嗎?