简介: 为了更高效,统一的管理云服务,IaC 思想近年来盛行,其中 Terrafrom 更是成功得到了几乎所有的云厂商的采纳和支持。以 Terrafrom 模型为核心的云服务 IaC 生态已经形成。然而在 Kubernetes 大行其道的今天,IaC 被冠以更广大的想象空间,Terraform IaC 能力和生态成果如果融入 Kubernetes 世界,我们认为这是一种强强联合。

作者:曾庆国 孙健波

背景

 

随着各大云厂商产品版图的扩大,基础计算设施,中间件服务,大数据/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/downloads

 

[2] Terraform 模块

https://github.com/wonderflow/terraform-alicloud-ecs-instance

 

[3] 安装了 Kubevela 控制平面

https://kubevela.net/docs/install#1-install-velad

 

[4] 这里

https://kubevela.net/docs/platform-engineers/components/component-terraform

 

[5] FRP

https://github.com/fatedier/frp

 

[6] 文档 1

https://kubevela.net/docs/install#1-install-velad

 

[7] 文档 2

https://kubevela.net/docs/reference/addons/terraform

 


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

 

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

此处:查看 KubeVela 项目官网!

原文链接:http://click.aliyun.com/m/1000349188/

本文为阿里云原创内容,未经允许不得转载。

将 Terraform 生态粘合到 Kubernetes 世界的更多相关文章

  1. 第七章 云原生生态的基石 Kubernetes

    7.1 Kubernetes架构 K8s的核心组件: etcd: 协同存储,负责保存整个集群的状态. API:资源操作的唯一入口. controller manager: 维护集群的状态,执行故障检测 ...

  2. Kubernetes — 我的第一个容器化应用

    而在这篇文章中,我们就来扮演一个应用开发者的角色,使用这个 Kubernetes 集群发布第一个容器化应用. 在开始实践之前,我先给你讲解一下 Kubernetes 里面与开发者关系最密切的几个概念. ...

  3. 对比剖析Swarm Kubernetes Marathon编排引擎

    Docker Native Orchestration 基本结构 Docker Engine 1.12 集成了原生的编排引擎,用以替换了之前独立的Docker Swarm项目.Docker原生集群(S ...

  4. Kubernetes探索学习002--Kubernetes的基本使用

    Kubernetes 的基本使用方法 原则:使用YAML文件描述你要部署的API对象! 以部署nginx静态站点为例,具体操作及内容如下 1.编写YAML文件 [root@kubernetes01 ~ ...

  5. 验证Kubernetes YAML的最佳实践和策略

    本文来自Rancher Labs Kubernetes工作负载最常见的定义是YAML格式的文件.使用YAML所面临的挑战之一是,它相当难以表达manifest文件之间的约束或关系. 如果你想检查所有部 ...

  6. Kubernetes Operator基础入门

    本文转自Rancher Labs 你是否曾经想过SRE团队是如何有效地成功管理复杂的应用?在Kubernetes生态系统中,Kubernetes Operator可以给你答案.在本文中,我们将研究Op ...

  7. Kubernetes YAML最佳实践和策略

    Kubernetes工作负载最常用YAML格式的文件来定义. YAML的问题之一就是很难描述清单文件之间的约束或关系. 如果你希望检查是否已从受信任的注册表中提取部署到群集中的所有映像,该怎么办? 如 ...

  8. 说透 Kubernetes 监控系列 - 概述

    本文作者孔飞,来自快猫星云团队,Kubernetes专家,Categraf 采集器核心研发工程师 云原生包含了开源软件.云计算和应用架构的元素.云计算解决开源软件的运行门槛问题,同时降低了运维成本和基 ...

  9. 《Terraform 101 从入门到实践》 Terraform在公有云Azure上的应用

    <Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. 简介 Azure是微软的公有 ...

  10. Spring Cloud Alibaba基础教程-Nacos(一)

    2019快结束,也有很久没写博客了,今天我们来谈谈Nacos,如果对您有帮助,麻烦左上角点个关注 ,谢谢 ! 嘻嘻 今天先写第一篇 文章目录 为什么要使用Nacos Eureka 闭源 Nacos的优 ...

随机推荐

  1. py文件读写

    ''' 1.文件打开 open(文件名,模式) 2.文件关闭filename.close() 模式: 1.r 文件读,指针默认在文件开头 2.w 文件写,指针默认在开头 若有文件,则打开时写入覆盖原文 ...

  2. [置顶] java动态控制线程的启动和停止

    最近项目有这样的需求:原来系统有个计算的功能,但该功能执行时间会很长(大概需要几个小时才能完成),如果执行过程中出现了错误的话,也只能默默的等待错误执行完成才行,无法做到动态的对该功能进行停止. 我了 ...

  3. chm之已取消到该网页的导航解决办法

    1. 右键单击该 CHM 文件,然后单击"属性". 2. 单击"取消阻止"或者"解除锁定". 3. 双击此 .chm 文件以打开此文件.

  4. python基础笔记((1)

    逻辑与或非用的是and or not. 除法即使整除结果也是浮点数 地板除//结果一定是整数. 内存中的字符串是Unicode编码,str.encode('utf-8 or ascii')将class ...

  5. C#中的For与Foreach循环:一场性能对话与实战解析

    引言 在C#编程实践中,选择适当的循环结构对程序性能至关重要,尤其是在处理大量数据或追求极致运行效率时.本文将深入探讨C#中的两种主要迭代机制--传统的for循环和基于集合迭代器的foreach循环之 ...

  6. MySQL(初识数据库)

    一 存储数据的演变过程 随意的存在一个文件中.数据格式也是千差万别的完全取决于我们自己 软件开发目录规范 限制了存储数据的具体位置 ''' bin conf core lib db readme.tx ...

  7. package.json报错"No license field"问题解决

    问题描述 warning package.json: No license field 问题原因 package.json中缺少license字段 解决方法 package.json中添加licens ...

  8. 记录--Vue中的$attrs你真的会用吗?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 先来看一个业务需求: 项目经常会遇到产品经理要求你做某组件一样的功能,还要在它的基础上增加东西.如何只用少量代码高效的二次封装组件呢? 例 ...

  9. 记录--怎么写一个可以鼠标控制旋转的div?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 说在前面 鼠标控制元素旋转在现在也是一个很常见的功能,让我们从实现div元素的旋转控制开始来了解元素旋转的具体原理和实现方法吧. 效果展示 ...

  10. 记录--说一说css的font-size: 0

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 平常我们说的font-size:0:就是设置字体大小为0对吧,但是它的用处不仅仅如此哦,它还可以消除子行内元素间额外多余的空白! 问题描述 ...