新聞中心
將 Terraform 生態(tài)粘合到 Kubernetes 世界
2022-12-29 10:09:01
云計(jì)算
新聞 KubeVela 是一個(gè)現(xiàn)代的軟件交付控制平面, 面向開發(fā)者提供統(tǒng)一的 API 抽象,使開發(fā)者使用相同的 IaC 方式來同時(shí)交付普通應(yīng)用和云服務(wù)。

背景
隨著各大云廠商產(chǎn)品版圖的擴(kuò)大,基礎(chǔ)計(jì)算設(shè)施,中間件服務(wù),大數(shù)據(jù)/AI 服務(wù),應(yīng)用運(yùn)維管理服務(wù)等都可以直接被企業(yè)和開發(fā)者拿來即用。我們注意到也有不少企業(yè)基于不同云廠商的服務(wù)作為基礎(chǔ)來建設(shè)自己的企業(yè)基礎(chǔ)設(shè)施中臺。為了更高效,統(tǒng)一的管理云服務(wù),IaC 思想近年來盛行,其中 Terrafrom 更是成功得到了幾乎所有的云廠商的采納和支持。以 Terrafrom 模型為核心的云服務(wù) IaC 生態(tài)已經(jīng)形成。然而在 Kubernetes 大行其道的今天,IaC 被冠以更廣大的想象空間,Terraform IaC 能力和生態(tài)成果如果融入 Kubernetes 世界,我們認(rèn)為這是一種強(qiáng)強(qiáng)聯(lián)合。
理由一:構(gòu)建統(tǒng)一的企業(yè)混合云 PaaS 平臺
目前大多數(shù)企業(yè)基于 Kubernetes 服務(wù)來構(gòu)建 PaaS 平臺或基礎(chǔ)設(shè)施管理平臺,統(tǒng)一集成云上和自建基礎(chǔ)設(shè)施。但除了提供基礎(chǔ)設(shè)施以外,各種中間件,大數(shù)據(jù)服務(wù),AI 服務(wù),應(yīng)用可觀測等也是云廠商重點(diǎn)提供的產(chǎn)品。企業(yè)平臺需要具備創(chuàng)建和銷毀更多云服務(wù)的能力,這時(shí) Terraform 會進(jìn)入平臺構(gòu)建者的視線,那么他們還需要在 Kubernetes 之外再做一次對接開發(fā)嗎?而且同時(shí)還需要考慮持續(xù)發(fā)布,GitOps,灰度發(fā)布等需求。顯然如果直接 基于 Kubernetes 即可完成對接是更好的選項(xiàng)。
理由二:為開發(fā)者打造 Serverless 體驗(yàn)
云計(jì)算的本質(zhì)或目標(biāo)就是 Serverless 化,然而自建的基礎(chǔ)設(shè)施總是有限的,無縫接入云服務(wù)可以開啟 “近乎無限”的資源池。同時(shí)開發(fā)者在架構(gòu)業(yè)務(wù)應(yīng)用時(shí),除了在 Serverless 平臺上直接完成業(yè)務(wù)服務(wù)部署以外,還需要直接獲得例如消息中間件,數(shù)據(jù)庫等服務(wù)。更多的企業(yè)會采用對接云廠商的方案,運(yùn)維管理成本更低。但對于開發(fā)者,這最好是透明的,一致的。
理由三:更徹底的 IaC 能力
一切皆服務(wù),我們需要通過統(tǒng)一的模型來描述云資源、自建基礎(chǔ)設(shè)施和各種企業(yè)應(yīng)用。Terraform 和 Kubernetes 可以整合并統(tǒng)一為面向開發(fā)者的 IaC 規(guī)范。帶來的好處是同時(shí)納管云資源和容器生態(tài)豐富的運(yùn)維能力,以及面向復(fù)雜應(yīng)用的統(tǒng)一編排
理由四:Terraform 開源版本是客戶端模式工作,無法像 Kubernetes 一樣進(jìn)行終態(tài)維持。
Terraform 開源發(fā)行版只能以客戶端模式工作,即用戶進(jìn)行完一次交付后無法維持服務(wù)狀態(tài),且如果遇到網(wǎng)絡(luò)故障交付失敗時(shí)需要手動進(jìn)行重試處理。Kubernetes 為開發(fā)者帶來了面向終態(tài)的 IaC 思想,通過控制器模式實(shí)現(xiàn)對目標(biāo)資源的狀態(tài)維持,這進(jìn)一步提升了 Terraform 工具在自動化層面的優(yōu)勢。
KubeVela 是一個(gè)現(xiàn)代的軟件交付控制平面, 面向開發(fā)者提供統(tǒng)一的 API 抽象,使開發(fā)者使用相同的 IaC 方式來同時(shí)交付普通應(yīng)用和云服務(wù)。KubeVela 向下直接支持 Terraform 的 API 和 Kubernetes API,無需修改可復(fù)用所有 Terraform 模塊和所有 Kubernetes 對象。通過 KubeVela 你可以非常簡單的實(shí)現(xiàn)上訴三方面訴求。我們也看到了另外一種模式的 Crossplane 項(xiàng)目,通過定義 Kubernetes 原生 CRD 的形式在對接云服務(wù),使其體驗(yàn)更加原生,KubeVela 也天然支持 Crossplane API。
接下來讓我們通過兩部分內(nèi)容,來詳細(xì)看看 KubeVela 是如何應(yīng)用 Terraform 來為用戶提供統(tǒng)一 IaC 體驗(yàn)的。
- Part.1 將介紹如何將 Terraform 與 KubeVela 粘合,這需要一些 Terraform 和 KubeVela 的基礎(chǔ)知識。
- Part.2 將介紹 KubeVela 交付云服務(wù)的一個(gè)實(shí)踐案例,包括 :
1)通過 KubeVela 提供一個(gè)公網(wǎng) IP 的 Cloud ECS 實(shí)例;
2)使用 ECS 實(shí)例作為隧道服務(wù)器,為內(nèi)網(wǎng)環(huán)境中的任何容器服務(wù)提供公共訪問。
將 Terraform 模塊轉(zhuǎn)化為 KubeVela 組件
準(zhǔn)備 Terraform Module
如果你已經(jīng)有一個(gè)經(jīng)過良好測試的 Terraform 模塊,那么可以跳過該步驟。
在開始之前,請確保您擁有:
- 安裝 Terraform CLI[1]
- 準(zhǔn)備一個(gè)云服務(wù)賬號(AK/SK),本文用例使用阿里云。
- 學(xué)習(xí)一些使用 Terraform 的基礎(chǔ)知識。
這是我用于此演示的 Terraform 模塊[2]
1.下載 Terraform 模塊。
git clone https://github.com/wonderflow/terraform-alicloud-ecs-instance.git
cd terraform-alicloud-ecs-instance
2.初始化并下載最新穩(wěn)定版本的阿里云 Provider。
terraform init
3.配置阿里云授權(quán)賬號信息。
export ALICLOUD_ACCESS_KEY="your-accesskey-id"
export ALICLOUD_SECRET_KEY="your-accesskey-secret"
export ALICLOUD_REGION="your-region-id"
你也可以通過創(chuàng)建 provider.tf 文件來配置賬號信息。
provider "alicloud" {
access_key = "your-accesskey-id"
secret_key = "your-accesskey-secret"
region = "cn-hangzhou"
}4.測試資源創(chuàng)建是否正常。
terraform apply -var-file=test/test.tfvars
5.測試正常后銷毀所有已創(chuàng)建的資源。
terraform destroy -var-file=test/test.tfvars
到此你也可以根據(jù)需要將此模塊推送到你自己的代碼倉庫中。
轉(zhuǎn)化 Terrafrom 模塊作為 KubeVela 擴(kuò)展組件類型
這一步是核心,在開始之前,請確保您已經(jīng)安裝了 Kubevela 控制平面[3],如果您沒有 Kubernetes 集群也不用擔(dān)心,快速演示時(shí)通過 VelaD 一鍵安裝完成就足夠了。
我們將使用我們剛剛準(zhǔn)備好的 Terraform 模塊來進(jìn)行下述動作。
生成 KubeVela 組件定義。
vela def init ecs --type component --provider alibaba --desc "Terraform configuration for Alibaba Cloud Elastic Compute Service" --git https://github.com/wonderflow/terraform-alicloud-ecs-instance.git > alibaba-ecs-def.yaml
vela kube apply -f alibaba-ecs-def.yaml
如果你已自定義過 Module ,請直接使用自己的代碼倉庫地址。
到此你已經(jīng)成功的將 ECS 模塊添加為 KubeVela 的擴(kuò)展組件類型,您可以從這里[4]了解更多詳細(xì)信息。Vela 平臺上的開發(fā)者可以開始直接使用該類型的組件。你可以通過下述命令來查閱自動生成的組件使用文檔:
vela show alibaba-ecs
# OR
vela show alibaba-ecs --web
是不是非常簡單?KubeVela 對 Terraform 有完善的工具鏈,但你也不必?fù)?dān)心需要為所有的 Terraform 模塊重復(fù)做該操作,因?yàn)樯鐓^(qū)已經(jīng)為用戶提供了開箱即用的插件,只需要安裝對應(yīng)云廠商的插件即可獲得已經(jīng)轉(zhuǎn)化好的組件。接下來讓我們來應(yīng)用這項(xiàng)能力實(shí)驗(yàn)一些有意思的場景。
使用云服務(wù)將本地容器應(yīng)用暴露到公網(wǎng)
在這一部分中,我們將介紹一種解決方案,您可以使用特定端口將任何 Kubernetes 服務(wù)公開。解決方案由以下組成:
- KubeVela 環(huán)境,如果你在第 1 部分練習(xí)過,你已經(jīng)擁有了。
- 阿里云 ECS,KubeVela 會通過 Access Key 自動創(chuàng)建一個(gè) tiny ECS(1u1g)。
- FRP[5],KubeVela 將在服務(wù)器端和客戶端啟動這個(gè)代理。
準(zhǔn)備 KubeVela 環(huán)境
- 安裝 KubeVela
curl -fsSl https://static.kubevela.net/script/install-velad.sh | bash
velad install
查看文檔 1[6]以了解更多安裝細(xì)節(jié)。
- 啟用 Terraform Addon 和 Alibaba Provider
vela addon enable terraform
vela addon enable terraform-alibaba
- 添加授權(quán)信息
vela provider add terraform-alibaba --ALICLOUD_ACCESS_KEY <"your-accesskey-id"> --ALICLOUD_SECRET_KEY "your-accesskey-secret" --ALICLOUD_REGION--name terraform-alibaba-default
查看文檔 2[7]以獲取有關(guān)其他云的更多詳細(xì)信息。
部署帶有公網(wǎng) IP 地址的 ECS 實(shí)例并啟動 FRP 服務(wù)
cat <# YAML begins
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: ecs-demo
spec:
components:
- name: ecs-demo
type: alibaba-ecs
properties:
providerRef:
name: terraform-alibaba-default
writeConnectionSecretToRef:
name: outputs-ecs
name: "test-terraform-vela-123"
instance_type: "ecs.n1.tiny"
host_name: "test-terraform-vela"
password: "Test-123456!"
internet_max_bandwidth_out: "10"
associate_public_ip_address: "true"
instance_charge_type: "PostPaid"
user_data_url: "https://raw.githubusercontent.com/wonderflow/terraform-alicloud-ecs-instance/master/frp.sh"
ports:
- 8080
- 8081
- 8082
- 8083
- 9090
- 9091
- 9092
tags:
created_by: "Terraform-of-KubeVela"
created_from: "module-tf-alicloud-ecs-instance"
# YAML ends
EOF
此應(yīng)用定義將部署一個(gè)帶有公網(wǎng) IP 地址的 ECS 實(shí)例。
你可以通過下述命令詳細(xì)了解每一個(gè)字段說明:
vela show alibaba-ecs
執(zhí)行完上述部署命令后,你可以通過下面的方式查看應(yīng)用部署狀態(tài):
vela status ecs-demo
vela logs ecs-demo
應(yīng)用部署完成后可以通過下述命令獲取到 IP 地址:
$ kubectl get secret outputs-ecs --template={{.data.this_public_ip}} | base64 --decode
["121.196.106.174"]你可以通過 IP:9091 地址訪問到 FRP 服務(wù)的管理頁面,初始賬號密為:admin:vela123 至此我們完成了 ECS 服務(wù)的部署。
使用 FRP 服務(wù)
FRP 客戶端的使用非常簡單,我們可以為集群內(nèi)的任何服務(wù)提供公共 IP。
1.單獨(dú)部署 FRP-Proxy。
cat <apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: frp-proxy
spec:
components:
- name: frp-proxy
type: worker
properties:
image: oamdev/frpc:0.43.0
env:
- name: server_addr
value: "121.196.106.174"
- name: server_port
value: "9090"
- name: local_port
value: "80"
- name: connect_name
value: "velaux-service"
- name: local_ip
value: "velaux.vela-system"
- name: remote_port
value: "8083"
EOF
在這種情況下,我們通過 velaux.vela-system 指定 local_ip,這意味著我們正在訪問命名空間 vela-system 中名為 velaux 的 Kubernetes 服務(wù)。你可以通過公網(wǎng) IP:8083來訪問該服務(wù)。
2.將代理和普通應(yīng)用共同部署。
cat <# YAML begins
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: composed-app
spec:
components:
- name: web-new
type: webservice
properties:
image: oamdev/hello-world:v2
ports:
- port: 8000
expose: true
- name: frp-web
type: worker
properties:
image: oamdev/frpc:0.43.0
env:
- name: server_addr
value: "121.196.106.174"
- name: server_port
value: "9090"
- name: local_port
value: "8000"
- name: connect_name
value: "composed-app"
- name: local_ip
value: "web-new.default"
- name: remote_port
value: "8082"
EOF
如此部署完成后可通過公網(wǎng) IP:8082 來訪問該服務(wù)。還有一種玩法是將 FRP-Proxy 定義為 Trait,直接掛載到需要暴露服務(wù)的組件上,這種方式希望你通過閱讀 KubeVela 的文檔來探索實(shí)現(xiàn)啦。
清理環(huán)境
通過下述命令完成測試過程中創(chuàng)建應(yīng)用的清理動作:
vela delete composed-app -y
vela delete frp-proxy -y
vela delete ecs-demo -y
云服務(wù)組件也會隨著應(yīng)用刪除被銷毀。
到此我們通過一個(gè)具體的使用案例來描述了 KubeVela 是如何完成云服務(wù)和普通應(yīng)用的統(tǒng)一描述和交付,希望你已經(jīng)掌握并在自己的環(huán)境中進(jìn)行多樣化嘗試。通過這個(gè)案例你也應(yīng)該大概了解了 KubeVela 結(jié)合 Terraform 的最終效果。更多關(guān)于 KubeVela 的玩法,可通過閱讀 KubeVela 官方文檔獲得。
網(wǎng)頁題目:將Terraform生態(tài)粘合到Kubernetes世界
分享網(wǎng)址:http://www.5511xx.com/article/dhecjej.html


咨詢
建站咨詢
