作者:曾庆国 孙健波

背景

跟着各大云厂商产品版图的扩大,基础计算设施,中间件服务,大数据/AI 服务,运用运维办理服务等都能够直接被企业和开发者拿来即用。咱们注意到也有不少企业根据不同云厂商的服务作为基础来建造自己的企业基础设施中台。为了更高效,一致的办理云服务,IaC 思维近年来盛行,其间 Terrafrom 更是成功得到了几乎全部的云厂商的选用和支撑。以 Terrafrom 模型为核心的云服务 IaC 生态现已形成。然而在 Kubernetes 大行其道的今日,IaC 被冠以更广阔的幻想空间,Terraform IaC 才能和生态成果假如融入 Kubernetes 世界,咱们认为这是一种强强联合。

理由一:构建一致的企业混合云 PaaS 渠道

现在大多数企业根据 Kubernetes 服务来构建 PaaS 渠道或基础设施办理渠道,一致集成云上和自建基础设施。但除了供给基础设施以外,各种中间件,大数据服务,AI 服务,运用可观测等也是云厂商重点供给的产品。企业渠道需求具备创立和毁掉更多云服务的才能,这时 Terraform 会进入渠道构建者的视线,那么他们还需求在 Kubernetes 之外再做一次对接开发吗?并且一起还需求考虑持续发布,GitOps,灰度发布等需求。明显假如直接 根据 Kubernetes 即可完结对接是更好的选项。

理由二:为开发者打造 Serverless 体会

云计算的本质或方针就是 Serverless 化,然而自建的基础设施总是有限的,无缝接入云服务能够敞开 “近乎无限”的资源池。一起开发者在架构事务运用时,除了在 Serverless 渠道上直接完结事务服务布置以外,还需求直接取得例如音讯中间件,数据库等服务。更多的企业会选用对接云厂商的计划,运维办理本钱更低。但对于开发者,这最好是透明的,一致的。

理由三:更完全的 IaC 才能

全部皆服务,咱们需求经过一致的模型来描绘云资源、自建基础设施和各种企业运用。Terraform 和 Kubernetes 能够整合并一致为面向开发者的 IaC 规范。带来的优点是一起纳管云资源和容器生态丰厚的运维才能,以及面向复杂运用的一致编排。

理由四:Terraform 开源版别是客户端方法作业,无法像 Kubernetes 一样进行终态保持。

Terraform 开源发行版只能以客户端方法作业,即用户进行完一次交给后无法保持服务状况,且假如遇到网络故障交给失利时需求手动进行重试处理。Kubernetes 为开发者带来了面向终态的 IaC 思维,经过操控器方法实现对方针资源的状况保持,这进一步提升了 Terraform 东西在主动化层面的优势。

KubeVela 是一个现代的软件交给操控平面, 面向开发者供给一致的 API 抽象,使开发者运用相同的 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 实例作为隧道服务器,为内网环境中的任何容器服务供给公共拜访。

将 Terraform 模块转化为 KubeVela 组件

准备 Terraform Module

假如你现已有一个经过良好测验的 Terraform 模块,那么能够跳过该步骤。

在开端之前,请确保您具有:

  • 装置Terraform CLI [ 1 ]
  • 准备一个云服务账号(AK/SK),本文用例运用阿里云。
  • 学习一些运用 Terraform 的基础知识。

这是我用于此演示的Terraform 模块 [ 2]

  1. 下载 Terraform 模块。
git clone https://github.com/wonderflow/terraform-alicloud-ecs-instance.git
cd terraform-alicloud-ecs-instance
  1. 初始化并下载最新安稳版别的阿里云 Provider。
terraform init
  1. 装备阿里云授权账号信息。
export ALICLOUD_ACCESS_KEY="your-accesskey-id"
export ALICLOUD_SECRET_KEY="your-accesskey-secret"
export ALICLOUD_REGION="your-region-id"

你也能够经过创立 provider.tf 文件来装备账号信息。

provider "alicloud" {
    access_key  = "your-accesskey-id"
    secret_key   = "your-accesskey-secret"
    region           = "cn-hangzhou"
}
  1. 测验资源创立是否正常。
terraform apply -var-file=test/test.tfvars
  1. 测验正常后毁掉全部已创立的资源。
terraform destroy  -var-file=test/test.tfvars

到此你也能够根据需求将此模块推送到你自己的代码库房中。

转化 Terrafrom 模块作为 KubeVela 扩展组件类型

这一步是核心,在开端之前,请确保您现已装置了 Kubevela 操控平面 [ 3] ,假如您没有 Kubernetes 集群也不用忧虑,快速演示时经过 VelaD 一键装置完结就足够了。

咱们将运用咱们刚刚准备好的 Terraform 模块来进行下述动作。

  1. 生成 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 ,请直接运用自己的代码库房地址。

