隨著企業采用多云戰略和遷移到云平臺,需要依賴不同的云資源來支持業務系統。傳統的手動開通和配置資源關聯關系的方法在多云環境下變得耗時且復雜,給運維帶來困難。
為了應對多云環境中基礎設施管理的復雜性,尋找一種高效的多云資源編排方法至關重要。資源編排可以對混合云資源進行編排,實現快速部署和管理,并降低管理復雜性、人工成本和運維成本。核心過程是設計藍圖、編排資源,并將編排結果作為實施模板傳遞給云平臺,實現資源的統一開通、變更和回收。
盡管資源編排是降低成本和提高效率的有效方法,但在實施過程中也面臨一些困難和挑戰。以下是其中的幾個主要方面:
多云平臺的異構性:不同的云服務提供商之間存在差異,這意味著在跨多個云平臺進行資源編排時,需要處理不同的語法和語義,增加了編排模板的復雜性和學習成本。
依賴關系管理:資源之間可能存在復雜的依賴關系,這需要準確定義和管理,處理依賴關系可能涉及解決循環依賴、處理資源創建的先后順序等問題。
配置參數的靈活性:不同的云服務和場景可能需要不同的配置參數和選項。資源編排需要提供靈活的配置能力和對需求的個性化定制能力,增加了編排模板的復雜性。
為了解決上述困難,可以采用兩個標準來進行多云資源編排:標準描述文件和標準云平臺對接。通過這兩個標準對云平臺的差異進行統一定義,使混合云編排變得簡單可操作。在業界中,TOSCA和Terraform是兩個備受關注的資源編排工具。
TOSCA提出了藍圖拓撲編排標準規范,定義了資源之間的拓撲關系和依賴關系,可以實現對復雜應用和服務的編排。Terraform則可以對資源編排的產物進行簡化的實施部署,實現基礎設施即代碼(IaC)的理念,可以通過編寫可重復使用的代碼來描述和管理基礎設施資源。
本文將基于TOSCA和Terraform這兩個工具進行多云資源編排的探索與討論,以幫助企業更好地實現混合云環境下的資源編排和管理。
TOSCA(Topology and Orchestration Specification for Cloud Applications)是由OASIS組織制定的云應用拓撲編排規范。它定義了云資源編排的拓撲結構、組件關系、屬性和操作等信息,以便于方便地描述云資源的拓撲結構和行為。
簡而言之,TOSCA旨在制定一套藍圖拓撲編排標準規范,通過使用統一標準來描述云平臺上應用的拓撲結構。TOSCA有以下一些優點:
高度可擴展性:TOSCA可以在多個層次上描述云原生應用程序,包括服務部署、網絡拓撲等。因此,它非常適合在復雜的分布式系統中管理和編排應用程序。
獨立于云平臺:TOSCA模板可以在多個云平臺上運行,因為它是一個獨立于云平臺的標準。
生命周期管理:TOSCA模板中的工作流可以描述應用程序的整個生命周期,從創建部署環境到在生產環境中運行的監視和維護,可以進行全生命周期管理。
但是,TOSCA也有一些缺點,例如:
相對復雜:TOSCA需要編寫XML或YAML格式的模板,語法和語義相對復雜,因此需要一定的技術水平。
缺少良好的工具支持:目前,TOSCA的工具生態系統尚不夠完善,使用起來可能會比較困難。
更適合應用程序描述:TOSCA更適合描述和管理整個應用程序,而不是管理云基礎架構。
TOSCA的主要概念包括兩個要素:節點(Node)和關系(Relationship)。TOSCA規范定義了一系列原生的節點類型(Node Types),用于表示云應用中的不同組件和功能。TOSCA規范中定義了一些原生節點類型,這些原生的節點類型提供了一種描述云資源中不同類型組件屬性和行為的方式,便于進行模板編寫和云資源管理。通過使用和派生這些節點類型,可以更加方便和標準化地描述和管理云資源中的各個組件。
Terraform是由HashiCorp開發的開源工具,旨在管理云基礎架構。它采用聲明式編程風格,使用戶能夠編寫基礎架構模板,以描述需要部署的所有資源及其相互關系。這樣的模板描述方式允許用戶以可重復、可維護的方式定義和管理云基礎架構,確保資源的一致性和可擴展性。
Terraform通過描述文件進行直接實施部署,即通過定義Terraform的描述文件(.tf文件),可以將其發送給Terraform服務進行執行(terraform apply),從而與云平臺進行無縫對接,實現對描述文件中所定義的資源進行部署和開通。這種方式能夠簡化和自動化云資源的管理過程,使得部署和配置變得更加高效和可靠。
它具有以下優點:
易于使用:Terraform采用聲明式編程風格,用戶可以更簡單、清晰地定義和管理基礎架構。
可擴展:Terraform具有通過插件機制工作的靈活性,可以很容易地集成到其他工具和流程中。
模塊:Terraform將基礎架構的各種組件以模塊的方式進行封裝,從而更容易地重用。
但是,Terraform也存在一些缺點:
更適合管理基礎架構:Terraform更適合管理云基礎架構,而不是管理完整的應用程序。
學習成本高:雖然Terraform的語言很簡單,但功能十分豐富。這意味著使用它需要一定的學習成本。
非標準: Terraform并不是一個標準,需要在不同的云平臺上學習相應的DSL。
目前,Terraform已經得到了多個云平臺的支持,包括公有云、專有云、Docker、Kubernetes。通過Terraform的統一管理,用戶能夠在多個云平臺和基礎設施上進行資源的配置和部署,實現跨平臺、跨服務商的自動化管理。
在實際應用中,TOSCA和Terraform在不同場景下發揮著各自的作用。TOSCA主要適用于管理和編排云原生應用程序,而Terraform則更適用于管理更底層的基礎架構。以下是兩種工具常見的應用場景:
云原生資源編排:TOSCA模板能夠描述云原生應用程序的完整生命周期,包括部署、配置和管理等過程。通過TOSCA,多個組件和服務可以被編排成一個完整的云原生應用程序。
云基礎架構管理:Terraform可以以模塊化的方式編排云基礎架構資源,使得各種資源和服務能夠更清晰地進行管理。通過使用Terraform,可以通過代碼來管理多個云基礎架構,實現對基礎設施的統一管理。
在實際應用中,TOSCA和Terraform可以分別應用于不同的資源編排場景。由于TOSCA和Terraform各自具有優勢和劣勢,可以將它們的長處結合起來形成更優的解決方案。例如,TOSCA在藍圖編排方面表現出色,可以利用其優勢為多云資源編排提供標準化的藍圖編排規范,實現跨平臺的編排。而Terraform則擁有豐富的社區生態和良好的云平臺對接模式,可以快速與不同的云平臺進行集成。
主要思路是采用TOSCA進行藍圖設計模式,通過藍圖編排將業務所需的云產品組件組織成符合TOSCA 1.3 YAML規范的藍圖模板。然后,將該模板轉換為符合Terraform實施描述文件的統一格式,以便進行實施。具體架構如下所示:
第一步:首先根據TOSCA規范定義云產品組件,并進行藍圖編排,以生成符合TOSCA規范的藍圖描述文件(YAML格式)。
第二步:利用配置轉換器,將TOSCA描述文件轉換為Terraform描述文件??梢越柚鷪笪霓D換器等工具來進行此轉換,具體細節不再詳述。
第三步:利用Terraform描述文件和Terraform服務進行云產品的編排和實施部署。
下面將通過一個實操來簡要描述如何利用TOSCA藍圖編排并使用Terraform進行開通操作。假設需要部署一個 web 網站,該網站依賴三個云資源:虛擬專有網絡(VPC)、虛擬交換機(VSwitch)和云服務器(ECS)。案例將模擬在阿里云杭州節點上進行這三個虛擬產品的實施部署,其中 ECS 將部署在 VSwitch 下方,而 VSwitch 的網絡分配依賴于 VPC。
在過去的情況下,可能需要先在阿里云上開通 VPC,然后在 VPC 上創建一個 VSwitch,并最后創建一個 ECS。簡單來說,這需要三個單獨的實施部署操作。
通過資源編排的方式,可以將 VPC、VSwitch 和 ECS 編排在一個藍圖拓撲描述文件中,遵循 TOSCA 規范。然后,可以將這個藍圖描述文件轉換為 Terraform 的描述文件,以實現統一的開通操作。這樣一來,就可以通過資源編排來簡化整個部署過程,實現快速而一致的云資源開通。
根據需求背景,使用可視化的藍圖設計工具(或手動編排拓撲文件,或使用基于TOSCA的開源編排工具,例如Cloudify),編排出符合TOSCA規范的藍圖描述文件,如下所示:
該描述文件定義了一個包含VPC、VSwitch網絡關系的ECS(Elastic Compute Service)規范,其中包括三個自定義云資源節點類型:
alicloud.nodes.VPC:派生 tosca.nodes.Network 節點類型,表示網絡。具有屬性,如CIDR。
alicloud.nodes.vSwitch:派生 tosca.nodes.Network 節點類型,表示虛擬交換機。具有屬性,如CIDR。
alicloud.nodes.ECSInstance:派生 tosca.nodes.Compute 節點類型,表示ECS實例。具有屬性,如鏡像ID、實例類型和實例名稱。
其中,組件定義的屬性可以作為用戶填寫,如果有其他需要輸入屬性,也可在該節點增加。在relationships節點上,描述了三者的關系和互相依賴前提。
該描述文件采用YAML格式,其中節點描述繼承了TOSCA規范的派生節點,后續可以不斷擴展與繼承。描述文件簡單通過節點和關系來描述藍圖拓撲的節點、屬性和關聯關系,使其具有較高的通用性。
實踐步驟二:把TOSCA轉換成Terraform描述文件
將TOSCA規范描述文件轉換為Terraform描述文件目前沒有現成開源解決方案。因此,需自研定制化接口進行轉換。當然,TOSCA規范也支持自定義接口實現,以調用其他開源組件進行開通操作。
下面是通過轉換工具生成的Terraform描述文件main.tf的示例:
在這里需要介紹的是,Terraform核心文件包括兩個部分。首先是編排執行文件,其文件后綴名采用tf(在本案例中為main.tf)。該文件用于定義和執行資源編排的操作。其次是本地狀態文件,其文件后綴名采用tfstate。本地狀態文件用于記錄當前資源的狀態和配置信息。
后綴名tf文件:業務編排的主文件,可以將所有內容合并到一個tf文件中,也可以根據不同的云產品將其劃分為多個文件。無論是合并還是劃分,只要文件后綴名為tf,它們之間可以相互引用和調用。
后綴名tfstate:本地狀態文件,它由Terraform服務在實施部署后自動創建。該文件記錄了實施部署生成的實例信息和狀態。
在tf文件中,可以觀察到以下幾個節點,將對它們進行簡單介紹:
terraform 節點:用于指定要下載的云平臺提供的provider。這些provider是各大云平臺在Terraform生態圈中開源提供的工具,通過使用這些provider,我們可以無縫對接云平臺進行資源的開通。
provider 節點:主要用于提供授權信息,包括企業或個人云平臺賬號的AK/SK(Access Key/Secret Key)。這些信息用于進行云平臺的認證和授權。
data 節點:用于在云平臺中進行查詢操作。在許多情況下,開通某種云產品需要使用已部署的其他云產品的屬性進行關聯。通過data節點,我們可以根據屬性值查詢云平臺的數據,以便于提供即將開通的資源所需的信息。
resource 節點:用于描述將要實施部署的資源節點信息。這些資源節點可以是將要部署、變更或刪除的資源。在執行Terraform時,根據該節點的信息與本地狀態文件以及遠程云平臺的狀態信息進行比對,決定是進行新的部署、變更部署還是回收部署。
output 節點:用于返回實施部署后的一些資源實例信息。在這里,我們定義了返回的三個資源實例的ID,以方便進行多云產品的資源管理記錄。
實踐步驟三:通過Terraform服務執行描述文件
準備好了Terraform描述文件后,可以通過Terraform服務進行執行。Terraform的執行過程主要包括三個關鍵步驟:init、plan和apply。
(1) terraform init:這一步是進行provider的初始化。在本案例中,我們描述了對接阿里公有云且使用1.204.1版本的情況。由于在此之前沒有進行提前下載,因此在執行該命令時,Terraform將自動進行下載。以下是示例輸出:
(2) terraform plan: 這一步用于檢查main.tf中的邏輯是否合理,并且可以在plan執行日志中查看將要進行的資源狀態變更情況。根據案例的執行日志可以看到terraform根據模板計劃新增了4個實例(Plan: 4 to add, 0 to change, 0 to destroy)。執行該命令后的輸出如下所示:
(3) terraform apply:通過使用terraform apply命令,可以執行實施部署。如果需要傳遞參數,可以通過apply命令進行傳遞,例如AK/SK等敏感信息不適合明文寫入文件中,這里只是為了演示方便。執行該命令后,可以觀察到terraform已根據描述文件中的關聯關系自動推算出實施部署云產品的依賴順序。這也是terraform的一個重要優勢,在混合云編排場景中,各種云產品之間的相互依賴以及執行順序的復雜分析都可以通過terraform直接解決。以下是具體的執行日志:
(4) 實施成功后,可以在阿里公有云上看到已部署的產品。如下圖所示,可以看到ECS ID為i-bp11o38dc5haho1667hc已成功部署在阿里公有云上。這證明實施操作已經順利完成:
(5) 到目前為止,已成功實現了藍圖式自動化部署?;谶@種模式,企業可以在多云產品規劃方面進行上層業務封裝。最終,企業能夠實現資源編排、應用編排、自動化部署以及云解決方案自動化開通等各種場景需求。這為企業提供了更高效和自動化的云部署解決方案。
TOSCA-Simple-Profile-YAML-v1.3.pdf介紹文檔:https://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.3/os/TOSCA-Simple-Profile-YAML-v1.3-os.html
Terraform官方介紹:https://www.terraform.io/
Terraform實戰介紹:https://lonegunmanb.github.io/introduction-terraform/5.5.console.html
Terraform語法介紹:https://bbs.huaweicloud.com/blogs/163482
《實戰》作者:斯科特·溫克勒(Scott Winkler) 譯者:趙利通