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