天天看點

雲原生時代,不可不知的基礎設施即代碼(IaC)

作者:曉數神州
雲原生時代,不可不知的基礎設施即代碼(IaC)

IaC 是 DevOps 的必要支撐。

近日,在極狐Tech Talk 直播上,極狐(GitLab) 進階網站可靠性工程師SRE 戚加欣,從 SRE 視角出發,與大家分享了 IaC 基礎知識、工具和方法和基于極狐GitLab 的具體實踐經驗。

以下内容整理自本次分享,你也可以點選文末「閱讀原文」觀看視訊回放。enjoy~

何為 IaC?

基于 Thoughtworks 公司雲實踐上司人 Kief Morris 在《基礎設施即代碼》一書中對基礎設施即代碼的定義:

基礎設施即代碼 (Infrastructure-as-Code,IaC) 指的是通過代碼而不是手動流程,來管理和配置基礎設施。它把基礎設施、工具和服務以及對基礎設施的管理本身作為一個軟體系統,采納軟體工程實踐 (SRE),以可重複的、可靠的方法來設計、改變和部署軟體環境,以聲明性的方式取代手工操作。

IaC 發展至今,從概念到落地,從小衆到普及,随之誕生了許多 IaC 流行工具(如下圖),幫助 DevOps 團隊以最佳方式自動化基礎設施部署和管理。

雲原生時代,不可不知的基礎設施即代碼(IaC)

為什麼 IaC 很重要?

大資料和雲計算時代下的新挑戰

SRE 的職責之一是為業務提供基礎資源,維護各種服務的性能和穩定性。

在傳統工作流程中,業務方向運維團隊提供一個資源需求工單,運維團隊根據需求工單,手動配置軟硬體基礎資源給業務方。在企業規模小、業務變化小的前提下,可能一台虛拟機就可以支撐公司的所有業務,該方式可以基本滿足需求。

随着大資料和雲計算時代的到來,依靠分布式伺服器建構起來的 “雲” 叢集帶來了強大的計算能力;資源的動态伸縮、高擴充性也使得叢集的架構變得更加複雜多元,給 SRE 的工作帶來了新的挑戰:

雲原生時代,不可不知的基礎設施即代碼(IaC)

➤ 日益增長的需求

企業資訊化和數字化程度不斷提升,IT 基礎設施規模和複雜度也在不斷增加。

➤ 手動操作瓶頸

大規模複雜叢集給手動操作帶來瓶頸,通過人力運維必定是不可取的,依靠自動化工具進行管理成為必然。

➤ 脫離的回報

長期以來,開發者和運維人員的協作方式是分裂的,溝通回報環是互相脫離的,導緻生産效率低、故障排除慢。

➤ 手動操作錯誤

手動操作不可避免地會有失誤,規模擴大導緻更大的人為失誤。

IaC 幫助企業降本增效,并實作 GitOps 目标

GitOps 是一個軟體開發架構,它使組織能夠持續傳遞軟體應用程式,同時使用 Git 作為單一事實來源有效地管理 IT 基礎設施。

GitOps 是 DevOps 的一個子集,它結合了 IaC 和 DevOps 最佳實踐,建立了一個操作模型,用于管理架構并根據 Git 存儲庫的狀态即時複制系統的雲基礎架構。

IaC 協助企業以多種方式管理其 IT 基礎設施需求,基于以下主要優勢,幫助企業降本增效;同時,結合 Git 的代碼管理與版本控制,和 CI/CD 自動化,可以實作更高一級的 GitOps 目标。

➤ 自動化

通過自動化加快基礎設施配置速度,并借助可見性優勢幫助企業内的其他團隊提升工作速度、強化工作效率。

➤ 聲明式

以聲明式方式,直接指定定基礎設施的理想狀态,如想要的資源、必需的屬性等,而不是過程。IaC 工具會自動配置理想的基礎設施,可多次執行且結果相同,無需人為幹預。

➤ 可重用性

可輕松使用同一份代碼多次建立和銷毀多個資源。

➤ 可驗證

可內建單元測試或端到端測試,驗證理想狀态與目前狀态的基礎設施的差異。如果結果與預期不一緻,就對代碼進行疊代,直到結果通過測試并與預期一緻。

➤ 提高一緻性

基于代碼化實作環境建立的單一可信來源,使得每次均能提供相同環境,實作基礎設施配置的全面标準化,消除配置漂移。

「不可變基礎設施」時代來臨

  • 可變基礎設施:指在生産中改變基礎設施元件,而整個服務或應用繼續正常運作的做法。其好處是在基礎設施中有更多的一緻性和可靠性,以及更簡單更可預測的部署過程。它可以緩解或完全防止可變基礎設施中常見的問題。
  • 不可變基礎設施:指基礎設施和應用結合在一起,建立成一個完整的服務或應用程式。如果任何元件需要改變,它不會被改變或重新配置,它們都被更新并有效地重新部署在一個執行個體中。一個新的疊代被組裝、測試、驗證和啟動,而舊的疊代則被停止,其資源被釋放以重新使用。

不可變的基礎設施已經獲得了青睐,特别是在雲和微服務環境中,這些環境具有高度的可擴充性,涉及更多互相依賴的元件和服務。與打更新檔和重新配置單個基礎設施元件相比,重新釋出成套的不可變的服務群組件更有效率和效果。

使用 IaC 可以實作「不可變基礎設施」這種新的運維邏輯。以資料庫更新為例:

在不可變基礎設施邏輯下,不是直接在原有資料庫環境上進行更新,而是通過打包軟體,打包到虛拟機鏡像當中,通過逐個替換原有叢集中的鏡像的方式,将服務逐漸更新。

