摘要:而對于依賴關系的抽象,業界最通行的做法即使用有向無環圖,來描述事務間的依賴關系。圖表并行遍歷,執行資源動作從根節點開始,并行地去編排整個資源拓撲,遍歷整個有向無環圖,直到所有資源都被成功編排,并執行清理操作。
Terraform 是 Hashicorp 公司開源的一種多云資源編排工具。使用者通過一種特定的配置語言(HCL Hashicorp Configuration Language)來描述基礎設施,由 Terraform 工具統一解析,構建資源之間的關系,生成執行計劃,并通過調用各家云廠商的具體實現來完成整個基礎設施生命周期的管理。
相對于其它的云上資源管理方式,Terraform 的主要特點有:
在 UCloud,我們最終選擇了 Terraform 來編寫 UCloud 基礎設施代碼,并配合 UCloud CLI、Ansible 等工具,進一步拓展了 Terraform 的功能,實現基礎設施可編程。
本文將詳細闡述 Terraform 的整個生命周期,從 Provider 開發者的視角,介紹 Terraform 在安全、效率和狀態一致性三個方面的內部機理與具體實現。
以首次執行 Terraform 創建 UCloud 云上資源為例,這一資源編排動作的生命周期如下圖所示:
圖表 1 Terraform 生命周期
圖中立方體所示分別為:
以中央的有向無環圖為分界線,左側的部分是 Terraform 本身提供的能力,右側是由云廠商提供的能力。
當執行 Terraform 命令首次編排云上資源時:
在并行構建資源時:
隨著云計算的普及,以及人們對于數據安全性和可用性上的考量,越來越多的企業開始意識到,不能把雞蛋放在一個籃子里,基礎設施的中立和非綁定是云服務商十分關鍵的屬性。
Terraform 中每一個云廠商的實現(Provider)都是一個獨立的進程,進程間使用 RPC 通信的方式下發指令和交換數據,這樣設計有什么好處呢?
而從使用者的角度來看,Terraform 多進程模型的重中之重,是多云環境下廠商隔離帶來的安全性問題。安全性是多云編排的基石,如果無法保證云廠商之間的隔離性和安全性,多云編排則無從談起。
Terraform 使用插件(Plugin = Provider + Provisioner)來抽象出各個云廠商之間的差異,并相互隔離。
圖表 2 Terraform 多云插件管理
在一次編排任務的生命周期中,Provider 將會基于 Terraform 提供的能力,完成靜態檢查(Validate)、資源狀態同步(Read/Refresh)、生成執行計劃(Plan)、執行編排(Apply)等操作。
軟件工程的實踐表明,高層次的抽象,可以簡化問題,讓復雜的問題變得可以測試。而對于依賴關系的抽象,業界最通行的做法即使用有向無環圖(DAG,Directed Acyclic Graph)來描述事務間的依賴關系。有向無環圖上的點即事物本身,邊則是事物與事物之間的聯系。
業界對于 DAG 的使用極為廣泛,比較典型的是各種大數據工作流引擎,比如 Oozie,Airflow 等。在這些引擎中,批處理任務作為 DAG 上的節點,而任務間的依賴作為 DAG 上的邊。
圖表 3 業界常見的 DAG 應用
Terraform 將所有的資源構建為一張有向無環圖(DAG),計算它們的依賴關系,并行地去創建和修改相互間沒有依賴的那些資源。因此整個基礎設施的構建過程是高效且嚴格有序的。
下面我們將舉例介紹它的內部原理和實現。
注意:文中的圖與描述為了呈現效果,分別有所簡略,僅供參考
假設一個場景,一臺主機與一個公網彈性 IP 綁定,且客戶使用自有的第三方 DNS 服務,通過 A 記錄指向該主機的公網 IP。
圖表 4 構建云上資源拓撲
這個場景展現了 Terraform 對于資源拓撲關系的描述能力,以及對于外部服務的集成能力。它背后的工作原理是什么樣的呢?
所有云上資源,都抽象為 DAG 的一個節點,而資源與資源之間的關系,則有兩種抽象方式:
圖表 5 有向無環圖變換
在圖構建的過程中,Terraform 需要對 DAG 進行若干次變換(Transform)操作,如:
最后對整張圖進行遍歷,對每一個資源節點分別執行資源編排操作,比如讀取、創建、更新和刪除等。
圖表 6 并行遍歷,執行資源動作
從根節點開始,Terraform 并行地去編排整個資源拓撲,遍歷整個有向無環圖,直到所有資源都被成功編排,并執行清理操作。
可以看出,由于有向無環圖出色的拓撲性質,整個遍歷過程,存在著充分的局部并行化,編排時間跟基礎設施復雜度有顯著關系,而同構基礎設施的規模則對編排時間影響較小,保證了 Terraform 在大規模水平擴展時擁有較好的性能。
Terraform 引入了面向資源的設計,將資源的狀態描述為一個狀態的集合,并支持若干種不同類型的狀態存儲。
默認情況下,在 Terraform 的執行目錄下,會存儲一個本地的資源狀態文件,并在每次編排開始時,從遠程同步狀態到本地,比較該狀態與用戶定義的資源之間的差異,從而生成編排計劃。
在這一抽象中,Terraform 官方給出了幾個基本的定義:
從上文中的定義可以看出,執行計劃(Plan)本質上就是 Diff 格式化輸出的結果,而執行編排就是應用這個 Diff 的過程。
Terraform 將對資源狀態的管理抽象出了一個統一的狀態管理層(Backend),使得基于 Terraform 的資源編排系統可以保持基礎設施的一致性。
想象一個場景,如果 A 同學在操作基礎設施的變更,B 同學此時也想執行變更,這個變更會執行么?
圖表 7 同時操作云上資源
答案顯然是不會的,任何一個成熟的系統都應該對這樣的問題提出解決方案。
Terraform Backend 通過對狀態加鎖來解決資源的競態問題。A 在操作資源的時候狀態會被鎖定,此時 B 執行的任何變更行為都將被拒絕。
其中,consul、etcd 和 http 是比較推薦的擴展:
Terraform 對 Backend 的抽象增強了狀態存儲的可擴展性,同時提供了可選的鎖機制擴展,基于此云廠商可以定義自己的遠程狀態存儲,用于托管用戶的資源狀態,并為用戶提供可靠的并發安全保障。
Terraform 的殺手級特性之一 —— 執行計劃,允許導出執行計劃,延后執行,提供了在 CI/CD 環境下人工審查執行計劃的可能,對關鍵基礎設施變更的安全性提供了保障。所以,導出的執行計劃是否過期是生產環境中最常見的問題。
Terraform 如何保證已經失效的執行計劃不再被執行?Terraform 使用多版本快照(Multi-Version Snapshot)的方式來實現。可以類比于常規的 MVCC(多版本并發控制)來理解,下圖是一個最小化的 MVCC 實現:
圖表 8 常規的多版本 MVCC 實現
進程 P1 和 P2 依次讀到了序號為 1 的數據,并且都想進行寫操作,P1 先修改數據,自增序號為 2 并寫入成功,此時 P2 進行寫操作時,由于修改后的序號同樣為 2,此時應拋出寫失敗,P2 需要主動重新讀取最新的數據再次修改,才能成功寫入。
由于 Terraform 可以執行一個已導出的執行計劃,一個事務的時間被極大延長了,所以版本沖突的可能被無限放大。
基于此,Terraform 同樣選擇該方式,通過一個序號來標識狀態的版本,當執行計劃的狀態序號小于當前狀態的序號時,直接丟棄過時的執行計劃:
圖表 9 Terraform 的執行計劃過期實現
基于這樣的原理,Terraform 保證了導出的執行計劃是有時效性的。例如一個用戶導出了一份執行計劃,將云主機從 1 臺水平擴容到 3 臺,但在該執行計劃審查通過之前,另一個用戶已經擴容到 5 臺云主機,此時這份執行計劃執行時會 Abort,而不會從 5 臺降為 3 臺,從而保證關鍵基礎設施的變更是安全的。
在軟件構建或產品設計中,不可避免的會出現一些破壞性的變更,而這些破壞性的變更又不可避免地會影響資源狀態。
圖表 10 狀態遷移的痛點
常見的在線服務(比如 HTTP API)設計中,通常在 HTTP Header 甚至 URL 加一個版本號來區分新老版本。但 Terraform 作為一個二進制分發的軟件,且在用戶的本地存儲有一份資源狀態,如果進行破壞性的升級,則必須同時考慮存量用戶的正常使用,以及舊版狀態文件的原地升級。
Terraform 的解決方案是標定資源的 Schema Version,默認 Version 為 0,當資源的 Schema 有破壞性的更改時,作為 Provider 的云廠商必須為此提供一個原地升級函數。
圖 11 資源狀態平滑升級
假設 UCloud 的 EIP 共有 3 個版本,0,1,2,則須提供 2 個升級函數。
當一個使用版本 0 的用戶升級到最近版本 2 執行編排的時候,他的狀態文件將會依次經過兩個升級函數,將資源狀態原地升級至最新版本的狀態,而無需任何額外操作。
總體而言,Terraform 是一個安全的,可擴展的,有扎實的理論基礎,也有漸進式工程實踐的資源編排工具。Terraform 的關鍵特性:基礎設施即代碼、多云編排、執行計劃與過程分離、統一的資源狀態管理,是我們在新一代資源編排系統實踐中的重要保障。
作者簡介
李宇飛,UCloud 后臺研發工程師,參與資源編排等接入產品項目研發,專注于云計算,DevOps,分布式系統等領域。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/126083.html
摘要:宋體為了解決此類問題,開發了相關代碼,并被自動化構建鏡像工具的官方倉庫所采納。宋體宋體可以運行在常用的主流操作系統上,它不是等軟件的替代品,而是集成并使用這些自動化配置工具在鏡像上預裝軟件等。背景 云主機是用戶使用最高頻的云產品之一。隨著云主機數量的增多,如何在云主機中保證版本化部署的一致性,成為用戶常見的難題。在現有情況下,用戶首先需要手動或使用腳本連接主機,然后再進行部署安裝,操作...
摘要:如何允許開發人員團隊在多云和混合云環境中編寫和實施一致的策略和授權。使用跨云創建一致的策略和流程開放策略代理是一種流行的工具,正是因為它與域無關。簡而言之,組織無需浪費任何時間對應用程序進行逆向工程以實現多云可移植性。OpenPolicy Agent如何允許開發人員團隊在多云和混合云環境中編寫和實施一致的策略和授權。 隨著多云戰略成為完全主流,公司和開發團隊必須弄清楚如何在云環境中創建...
摘要:企業將業務遷移到云平臺的最大好處之一是可以降低工作和運營成本,其中一個最重要的因素是云計算基礎設施的自動化和配置。幸運的是,有許多云計算基礎設施自動化工具可用于幫助加快流程。企業需要深入了解將工作負載遷移到公共云的正確步驟,并因此降低成本。云遷移不會自行發生,在遷移項目成功之前并不能完成工作和任務。企業將業務遷移到云平臺的最大好處之一是可以降低工作和運營成本,其中一個最重要的因素是云計算基礎...
摘要:此案例使用創建一臺服務器基礎設施,通過創建一臺云主機并在云主機上綁定云硬盤和外網彈性,同時使用外網防火墻來保護云主機的網絡安全性。搭建一臺 web 服務器本篇目錄摘要拓撲圖操作步驟參考文獻關鍵詞:UHost,EIP,UDisk摘要云主機是構建在云環境的彈性計算資源,是 UCloud 最為核心的服務。有些服務,如彈性 IP、鏡像、云硬盤等必須與云主機結合后使用,另一些服務,如數據庫、緩存、對象...
摘要:是基于公司開源的實現的多云資源編排工具,用戶可以通過編寫規格文件,實現對基礎設施的自動化管理。資源編排工具將資源的狀態描述為一個狀態的集合,并支持若干種不同類型的狀態存儲。UCloud Terraform 是基于 Hashicorp 公司開源的Terraform實現的多云資源編排工具,用戶可以通過編寫 HCL(Hashicorp Configuration Language) 規格文件,實現...
閱讀 3540·2023-04-25 20:09
閱讀 3743·2022-06-28 19:00
閱讀 3064·2022-06-28 19:00
閱讀 3087·2022-06-28 19:00
閱讀 3178·2022-06-28 19:00
閱讀 2883·2022-06-28 19:00
閱讀 3051·2022-06-28 19:00
閱讀 2641·2022-06-28 19:00