過(guò)去,管理IT基礎(chǔ)設(shè)施是一項(xiàng)艱巨的任務(wù)。系統(tǒng)管理員必須手動(dòng)管理和配置應(yīng)用程序運(yùn)行所需的所有硬件和軟件。
然而,近年來(lái),情況發(fā)生了巨大變化。云計(jì)算等趨勢(shì)徹底改變并改進(jìn)了組織設(shè)計(jì)、開(kāi)發(fā)和維護(hù)其IT基礎(chǔ)設(shè)施的方式。
這一趨勢(shì)的關(guān)鍵組成部分之一被稱(chēng)為“基礎(chǔ)設(shè)施即代碼”(infrastructure as code,簡(jiǎn)稱(chēng)IaC),也就是我們今天要討論的內(nèi)容。
根據(jù)Palo Alto Networks Prisma cloud高級(jí)副總裁Varun Badhwar的說(shuō)法,基礎(chǔ)設(shè)施即代碼正在成為云安全的三大支柱之一,將DevOps和安全性結(jié)合在一起,共同推動(dòng)DevSecOps市場(chǎng)。
基礎(chǔ)設(shè)施即代碼(IaC)定義
維基百科對(duì)基礎(chǔ)設(shè)施即代碼的定義為,
基礎(chǔ)設(shè)施即代碼是通過(guò)機(jī)器可讀的定義文件,而不是物理硬件配置或交互式配置工具來(lái)管理和配置計(jì)算數(shù)據(jù)中心的過(guò)程。
簡(jiǎn)單來(lái)說(shuō),基礎(chǔ)設(shè)施即代碼意味著使用配置文件管理您的IT基礎(chǔ)設(shè)施。
接下來(lái),你可能會(huì)問(wèn)“我們?yōu)槭裁匆@樣做?”這就要看基礎(chǔ)設(shè)施即代碼能夠解決哪些問(wèn)題了?
管理IT基礎(chǔ)設(shè)施的痛點(diǎn)
長(zhǎng)期以來(lái),管理IT基礎(chǔ)設(shè)施都是一個(gè)手動(dòng)過(guò)程。人們會(huì)將服務(wù)器實(shí)際位置就位并對(duì)其進(jìn)行配置。只有在機(jī)器被配置為操作系統(tǒng)和應(yīng)用程序所需的正確設(shè)置后,這些人才會(huì)部署應(yīng)用程序。不出所料,這種手動(dòng)過(guò)程通常會(huì)導(dǎo)致很多問(wèn)題。
第一個(gè)大問(wèn)題就是成本。從網(wǎng)絡(luò)工程師到硬件維護(hù)技術(shù)人員,您必須聘請(qǐng)?jiān)S多專(zhuān)業(yè)人員在流程的每一步執(zhí)行必要的任務(wù)。顯然,所有這些人都需要支付報(bào)酬,且需要得到管理,這又會(huì)導(dǎo)致更多的管理成本,同時(shí)增加組織內(nèi)部溝通的復(fù)雜性。結(jié)果是,錢(qián)花了也未能構(gòu)建和維護(hù)好自己的數(shù)據(jù)中心,白白增加了幾個(gè)數(shù)量級(jí)的成本。
另一個(gè)大問(wèn)題就是可擴(kuò)展性和可用性。也可以將這些都?xì)w結(jié)為“速度”問(wèn)題。由于手動(dòng)配置太慢,應(yīng)用程序經(jīng)常會(huì)遇到訪(fǎng)問(wèn)高峰,而系統(tǒng)管理員會(huì)拼命嘗試設(shè)置服務(wù)器來(lái)管理負(fù)載。這必然會(huì)影響可用性。如果組織沒(méi)有備份服務(wù)器甚至數(shù)據(jù)中心,那么應(yīng)用程序可能會(huì)長(zhǎng)時(shí)間不可用。
第三個(gè)主要問(wèn)題就是監(jiān)控和性能可見(jiàn)性。既然已經(jīng)擁有了所有基礎(chǔ)設(shè)施,那么如何密切關(guān)注它以確保其正在以最佳方式運(yùn)行呢?當(dāng)遇到問(wèn)題,又如何準(zhǔn)確定位問(wèn)題來(lái)自基礎(chǔ)設(shè)施的哪個(gè)位置呢?是網(wǎng)絡(luò)、服務(wù)器還是應(yīng)用程序?Netreo之類(lèi)的工具可以讓您全面了解整個(gè)IT基礎(chǔ)設(shè)施的性能。借助Netreo的自動(dòng)設(shè)備發(fā)現(xiàn)和配置,您可以確保自己的環(huán)境中沒(méi)有任何盲點(diǎn),而且平臺(tái)的拓?fù)溆成?、事件關(guān)聯(lián)和自動(dòng)根本原因分析使您能夠準(zhǔn)確查明問(wèn)題發(fā)生的位置。
最后一個(gè)問(wèn)題是不一致性。如果多個(gè)人負(fù)責(zé)手動(dòng)部署配置,不一致將成為不可避免的問(wèn)題。
云計(jì)算:解藥?
云計(jì)算幫助我們解決了上述的部分問(wèn)題,它使你無(wú)需構(gòu)建和維護(hù)數(shù)據(jù)中心以及與之相關(guān)的高成本。
不過(guò),云計(jì)算遠(yuǎn)非靈丹妙藥。雖然它允許您快速設(shè)置您的基礎(chǔ)設(shè)施需求——從而解決高可用性和可擴(kuò)展性等嚴(yán)重問(wèn)題——但它對(duì)解決不一致問(wèn)題沒(méi)有任何幫助。當(dāng)不止一個(gè)人執(zhí)行配置時(shí),差異必然存在。
而基礎(chǔ)設(shè)施即代碼正好能夠彌補(bǔ)問(wèn)題的缺失部分。
讓我們回顧一下之前介紹過(guò)的基礎(chǔ)設(shè)施即代碼定義:基礎(chǔ)設(shè)施即代碼意味著使用配置文件管理您的IT基礎(chǔ)設(shè)施。
該定義的關(guān)鍵要點(diǎn)是:在基礎(chǔ)設(shè)施即代碼之前,IT人員必須手動(dòng)更改配置以管理其基礎(chǔ)設(shè)施。使用基礎(chǔ)設(shè)施即代碼,您的基礎(chǔ)設(shè)施配置會(huì)采用代碼文件的形式。由于它只是文本,因此您可以輕松編輯、復(fù)制和分發(fā)它。您可以(而且應(yīng)該)將它置于源代碼控制之下,就像任何其他源代碼文件一樣。
基礎(chǔ)設(shè)施即代碼的好處
剛剛說(shuō)到云計(jì)算只能解決其中一些問(wèn)題,但不是全部。而基礎(chǔ)設(shè)施即代碼正是彌補(bǔ)問(wèn)題最后缺失的那部分。
接下來(lái),我們將深入探討您的組織通過(guò)采用基礎(chǔ)設(shè)施即服務(wù)解決方案可以獲得的一些好處:
速度
基礎(chǔ)設(shè)施即代碼提供的一個(gè)顯著優(yōu)勢(shì)就是速度。它使您能夠通過(guò)運(yùn)行腳本快速設(shè)置完整的基礎(chǔ)設(shè)施。您可以為每個(gè)環(huán)境執(zhí)行此操作,從開(kāi)發(fā)到生產(chǎn)、過(guò)渡、QA 等等。基礎(chǔ)設(shè)施即代碼可以使整個(gè)軟件開(kāi)發(fā)生命周期更加高效。
一致性
手動(dòng)過(guò)程會(huì)導(dǎo)致錯(cuò)誤,因?yàn)槿说挠洃洉?huì)出錯(cuò),人就會(huì)犯錯(cuò)。此外,溝通也是個(gè)問(wèn)題,而且我們通常并不擅長(zhǎng)。正如上所述,無(wú)論你多么努力,手動(dòng)基礎(chǔ)設(shè)施管理都會(huì)導(dǎo)致差異。基礎(chǔ)設(shè)施即代碼通過(guò)讓配置文件本身成為唯一的事實(shí)來(lái)源來(lái)解決這個(gè)問(wèn)題。這樣,您就可以保證重復(fù)部署相同的配置,而不會(huì)出現(xiàn)差異。
問(wèn)責(zé)制
這是一種快速簡(jiǎn)便的方法。由于您可以像任何源代碼文件一樣對(duì)基礎(chǔ)設(shè)施即代碼配置文件進(jìn)行版本控制,因此您可以完全跟蹤每個(gè)配置所經(jīng)歷的更改。一切都不再是關(guān)于“誰(shuí)做了什么”以及“何時(shí)做了什么”的猜謎游戲。
高效率
通過(guò)使用基礎(chǔ)設(shè)施即代碼,您可以在多個(gè)階段部署您的基礎(chǔ)設(shè)施架構(gòu)。這使得整個(gè)軟件開(kāi)發(fā)生命周期更加高效,將團(tuán)隊(duì)的生產(chǎn)力提升到新的水平。
您可以讓程序員使用基礎(chǔ)設(shè)施即代碼創(chuàng)建和啟動(dòng)沙箱環(huán)境,讓他們能夠安全地進(jìn)行隔離開(kāi)發(fā)。對(duì)于QA專(zhuān)業(yè)人員來(lái)說(shuō)也是如此,他們可以擁有生產(chǎn)環(huán)境的完美副本,并在其中運(yùn)行測(cè)試。最后,到了部署階段,您可以一步將基礎(chǔ)設(shè)施和代碼推送到生產(chǎn)環(huán)境。
低成本
毫無(wú)疑問(wèn),基礎(chǔ)設(shè)施即代碼的主要好處之一就是降低了基礎(chǔ)設(shè)施管理的成本。通過(guò)將云計(jì)算與基礎(chǔ)設(shè)施即代碼結(jié)合使用,可以顯著降低成本,這是因?yàn)槟槐鼗ㄥX(qián)購(gòu)買(mǎi)硬件、雇用人員來(lái)操作它,也不必建造或租用物理空間來(lái)存儲(chǔ)它。
更重要的是,基礎(chǔ)設(shè)施即代碼還以另一種更微妙的方式降低了您的成本,這就是我們所說(shuō)的“機(jī)會(huì)成本”。
要知道,把有用的人放置在適當(dāng)?shù)奈恢貌拍茏畲笙薅鹊陌l(fā)揮效用。如果只是讓他們做一些可以自動(dòng)化完成的任務(wù),無(wú)疑是在浪費(fèi)資源,他們應(yīng)該把精力放在能夠?yàn)槠髽I(yè)組織帶來(lái)更多價(jià)值的任務(wù)上。這就是自動(dòng)化策略(基礎(chǔ)設(shè)施即代碼就包含其中)派上用場(chǎng)的地方。
基礎(chǔ)設(shè)施即代碼工作原理
基礎(chǔ)設(shè)施即代碼工具的工作方式各不相同,但我們通常可以將它們分為兩種主要類(lèi)型:遵循“命令式資源配置方法”的工具以及遵循“聲明式資源配置方法”的工具。
其中,命令式資源配置方法指的是資源使用者沒(méi)有正式編碼所需的狀態(tài),并且由資源使用者來(lái)決定命令序列。
最值得注意的是,命令式方法是不可重復(fù)的,因此,也就無(wú)法自動(dòng)執(zhí)行,因?yàn)橘Y源使用者必須為每個(gè)給定的當(dāng)前狀態(tài)確定導(dǎo)致所需狀態(tài)的命令序列。
而聲明式資源配置方法指的是,資源使用者正式編碼所需的狀態(tài),并且由組件來(lái)決定命令序列。
最值得注意的是,聲明式方法是可重復(fù)的,因此可以實(shí)現(xiàn)自動(dòng)化,因?yàn)榻M件可以確定任何可能導(dǎo)致當(dāng)前狀態(tài)所需狀態(tài)的命令序列。
最佳實(shí)踐
下面我們?yōu)榇蠹姨峁┮粋€(gè)最佳實(shí)踐列表,以幫助您充分利用基礎(chǔ)設(shè)施即代碼策略。
使代碼成為您唯一的事實(shí)來(lái)源。您應(yīng)該在配置文件中明確編碼所有基礎(chǔ)設(shè)施規(guī)范。您的配置文件應(yīng)該是所有基礎(chǔ)設(shè)施管理問(wèn)題的唯一真實(shí)來(lái)源。
版本控制所有配置文件,將所有配置文件置于源代碼控制之下。
為您的基礎(chǔ)架構(gòu)規(guī)范使用盡可能少的文檔(或根本不使用)。這一點(diǎn)是第一點(diǎn)的邏輯結(jié)果。由于您的配置文件應(yīng)該是您的唯一真實(shí)來(lái)源,因此不需要更多文檔。外部文檔很容易與實(shí)際配置不同步,但這不會(huì)發(fā)生在配置文件中。
測(cè)試和監(jiān)控您的配置?;A(chǔ)設(shè)施即代碼是代碼,和所有代碼一樣,它可以被測(cè)試。所以你應(yīng)該測(cè)試一下!通過(guò)為基礎(chǔ)設(shè)施即代碼使用測(cè)試和監(jiān)控工具,您可以在將服務(wù)器部署到生產(chǎn)環(huán)境之前檢查服務(wù)器中的錯(cuò)誤和不一致情況。
基礎(chǔ)設(shè)施即代碼自動(dòng)化配置與編排工具
目前,市場(chǎng)上存在很多基礎(chǔ)設(shè)施即代碼自動(dòng)化部署工具,下面為大家重點(diǎn)介紹四款自動(dòng)化配置與編排工具:
阿里云資源編排服務(wù)ROS(Resource Orchestration Service)
這是云原生編排工具,通過(guò)編寫(xiě) JSON/YAML 格式的模板,在模板中定義所需的ECS實(shí)例、數(shù)據(jù)庫(kù)實(shí)例等云服務(wù)資源以及資源依賴(lài)關(guān)系等,然后再根據(jù)模板在 ROS 中創(chuàng)建資源棧,ROS 服務(wù)端將根據(jù)模板自動(dòng)完成所有資源的創(chuàng)建和配置,實(shí)現(xiàn)自動(dòng)化部署及運(yùn)維。而資源棧則管理著模板中定義的所有資源,并可通過(guò)新模板來(lái)更新資源棧,包括資源的新增、更新或刪除等操作。
AWS CloudFormation
這也是云原生的編排工具,運(yùn)維人員也是通過(guò) JSON/YAML 格式的模板定義云服務(wù)資源,通過(guò)資源棧管理這些資源。
HashiCorp Terraform
這是一個(gè)開(kāi)源的自動(dòng)化編排工具。以配置文件為驅(qū)動(dòng),可以在文件中定義所要管理的組件,即基礎(chǔ)設(shè)施資源,以此生成一個(gè)可執(zhí)行的計(jì)劃,通過(guò)執(zhí)行這個(gè)計(jì)劃來(lái)完成所定義組件的創(chuàng)建,增量式的變更和持續(xù)的管理。如果不可執(zhí)行,會(huì)提示報(bào)錯(cuò)。Terraform 不僅可以管理IaaS層的資源,如計(jì)算實(shí)例、網(wǎng)絡(luò)實(shí)例和存儲(chǔ)實(shí)例等,也可以管理更上層的服務(wù),如DNS 域名和解析記錄、SaaS 應(yīng)用的功能等。
Pulumi
與 Terraform 一樣也是開(kāi)源項(xiàng)目,但它與 Terraform 的重要區(qū)別在于:可以用熟悉的編程語(yǔ)言來(lái)編寫(xiě)聲明式配置,而不需要額外學(xué)習(xí)云服務(wù)商特定的模板語(yǔ)言來(lái)寫(xiě)配置。
企業(yè)組織可以根據(jù)自身需求和業(yè)務(wù)部署模式選擇適當(dāng)?shù)墓ぞ撸玫匕l(fā)揮基礎(chǔ)設(shè)施即代碼的作用。
總結(jié)
基礎(chǔ)設(shè)施即代碼是 DevOps 運(yùn)動(dòng)的關(guān)鍵部分。如果您將云計(jì)算視為解決由人工IT管理引起的許多問(wèn)題的第一步,那么可以說(shuō)基礎(chǔ)設(shè)施即代碼是下一個(gè)合乎邏輯的步驟。它充分發(fā)揮了云計(jì)算的潛力,并將開(kāi)發(fā)人員和其他專(zhuān)業(yè)人員從執(zhí)行容易出錯(cuò)的手動(dòng)任務(wù)中解放出來(lái)。此外,它還可以在軟件開(kāi)發(fā)生命周期的所有階段降低成本并提高效率。