什么是基礎(chǔ)架構(gòu)即代碼?
本文將通過(guò)類比介紹基礎(chǔ)架構(gòu)即代碼的工作原理。我們將涵蓋不同的基礎(chǔ)架構(gòu)作為可用的代碼工具以及聲明式代碼與命令式代碼
我還將向您介紹 Terraform,這是一個(gè)開(kāi)源基礎(chǔ)設(shè)施即代碼工具,您可以使用它來(lái)跨多個(gè)云提供商(如 AWS、GCP、Azure 等)創(chuàng)建基礎(chǔ)設(shè)施。
(更|多優(yōu)質(zhì)內(nèi)|容:java567 點(diǎn) c0m)
基礎(chǔ)設(shè)施即代碼實(shí)踐
想象一下,您正嘗試在 AWS 上創(chuàng)建一個(gè)三層 Web 應(yīng)用程序,如下圖所示:
三層 Web 應(yīng)用程序示例
表示層負(fù)責(zé)向用戶呈現(xiàn)用戶界面。它包括在 EC2 實(shí)例上運(yùn)行的用戶界面組件,例如 HTML、CSS 和 JavaScript。
邏輯層負(fù)責(zé)處理用戶請(qǐng)求并生成響應(yīng),通過(guò)與數(shù)據(jù)庫(kù)層通信來(lái)檢索或存儲(chǔ)數(shù)據(jù)。這也部署在 EC2 實(shí)例上
數(shù)據(jù)庫(kù)層負(fù)責(zé)存儲(chǔ)和管理應(yīng)用程序的數(shù)據(jù),并允許通過(guò)邏輯層訪問(wèn)其數(shù)據(jù)。數(shù)據(jù)庫(kù)在 AWS RDS 上運(yùn)行。
每個(gè)實(shí)例都在一個(gè)自動(dòng)縮放組中,前面有一個(gè)負(fù)載均衡器(數(shù)據(jù)庫(kù)層除外)。
如果你想通過(guò) AWS 控制臺(tái)創(chuàng)建這個(gè)基礎(chǔ)設(shè)施,你將不得不手動(dòng)點(diǎn)擊各種屏幕來(lái)啟動(dòng)基礎(chǔ)設(shè)施。如果這是一次性活動(dòng),這很好。
但是,如果您需要在不同的環(huán)境(如開(kāi)發(fā)和測(cè)試)中重復(fù)此操作,或者需要添加額外的基礎(chǔ)設(shè)施(如緩存、隊(duì)列、防火墻規(guī)則、IAM或 SSL 證書(shū)),那么通過(guò) AWS 控制臺(tái)進(jìn)行管理會(huì)變得越來(lái)越復(fù)雜。
通過(guò)控制臺(tái)管理復(fù)雜的基礎(chǔ)設(shè)施還可能會(huì)出現(xiàn)人為錯(cuò)誤。
基礎(chǔ)設(shè)施即代碼以代碼語(yǔ)言表達(dá)您想要的基礎(chǔ)設(shè)施。這為管理您的基礎(chǔ)架構(gòu)帶來(lái)了代碼的所有好處,例如:
版本控制——允許您存儲(chǔ)基礎(chǔ)架構(gòu)的歷史記錄,并在需要時(shí)恢復(fù)到以前的版本。
更快、更安全的部署——可以在新環(huán)境中快速重建基礎(chǔ)設(shè)施,并且錯(cuò)誤更少,因?yàn)榛A(chǔ)設(shè)施的每個(gè)部分都在代碼中明確定義。
文檔 – 您當(dāng)前的基礎(chǔ)架構(gòu)狀態(tài)會(huì)被記錄下來(lái),并在您進(jìn)行更改時(shí)自動(dòng)保持最新?tīng)顟B(tài)。與將基礎(chǔ)設(shè)施編寫在文檔中或在 confluence 頁(yè)面上可能不會(huì)在發(fā)生更改時(shí)更新的基礎(chǔ)設(shè)施相比,這可以使您的基礎(chǔ)設(shè)施文檔更加詳細(xì)和準(zhǔn)確。
基礎(chǔ)設(shè)施即代碼如何工作——用類比解釋
基礎(chǔ)設(shè)施即代碼允許您創(chuàng)建基礎(chǔ)設(shè)施的詳細(xì)藍(lán)圖。此藍(lán)圖向您的云提供商提供有關(guān)您要?jiǎng)?chuàng)建的基礎(chǔ)架構(gòu)的說(shuō)明。
這類似于架構(gòu)藍(lán)圖的工作方式。它概述了結(jié)構(gòu)的布局、尺寸、材料和各種組件。藍(lán)圖作為建筑師和工程師理解所需建筑的參考。
架構(gòu)藍(lán)圖如何類似于基礎(chǔ)架構(gòu)即代碼
藍(lán)圖幾乎沒(méi)有出錯(cuò)的余地。任何建筑師或工程師都會(huì)以同樣的方式解釋它。如果你想建造這座房子的精確副本,你所需要的只是建筑藍(lán)圖。
基礎(chǔ)設(shè)施即代碼在基本層面上的工作方式與架構(gòu)藍(lán)圖相同。它詳細(xì)說(shuō)明了您希望以多種不同的可能語(yǔ)言(JSON、YAML、HCL、Python、Ruby、JavaScript 等)作為代碼創(chuàng)建的基礎(chǔ)架構(gòu),指示云提供商完全按照指定創(chuàng)建您的基礎(chǔ)架構(gòu)。
作為代碼工具的聲明式和命令式基礎(chǔ)設(shè)施
有許多 IaC 選項(xiàng)可供選擇,所有主要的云提供商都有自己的專用工具:
AWS 有 CloudFormation
GCP 有部署管理器
Azure 有資源管理器
這些特定于云提供商的工具的一個(gè)限制是它們只能在各自的云中創(chuàng)建基礎(chǔ)設(shè)施。因此 CloudFormation 僅適用于 AWS,而 Deployment Manager 僅適用于 GCP。使用這些提供者的 IaC 通常以 JSON 或 YAML 格式編寫。
另一方面,Terraform 是開(kāi)源的,您可以使用它來(lái)創(chuàng)建跨所有主要云提供商的基礎(chǔ)設(shè)施。它使用 HCL(HashiCorp 配置語(yǔ)言)。
基礎(chǔ)設(shè)施即代碼也可以使用 Python 和 JavaScript 等流行語(yǔ)言編寫。
這些腳本/編程語(yǔ)言依賴于一系列聲明性和命令性代碼,如下所示。
一系列聲明式和命令式語(yǔ)言以及 Terraform HCL 適用的地方
命令式語(yǔ)言和聲明式語(yǔ)言之間的主要區(qū)別在于命令式語(yǔ)言明確定義了控制流。這只是指令在程序中執(zhí)行的順序??刂屏鳑Q定了程序所采用的路徑以及它如何響應(yīng)不同的條件或事件。
在命令式語(yǔ)言中,控制流是使用循環(huán)、條件和函數(shù)調(diào)用等控制結(jié)構(gòu)顯式定義的。命令式語(yǔ)言使您可以更靈活地配置基礎(chǔ)架構(gòu)。這不一定是積極的,因?yàn)楦嗟撵`活性意味著更多的機(jī)會(huì)將錯(cuò)誤引入您的基礎(chǔ)架構(gòu)。
聲明性語(yǔ)言側(cè)重于描述期望的結(jié)果,而不給出如何實(shí)現(xiàn)它的具體說(shuō)明。
說(shuō)明聲明式語(yǔ)言和命令式語(yǔ)言之間差異的插圖
示例 JSON 如下所示,在 AWS CloudFormation 中用于創(chuàng)建 EC2 實(shí)例:
?"Type": "AWS::EC2::Instance",
? ? ? ?"Properties": {
? ? ? ? ?"ImageId": "ami-0123456789",
? ? ? ? ?"InstanceType": "t2.micro",
? ? ? ? ?"KeyName": "my-key-pair",
? ? ? ? ?"SecurityGroupIds": ["sg-0123456789"],
? ? ? ? ?"SubnetId": "subnet-0123456789",
? ? ? ? ?"Tags": [
? ? ? ? ? ?{
? ? ? ? ? ? ?"Key": "Name",
? ? ? ? ? ? ?"Value": "MyEC2Instance"
? ? ? ? ? ?}
? ? ? ? ?]
? ? ? ?}
像 JSON 這樣的聲明性語(yǔ)言抽象出了詳細(xì)描述 EC2 實(shí)例創(chuàng)建方式的底層復(fù)雜性。它只關(guān)心最終狀態(tài)。
Terraform HCL 更接近聲明式的一端。Terraform 允許您描述所需基礎(chǔ)架構(gòu)的最終狀態(tài),而無(wú)需指定到達(dá)那里的確切步驟。Terraform 在內(nèi)部管理執(zhí)行順序、資源依賴性,并根據(jù)所需配置處理基礎(chǔ)架構(gòu)更改。
但 Terraform 確實(shí)支持一些命令式功能,如變量和表達(dá)式,允許基于輸入的動(dòng)態(tài)行為。所以,它不是像 JSON 那樣完全聲明性的語(yǔ)言。
Terraform 的工作原理
有兩個(gè)基本概念可以作為理解 Terraform 的基礎(chǔ):
配置文件——這描述了所需的基礎(chǔ)設(shè)施
狀態(tài)文件——它描述了現(xiàn)實(shí)世界中存在的當(dāng)前基礎(chǔ)設(shè)施
Terraform 的工作是根據(jù)需要?jiǎng)?chuàng)建、修改或刪除基礎(chǔ)設(shè)施,以滿足所需的基礎(chǔ)設(shè)施配置。它通過(guò)對(duì)您的云提供商執(zhí)行必要的 API 調(diào)用來(lái)創(chuàng)建、修改或銷毀指定的資源來(lái)實(shí)現(xiàn)這一點(diǎn)。
一旦基礎(chǔ)設(shè)施被創(chuàng)建/修改/銷毀以匹配配置文件,狀態(tài)文件就會(huì)更新以反映當(dāng)前的基礎(chǔ)設(shè)施。
該terraform plan命令會(huì)創(chuàng)建一個(gè)執(zhí)行計(jì)劃,讓您可以預(yù)覽 Terraform 計(jì)劃對(duì)您的基礎(chǔ)設(shè)施所做的更改。
默認(rèn)情況下,當(dāng) Terraform 創(chuàng)建計(jì)劃時(shí),它會(huì)將配置文件中描述的所需配置與狀態(tài)文件中描述的當(dāng)前配置進(jìn)行比較。然后,Terraform 會(huì)提出需要更改的列表,以確保當(dāng)前配置與所需配置相匹配。
如果您隨后運(yùn)行該terraform apply命令,Terraform 將修改現(xiàn)實(shí)世界的基礎(chǔ)設(shè)施以使其匹配所需的配置,并更新?tīng)顟B(tài)文件以顯示新的基礎(chǔ)設(shè)施配置。
在高層次上,這就是 Terraform 所做的:
運(yùn)行terraform apply命令時(shí)會(huì)發(fā)生什么
讓我們回到建筑藍(lán)圖的類比。
配置文件就像建筑藍(lán)圖。它詳細(xì)說(shuō)明了需要建造的基礎(chǔ)設(shè)施,即所需的建筑?,F(xiàn)實(shí)世界的基礎(chǔ)設(shè)施是物理世界中的現(xiàn)有結(jié)構(gòu),狀態(tài)文件是當(dāng)前存在的表示——當(dāng)前藍(lán)圖。工程師努力確保現(xiàn)有建筑符合建筑藍(lán)圖。
在這個(gè)類比中,工程師負(fù)責(zé) Terraform 的工作,以確?,F(xiàn)有結(jié)構(gòu)與架構(gòu)藍(lán)圖相匹配。您無(wú)需指定如何建造房屋的細(xì)節(jié),您只需指定要建造的房屋,其余的由工程師處理。
跑步的建筑類比terraform apply
把它放在一起
基礎(chǔ)設(shè)施即代碼 (IaC) 是一種以代碼形式管理復(fù)雜基礎(chǔ)設(shè)施配置的好方法。這自然會(huì)為您的基礎(chǔ)架構(gòu)帶來(lái)代碼的所有優(yōu)勢(shì),例如版本控制、跨不同環(huán)境更快、更安全的基礎(chǔ)架構(gòu)部署以及您的基礎(chǔ)架構(gòu)的最新文檔。
Terraform 是一種開(kāi)源 IaC 工具,可讓您與多個(gè)云提供商合作,按照配置文件中的定義啟動(dòng)基礎(chǔ)架構(gòu)。
Terraform HCL 是一種聲明性語(yǔ)言,可讓您描述所需的基礎(chǔ)設(shè)施配置。您所要做的就是指定您想要?jiǎng)?chuàng)建的內(nèi)容,Terraform 會(huì)通過(guò)對(duì)您選擇的云提供商進(jìn)行 API 調(diào)用來(lái)代表您處理創(chuàng)建。