关于阿里云:将-Terraform-生态粘合到-Kubernetes-世界

19次阅读

共计 6594 个字符,预计需要花费 17 分钟才能阅读完成。

作者:曾庆国 孙健波

背景

随着各大云厂商产品幅员的扩充,根底计算设施,中间件服务,大数据 /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。

  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**

https://www.terraform.io/down…

[2] Terraform 模块

https://github.com/wonderflow…

[3] 装置了 Kubevela 管制立体

https://kubevela.net/docs/ins…

[4] 这里

https://kubevela.net/docs/pla…

[5] FRP

https://github.com/fatedier/frp

[6] 文档 1

https://kubevela.net/docs/ins…

[7] 文档 2

https://kubevela.net/docs/ref…


您能够通过如下资料理解更多对于 KubeVela 以及 OAM 我的项目的细节:

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

戳此处:查看 KubeVela 我的项目官网!

正文完
 0