將 Terraform 生態(tài)粘合到 Kubernetes 世界
背景
隨著各大云廠商產品版圖的擴大,基礎計算設施,中間件服務,大數據/AI 服務,應用運維管理服務等都可以直接被企業(yè)和開發(fā)者拿來即用。我們注意到也有不少企業(yè)基于不同云廠商的服務作為基礎來建設自己的企業(yè)基礎設施中臺。為了更高效,統一的管理云服務,IaC 思想近年來盛行,其中 Terrafrom 更是成功得到了幾乎所有的云廠商的采納和支持。以 Terrafrom 模型為核心的云服務 IaC 生態(tài)已經形成。然而在 Kubernetes 大行其道的今天,IaC 被冠以更廣大的想象空間,Terraform IaC 能力和生態(tài)成果如果融入 Kubernetes 世界,我們認為這是一種強強聯合。
理由一:構建統一的企業(yè)混合云 PaaS 平臺
目前大多數企業(yè)基于 Kubernetes 服務來構建 PaaS 平臺或基礎設施管理平臺,統一集成云上和自建基礎設施。但除了提供基礎設施以外,各種中間件,大數據服務,AI 服務,應用可觀測等也是云廠商重點提供的產品。企業(yè)平臺需要具備創(chuàng)建和銷毀更多云服務的能力,這時 Terraform 會進入平臺構建者的視線,那么他們還需要在 Kubernetes 之外再做一次對接開發(fā)嗎?而且同時還需要考慮持續(xù)發(fā)布,GitOps,灰度發(fā)布等需求。顯然如果直接 基于 Kubernetes 即可完成對接是更好的選項。
理由二:為開發(fā)者打造 Serverless 體驗
云計算的本質或目標就是 Serverless 化,然而自建的基礎設施總是有限的,無縫接入云服務可以開啟 “近乎無限”的資源池。同時開發(fā)者在架構業(yè)務應用時,除了在 Serverless 平臺上直接完成業(yè)務服務部署以外,還需要直接獲得例如消息中間件,數據庫等服務。更多的企業(yè)會采用對接云廠商的方案,運維管理成本更低。但對于開發(fā)者,這最好是透明的,一致的。
理由三:更徹底的 IaC 能力
一切皆服務,我們需要通過統一的模型來描述云資源、自建基礎設施和各種企業(yè)應用。Terraform 和 Kubernetes 可以整合并統一為面向開發(fā)者的 IaC 規(guī)范。帶來的好處是同時納管云資源和容器生態(tài)豐富的運維能力,以及面向復雜應用的統一編排
理由四:Terraform 開源版本是客戶端模式工作,無法像 Kubernetes 一樣進行終態(tài)維持。
Terraform 開源發(fā)行版只能以客戶端模式工作,即用戶進行完一次交付后無法維持服務狀態(tài),且如果遇到網絡故障交付失敗時需要手動進行重試處理。Kubernetes 為開發(fā)者帶來了面向終態(tài)的 IaC 思想,通過控制器模式實現對目標資源的狀態(tài)維持,這進一步提升了 Terraform 工具在自動化層面的優(yōu)勢。
KubeVela 是一個現代的軟件交付控制平面, 面向開發(fā)者提供統一的 API 抽象,使開發(fā)者使用相同的 IaC 方式來同時交付普通應用和云服務。KubeVela 向下直接支持 Terraform 的 API 和 Kubernetes API,無需修改可復用所有 Terraform 模塊和所有 Kubernetes 對象。通過 KubeVela 你可以非常簡單的實現上訴三方面訴求。我們也看到了另外一種模式的 Crossplane 項目,通過定義 Kubernetes 原生 CRD 的形式在對接云服務,使其體驗更加原生,KubeVela 也天然支持 Crossplane API。
接下來讓我們通過兩部分內容,來詳細看看 KubeVela 是如何應用 Terraform 來為用戶提供統一 IaC 體驗的。
- Part.1 將介紹如何將 Terraform 與 KubeVela 粘合,這需要一些 Terraform 和 KubeVela 的基礎知識。
- Part.2 將介紹 KubeVela 交付云服務的一個實踐案例,包括 :
1)通過 KubeVela 提供一個公網 IP 的 Cloud ECS 實例;
2)使用 ECS 實例作為隧道服務器,為內網環(huán)境中的任何容器服務提供公共訪問。
將 Terraform 模塊轉化為 KubeVela 組件
準備 Terraform Module
如果你已經有一個經過良好測試的 Terraform 模塊,那么可以跳過該步驟。
在開始之前,請確保您擁有:
- 安裝 Terraform CLI[1]
- 準備一個云服務賬號(AK/SK),本文用例使用阿里云。
- 學習一些使用 Terraform 的基礎知識。
這是我用于此演示的 Terraform 模塊[2]
1.下載 Terraform 模塊。
2.初始化并下載最新穩(wěn)定版本的阿里云 Provider。
3.配置阿里云授權賬號信息。
你也可以通過創(chuàng)建 provider.tf 文件來配置賬號信息。
4.測試資源創(chuàng)建是否正常。
5.測試正常后銷毀所有已創(chuàng)建的資源。
到此你也可以根據需要將此模塊推送到你自己的代碼倉庫中。
轉化 Terrafrom 模塊作為 KubeVela 擴展組件類型
這一步是核心,在開始之前,請確保您已經安裝了 Kubevela 控制平面[3],如果您沒有 Kubernetes 集群也不用擔心,快速演示時通過 VelaD 一鍵安裝完成就足夠了。
我們將使用我們剛剛準備好的 Terraform 模塊來進行下述動作。
生成 KubeVela 組件定義。
如果你已自定義過 Module ,請直接使用自己的代碼倉庫地址。
到此你已經成功的將 ECS 模塊添加為 KubeVela 的擴展組件類型,您可以從這里[4]了解更多詳細信息。Vela 平臺上的開發(fā)者可以開始直接使用該類型的組件。你可以通過下述命令來查閱自動生成的組件使用文檔:
是不是非常簡單?KubeVela 對 Terraform 有完善的工具鏈,但你也不必擔心需要為所有的 Terraform 模塊重復做該操作,因為社區(qū)已經為用戶提供了開箱即用的插件,只需要安裝對應云廠商的插件即可獲得已經轉化好的組件。接下來讓我們來應用這項能力實驗一些有意思的場景。
使用云服務將本地容器應用暴露到公網
在這一部分中,我們將介紹一種解決方案,您可以使用特定端口將任何 Kubernetes 服務公開。解決方案由以下組成:
- KubeVela 環(huán)境,如果你在第 1 部分練習過,你已經擁有了。
- 阿里云 ECS,KubeVela 會通過 Access Key 自動創(chuàng)建一個 tiny ECS(1u1g)。
- FRP[5],KubeVela 將在服務器端和客戶端啟動這個代理。
準備 KubeVela 環(huán)境
- 安裝 KubeVela
查看文檔 1[6]以了解更多安裝細節(jié)。
- 啟用 Terraform Addon 和 Alibaba Provider
- 添加授權信息
查看文檔 2[7]以獲取有關其他云的更多詳細信息。
部署帶有公網 IP 地址的 ECS 實例并啟動 FRP 服務
此應用定義將部署一個帶有公網 IP 地址的 ECS 實例。
你可以通過下述命令詳細了解每一個字段說明:
執(zhí)行完上述部署命令后,你可以通過下面的方式查看應用部署狀態(tài):
應用部署完成后可以通過下述命令獲取到 IP 地址:
你可以通過 IP:9091 地址訪問到 FRP 服務的管理頁面,初始賬號密為:admin:vela123 至此我們完成了 ECS 服務的部署。
使用 FRP 服務
FRP 客戶端的使用非常簡單,我們可以為集群內的任何服務提供公共 IP。
1.單獨部署 FRP-Proxy。
在這種情況下,我們通過 velaux.vela-system 指定 local_ip,這意味著我們正在訪問命名空間 vela-system 中名為 velaux 的 Kubernetes 服務。你可以通過公網 IP:8083來訪問該服務。
2.將代理和普通應用共同部署。
如此部署完成后可通過公網 IP:8082 來訪問該服務。還有一種玩法是將 FRP-Proxy 定義為 Trait,直接掛載到需要暴露服務的組件上,這種方式希望你通過閱讀 KubeVela 的文檔來探索實現啦。
清理環(huán)境
通過下述命令完成測試過程中創(chuàng)建應用的清理動作:
云服務組件也會隨著應用刪除被銷毀。
到此我們通過一個具體的使用案例來描述了 KubeVela 是如何完成云服務和普通應用的統一描述和交付,希望你已經掌握并在自己的環(huán)境中進行多樣化嘗試。通過這個案例你也應該大概了解了 KubeVela 結合 Terraform 的最終效果。更多關于 KubeVela 的玩法,可通過閱讀 KubeVela 官方文檔獲得。