從基礎(chǔ)設(shè)施即代碼到環(huán)境即代碼的進(jìn)化之路
運(yùn)用GitOps來(lái)啟動(dòng)環(huán)境,可為開(kāi)發(fā)團(tuán)隊(duì)帶來(lái)一致性、版本控制、速度等多方面的好處。
譯自How We Evolved from IaC to Environments as Code,作者 Edan Evantal 是 Quali 的CTO Edan Evantal負(fù)責(zé)Quali基礎(chǔ)設(shè)施自動(dòng)化和環(huán)境交付平臺(tái)的所有產(chǎn)品工程。在加入Quali之前,Edan曾在Matrix IT和Sibam Ltd擔(dān)任工程管理職務(wù)。他在高科技行業(yè)擁有18年以上的經(jīng)驗(yàn)......
這些年來(lái),在構(gòu)建我們的平臺(tái)的過(guò)程中,并與我們的產(chǎn)品所支持的其他DevOps和平臺(tái)工程師一起工作,我親眼見(jiàn)證了應(yīng)用基礎(chǔ)架構(gòu)的演變正在打破它本來(lái)意在提供的自動(dòng)化。
基礎(chǔ)設(shè)施即代碼(IaC)工具對(duì)于定義和自動(dòng)交付云服務(wù)非常寶貴。當(dāng)一個(gè)開(kāi)發(fā)團(tuán)隊(duì)的需求擴(kuò)展到此范圍之外時(shí),自動(dòng)化通常就會(huì)中斷。
原因有兩個(gè):
- IaC工具的設(shè)計(jì)目的在于速度和自動(dòng)化,而不是作為環(huán)境的真實(shí)來(lái)源。大型團(tuán)隊(duì)在大規(guī)模利用基礎(chǔ)設(shè)施和了解代碼更改可能如何擾亂應(yīng)用性能方面可能會(huì)遇到困難。
- IaC工具之間不兼容。應(yīng)用日益依賴于用各種技術(shù)定義的復(fù)雜基礎(chǔ)設(shè)施,需要手動(dòng)編排來(lái)協(xié)調(diào)工具的細(xì)微差異。
開(kāi)發(fā)人員在基礎(chǔ)設(shè)施自動(dòng)化功能與應(yīng)用需求實(shí)際情況之間存在鴻溝。其結(jié)果是速度降低,基礎(chǔ)設(shè)施存在未管理或配置錯(cuò)誤的風(fēng)險(xiǎn)增加。
我們?cè)儐?wèn)自己,我們能做些什么來(lái)彌合這一鴻溝,這讓我們想到了一個(gè)簡(jiǎn)單的問(wèn)題:
如果您可以以代碼的形式啟動(dòng)所有環(huán)境,而不管基礎(chǔ)設(shè)施的范圍或用于定義它的 IaC 工具是什么,會(huì)怎么樣?
在Git中將環(huán)境定義為代碼
為了將環(huán)境定義為代碼,我們首先需要以開(kāi)發(fā)人員啟動(dòng)環(huán)境所需的一切來(lái)定義,這種格式對(duì)于DevOps來(lái)說(shuō)既易于理解,又方便自動(dòng)化機(jī)器讀取。
使用我們的Torque平臺(tái),我們連接到一個(gè)Git倉(cāng)庫(kù),發(fā)現(xiàn)其中定義的IaC模塊,并將資源配置打包成一個(gè)新的由平臺(tái)自動(dòng)生成的YAML。
從那里,我們可以修改任何YAML代碼,以包含環(huán)境啟動(dòng)時(shí)將生成的基礎(chǔ)架構(gòu)組件、參數(shù)、依賴項(xiàng)、元數(shù)據(jù)、身份驗(yàn)證和輸出。
下面是YAML代碼片段示例:
kind: environment
environment_name: "Workstation Staging A"
description: "EC2 workstation for staging workloads"
state: inactive
owner_email: "myemail@email.com"
blueprint:
name: "test-workstation"
repository_name: "cloud-native-application"
branch: "main"
commit: "536955389cd4ecbd1b8895c4a1093fe14a809b65"
inputs:
service-account: "sa"
agent: "review3"
grains:
create-ec2:
source:
commit: "697d1"
specs:
instance_type: "t2.large"
ami: "ami-0c55b159ertafe1f0"
security_groups: ["sg-0246e9ddc2b2f23f4"]
post-deployment:
scripts: ["./configure-environment.sh", "./deploy-application.sh"]
這包含了環(huán)境所有必要元數(shù)據(jù)的單一定義,以結(jié)構(gòu)化格式呈現(xiàn)。
簡(jiǎn)單來(lái)說(shuō),我們利用現(xiàn)有的基礎(chǔ)設(shè)施代碼來(lái)定義環(huán)境為代碼。
使用GitOps啟動(dòng)應(yīng)用環(huán)境
為了滿足客戶的需求,我們需要使這一定義具有操作性。
我們的初始答案是依賴我們的自助門(mén)戶。當(dāng)我們平臺(tái)中的管理員創(chuàng)建這些YAML文件(我們稱之為環(huán)境的“藍(lán)圖”)時(shí),他們可以選擇“發(fā)布”它。這會(huì)將環(huán)境添加到平臺(tái)中的一個(gè)自助服務(wù)目錄中,擁有最終用戶權(quán)限的用戶可以按需啟動(dòng)該環(huán)境。對(duì)于那些將環(huán)境集成到開(kāi)發(fā)者工具、CI/CD或內(nèi)部開(kāi)發(fā)者門(mén)戶的人來(lái)說(shuō),發(fā)布新藍(lán)圖也可以通過(guò)這些工具訪問(wèn)。
為了支持采用GitOps的團(tuán)隊(duì),我們需要將已發(fā)布的藍(lán)圖集成到日常工作流程中。
通過(guò)在我們發(fā)現(xiàn)IaC模塊的原始倉(cāng)庫(kù)中存儲(chǔ)這個(gè)新的YAML文件,我們使環(huán)境定義在GitOps中可訪問(wèn)。實(shí)際上,我們?yōu)槟軌蛟L問(wèn)該倉(cāng)庫(kù)的用戶“發(fā)布”了環(huán)境定義。
現(xiàn)在,開(kāi)發(fā)人員可以使用單個(gè)命令啟動(dòng)完整的環(huán)境。
這種方法還提供了幾個(gè)額外的優(yōu)勢(shì):
- 版本控制: 就像應(yīng)用代碼一樣,環(huán)境可以進(jìn)行版本控制,以確保跟蹤每一次更改,并在必要時(shí)進(jìn)行回滾。
- 一致性: 利用這一定義每次都以一致的方式預(yù)配環(huán)境,消除了“它在我的機(jī)器上能工作”的問(wèn)題。
- 速度: 開(kāi)發(fā)人員可以通過(guò)簡(jiǎn)單地提交代碼來(lái)預(yù)配環(huán)境——這是他們熟悉的動(dòng)作,所以他們可以快速響應(yīng)開(kāi)發(fā)、測(cè)試或生產(chǎn)需求,而無(wú)需其他團(tuán)隊(duì)的幫助。
- 協(xié)作和治理: 創(chuàng)建環(huán)境的共享定義為僅靠IaC本身所不能輕松做到的協(xié)作奠定了基礎(chǔ)。
- 運(yùn)營(yíng)效率: 自動(dòng)化預(yù)配流程意味著減少冗余的手動(dòng)工作(和疲憊),以及DevOps工程師可以承擔(dān)更有價(jià)值的任務(wù)。
在平臺(tái)工程中,每一秒都是寶貴的,每一個(gè)資源都很重要。隨著基礎(chǔ)設(shè)施變得越來(lái)越復(fù)雜,以代碼的形式管理環(huán)境是現(xiàn)代DevOps組織成熟的下一步。