從基礎設施即代碼到環境即代碼的進化之路
運用GitOps來啟動環境,可為開發團隊帶來一致性、版本控制、速度等多方面的好處。
譯自How We Evolved from IaC to Environments as Code,作者 Edan Evantal 是 Quali 的CTO Edan Evantal負責Quali基礎設施自動化和環境交付平臺的所有產品工程。在加入Quali之前,Edan曾在Matrix IT和Sibam Ltd擔任工程管理職務。他在高科技行業擁有18年以上的經驗......
這些年來,在構建我們的平臺的過程中,并與我們的產品所支持的其他DevOps和平臺工程師一起工作,我親眼見證了應用基礎架構的演變正在打破它本來意在提供的自動化。
基礎設施即代碼(IaC)工具對于定義和自動交付云服務非常寶貴。當一個開發團隊的需求擴展到此范圍之外時,自動化通常就會中斷。
原因有兩個:
- IaC工具的設計目的在于速度和自動化,而不是作為環境的真實來源。大型團隊在大規模利用基礎設施和了解代碼更改可能如何擾亂應用性能方面可能會遇到困難。
- IaC工具之間不兼容。應用日益依賴于用各種技術定義的復雜基礎設施,需要手動編排來協調工具的細微差異。
開發人員在基礎設施自動化功能與應用需求實際情況之間存在鴻溝。其結果是速度降低,基礎設施存在未管理或配置錯誤的風險增加。
我們詢問自己,我們能做些什么來彌合這一鴻溝,這讓我們想到了一個簡單的問題:
如果您可以以代碼的形式啟動所有環境,而不管基礎設施的范圍或用于定義它的 IaC 工具是什么,會怎么樣?
在Git中將環境定義為代碼
為了將環境定義為代碼,我們首先需要以開發人員啟動環境所需的一切來定義,這種格式對于DevOps來說既易于理解,又方便自動化機器讀取。
使用我們的Torque平臺,我們連接到一個Git倉庫,發現其中定義的IaC模塊,并將資源配置打包成一個新的由平臺自動生成的YAML。
從那里,我們可以修改任何YAML代碼,以包含環境啟動時將生成的基礎架構組件、參數、依賴項、元數據、身份驗證和輸出。
下面是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"]
這包含了環境所有必要元數據的單一定義,以結構化格式呈現。
簡單來說,我們利用現有的基礎設施代碼來定義環境為代碼。
使用GitOps啟動應用環境
為了滿足客戶的需求,我們需要使這一定義具有操作性。
我們的初始答案是依賴我們的自助門戶。當我們平臺中的管理員創建這些YAML文件(我們稱之為環境的“藍圖”)時,他們可以選擇“發布”它。這會將環境添加到平臺中的一個自助服務目錄中,擁有最終用戶權限的用戶可以按需啟動該環境。對于那些將環境集成到開發者工具、CI/CD或內部開發者門戶的人來說,發布新藍圖也可以通過這些工具訪問。
為了支持采用GitOps的團隊,我們需要將已發布的藍圖集成到日常工作流程中。
通過在我們發現IaC模塊的原始倉庫中存儲這個新的YAML文件,我們使環境定義在GitOps中可訪問。實際上,我們為能夠訪問該倉庫的用戶“發布”了環境定義。
現在,開發人員可以使用單個命令啟動完整的環境。
這種方法還提供了幾個額外的優勢:
- 版本控制: 就像應用代碼一樣,環境可以進行版本控制,以確保跟蹤每一次更改,并在必要時進行回滾。
- 一致性: 利用這一定義每次都以一致的方式預配環境,消除了“它在我的機器上能工作”的問題。
- 速度: 開發人員可以通過簡單地提交代碼來預配環境——這是他們熟悉的動作,所以他們可以快速響應開發、測試或生產需求,而無需其他團隊的幫助。
- 協作和治理: 創建環境的共享定義為僅靠IaC本身所不能輕松做到的協作奠定了基礎。
- 運營效率: 自動化預配流程意味著減少冗余的手動工作(和疲憊),以及DevOps工程師可以承擔更有價值的任務。
在平臺工程中,每一秒都是寶貴的,每一個資源都很重要。隨著基礎設施變得越來越復雜,以代碼的形式管理環境是現代DevOps組織成熟的下一步。