到此你现已成功的将 ECS 模块增加为 KubeVela 的扩展组件类型,您能够从这儿 [ 4] 了解更多详细信息。Vela 渠道上的开发者能够开端直接运用该类型的组件。你能够经过下述指令来查阅主动生成的组件运用文档:

vela show alibaba-ecs
# OR
vela show alibaba-ecs --web

是不是十分简略?KubeVela 对 Terraform 有完善的东西链,但你也不用忧虑需求为全部的 Terraform 模块重复做该操作,由于社区现已为用户供给了开箱即用的插件,只需求装置对应云厂商的插件即可取得现已转化好的组件。接下来让咱们来运用这项才能试验一些有意思的场景。

运用云服务将本地容器运用露出到公网

在这一部分中,咱们将介绍一种解决计划,您能够运用特定端口将任何 Kubernetes 服务揭露。解决计划由以下组成:

  1. KubeVela 环境,假如你在第 1 部分练习过,你现已具有了。
  2. 阿里云 ECS,KubeVela 会经过 Access Key 主动创立一个 tiny ECS(1u1g)。
  3. FRP [ 5] ,KubeVela 将在服务器端和客户端发动这个代理。

准备 KubeVela 环境

  • 装置 KubeVela
curl -fsSl https://static.kubevela.net/script/install-velad.sh | bash
velad install

检查文档 1 [ 6] 以了解更多装置细节。

  • 启用 Terraform Addon 和 Alibaba Provider
vela addon enable terraform
vela addon enable terraform-alibaba
  • 增加授权信息
vela provider add terraform-alibaba --ALICLOUD_ACCESS_KEY <"your-accesskey-id"> --ALICLOUD_SECRET_KEY "your-accesskey-secret" --ALICLOUD_REGION <your-region> --name terraform-alibaba-default

检查文档 2 [ 7] 以获取有关其他云的更多详细信息。

布置带有公网 IP 地址的 ECS 实例并发动 FRP 服务

cat <<EOF | vela up -f -
# 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

此运用界说将布置一个带有公网 IP 地址的 ECS 实例。

你能够经过下述指令详细了解每一个字段阐明:

vela show alibaba-ecs

履行完上述布置指令后,你能够经过下面的方法检查运用布置状况:

vela status ecs-demo
vela logs ecs-demo

运用布置完结后能够经过下述指令获取到 IP 地址:

$ kubectl get secret outputs-ecs --template={{.data.this_public_ip}} | base64 --decode
["121.196.106.174"]

你能够经过 IP:9091 地址拜访到 FRP 服务的办理页面,初始账号密码为:admin:vela123至此咱们完结了 ECS 服务的布置。

运用 FRP 服务

FRP 客户端的运用十分简略,咱们能够为集群内的任何服务供给公共 IP。

将 Terraform 生态粘合到 Kubernetes 世界

  1. 单独布置 FRP-Proxy。
cat <<EOF | vela up -f -
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 服务。你能够经过公网 IP:8083来拜访该服务。

  1. 将代理和一般运用一起布置。
cat <<EOF | vela up -f -
# 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

如此布置完结后可经过公网 IP:8082 来拜访该服务。还有一种玩法是将 FRP-Proxy 界说为 Trait,直接挂载到需求露出服务的组件上,这种方法期望你经过阅览 KubeVela 的文档来探索实现啦。

整理环境

经过下述指令完结测验过程中创立运用的整理动作:

vela delete composed-app -y
vela delete frp-proxy -y
vela delete ecs-demo -y

云服务组件也会跟着运用删除被毁掉。

到此咱们经过一个具体的运用事例来描绘了 KubeVela 是如何完结云服务和一般运用的一致描绘和交给,期望你现已掌握并在自己的环境中进行多样化测验。经过这个事例你也应该大约了解了 KubeVela 结合 Terraform 的最终作用。更多关于 KubeVela 的玩法,可经过阅览 KubeVela 官方文档取得。

参考链接:

*[1] *Terraform CLI

www.terraform.io/downloads

[2] Terraform 模块

github.com/wonderflow/…

[3] 装置了 Kubevela 操控平面

kubevela.net/docs/instal…

[4] 这儿

kubevela.net/docs/platfo…

[5] FRP

github.com/fatedier/fr…

[6] 文档 1

kubevela.net/docs/instal…

[7] 文档 2

kubevela.net/docs/refere…


您能够经过如下材料了解更多关于KubeVela以及OAM项目的细节:

  • 项目代码库:github.com/oam-dev/kubevela欢迎Star/Watch/Fork!
  • 项目官方主页与文档:kubevela.io,从1.1版别开端,已供给中文、英文文档,更多言语文档欢迎开发者进行翻译。
  • 项目钉钉群:23310022;Slack:CNCF#kubevelaChannel
  • 加入微信群:请先增加以下maintainer微信号,表明进入 KubeVela 用户群:

将 Terraform 生态粘合到 Kubernetes 世界

戳此处:检查KubeVela项目官网!