雲原生時代,不可不知的基礎設施即代碼(IaC)

IaC 工具有哪些?

目前,市面上有很多流行的 IaC 工具,它們具有一些共性:

  • 使用 Yaml、Json、Jsonnet、HCL2 等 DSL 語言代碼化定義;
  • 以聲明式程式設計模式為主;
  • 完全開源或開放基本元件模式,并有額外的商業服務幫助企業從産品中提取額外價值的功能;
  • 支援多雲/混合雲模式,無雲廠商綁定。
雲原生時代,不可不知的基礎設施即代碼(IaC)

上述工具在解決不同問題上,各有所長:

  • 建立/改變/銷毀基礎設施資源,如計算、存儲、網絡元件或平台服務,如資料庫、Kubernetes 叢集等;
  • 在基礎設施之上部署/更新應用程式;
  • 管理應用程式所使用的配置。

那麼如何選擇 IaC 工具呢?需要根據實際情況參考以下次元進行選擇:

  • 使用哪種作業系統來建構雲資源:Windows 或 Linux?
  • 在使用哪個雲供應商?AWS、Azure 和谷歌雲還是國内雲廠商。
  • 将使用哪種程式設計語言?Yaml、Json、Python、Golang?

同時,各個工具在使用範疇範圍上也有所不同,如下圖:

雲原生時代,不可不知的基礎設施即代碼(IaC)

極狐GitLab 上的 IaC 實踐

極狐GitLab 也提供了 7 大功能支援 IaC,包括:

代碼管理及版本控制

IaC 本身是代碼。極狐GitLab 作為一體化安全 DevOps 平台,管理代碼是基本功能,十分擅長。

極狐GitLab SRE 團隊即将 IaC 全部托管于極狐GitLab 上。

雲原生時代,不可不知的基礎設施即代碼(IaC)

CI/CD

極狐GitLab 提供基于 Terraform 的 IaC 流水線模闆,支援以 Pipeline as Code 的方式引用,無需任何額外配置即可實作 IaC 自動化流水線的建立和運作,降低使用者的使用門檻,快速支撐使用者實作基礎設施的代碼化和自動化。

雲原生時代,不可不知的基礎設施即代碼(IaC)

合并請求 (MR)

IaC 使得使用者能夠擺脫傳統基礎設施變更中複雜和繁重的流程,通過采用軟體研發中最經典的代碼檢視(Code Review)實踐,從代碼次元對基礎架構的更改進行驗證、稽核與協作,確定基礎環境的服務連續性。

極狐GitLab 為此提供了基于合并請求 (MR) 的解決方案,通過在合并請求頁面中可視化 Terraform 的代碼更改、測試結果和預期效果,大幅提升基礎變更管理送出和審批的協作效率。

雲原生時代,不可不知的基礎設施即代碼(IaC)

基礎設施系統資料庫

有了極狐GitLab 基礎設施注冊中心,你可以将極狐GitLab 項目作為基礎設施包的私有注冊中心,用極狐GitLab CI/CD 建立和釋出包,然後從其他私有項目中消費。

雲原生時代,不可不知的基礎設施即代碼(IaC)

基礎設施即代碼(IaC)掃描

基礎設施即代碼(IaC)掃描可以掃描你的 IaC 配置檔案的已知漏洞。

目前,IaC 掃描支援 Terraform、Ansible、AWS CloudFormation 和 Kubernetes 的配置檔案。

雲原生時代,不可不知的基礎設施即代碼(IaC)
雲原生時代,不可不知的基礎設施即代碼(IaC)

管理 Terraform 狀态

代碼與實際資源之間還有狀态檔案的映射,進行對比即可得知目标狀态與實際狀态的差距。極狐GitLab 提供狀态檔案托管,確定版本一緻。

雲原生時代,不可不知的基礎設施即代碼(IaC)

極狐GitLab SaaS 基礎設施架構

極狐GitLab SaaS 的基礎設施架構,目前已經實作了 100% 的 IaC 管理,基本沒有手動操作。IaC 工具鍊路關系如下圖所示:

雲原生時代,不可不知的基礎設施即代碼(IaC)

極狐GitLab SaaS IaC 開發流程與其他軟體開發流程一緻,如下圖所示:

雲原生時代,不可不知的基礎設施即代碼(IaC)
  • 當産生需求時,建立 Issue ,同時建立 Merge Request(後續代碼變更在此 Merge Request 上進行),送出 commit 進行相關修改;
  • 一旦有代碼送出,就會觸發 CI/CD,完成從建構、測試、安全掃描到部署整個流程,進而完成 Issue 和 Merge Request 的一一關聯。

IaC 最佳實踐

IaC 實踐,同樣遵循代碼開發最佳實踐,包括:

  • 子產品化、高内聚、低耦合、抽象;
  • 分層,比如對一些服務提供子產品,對另一些服務使用子產品,對代碼進行隔離;
  • 自動測試少不了,確定線上代碼都是經過 Staging 環境驗證 de;
  • 代碼可讀性,便于 Review 和協作;
  • Code Review;
  • CI/CD。

以子產品化與分層為例,如下圖,極狐GitLab Terraform 項目分成了專門提供子產品的項目(左)與專門應用子產品的項目(右)。

雲原生時代,不可不知的基礎設施即代碼(IaC)

完成了子產品包裝,在後續使用中,隻需要指定目标與版本,即可引用整個封裝好的子產品。

雲原生時代,不可不知的基礎設施即代碼(IaC)

以上就是本次分享内容,希望對您有幫助。

繼續閱讀