将 Terraform 生态粘合到 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

2.初始化并下载最新稳定版本的阿里云 Provider。

terraform init

3.配置阿里云授权账号信息。

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"
}

4.测试资源创建是否正常。

terraform apply -var-file=test/test.tfvars

5.测试正常后销毁所有已创建的资源。

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-demotype: alibaba-ecsproperties:providerRef:name: terraform-alibaba-defaultwriteConnectionSecretToRef: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- 9092tags: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-proxytype: workerproperties:image: oamdev/frpc:0.43.0env:- name: server_addrvalue: "121.196.106.174"- name: server_portvalue: "9090"- name: local_portvalue: "80"- name: connect_namevalue: "velaux-service"- name: local_ipvalue: "velaux.vela-system"- name: remote_portvalue: "8083"
EOF

在这种情况下,我们通过 velaux.vela-system 指定 local_ip,这意味着我们正在访问命名空间 vela-system 中名为 velaux 的 Kubernetes 服务。你可以通过公网 IP:8083来访问该服务。

2.将代理和普通应用共同部署。

cat <<EOF | vela up -f -
# YAML begins
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:name: composed-app
spec:components:- name: web-newtype: webserviceproperties:image: oamdev/hello-world:v2ports:- port: 8000expose: true- name: frp-webtype: workerproperties:image: oamdev/frpc:0.43.0env:- name: server_addrvalue: "121.196.106.174"- name: server_portvalue: "9090"- name: local_portvalue: "8000"- name: connect_namevalue: "composed-app"- name: local_ipvalue: "web-new.default"- name: remote_portvalue: "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

作者:曾庆国 孙健波

原文链接

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

照妖镜:一个工具的自我超越

人和动物的最大区别&#xff0c;就是人会使用工具。那么&#xff0c;作为一个工具&#xff0c;如何在用户需求多变、产品功能多样的当下&#xff0c;不断地实现自我超越呢&#xff1f;今天我们就来聊一聊。 一、高开低走 听说天庭第一发明家太上老君&#xff0c;又引入了一条…

云原生混部最后一道防线:节点水位线设计

引言 在阿里集团&#xff0c;在离线混部技术从 2014 年开始&#xff0c;经历了七年的双十一检验&#xff0c;内部已经大规模落地推广&#xff0c;每年为阿里集团节省数十亿的资源成本&#xff0c;整体资源利用率达到 70% 左右&#xff0c;达到业界领先。这两年&#xff0c;我们…

为什么 ChatGPT 会引起 Google 的恐慌?

在 ChatGPT 尚未全面开放使用之际&#xff0c;它散发的巨大威力&#xff0c;似乎已经让行业内的竞争对手感到了威胁。整理 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;距离 ChatGPT 上线不足一个月的时间&#xff0c;其已经成为各行各业智囊团中的“网红…

阿里云中间件开源往事

分布式架构和云原生重塑了中间件的游戏规则&#xff0c;这给国内开发者提供了重新定义中间件的历史机遇。 在分布式架构流行前&#xff0c;国外 IT 厂商引领着中间件市场的发展&#xff0c;且以闭源、重商业的服务形式为主&#xff1b;随着云计算和互联网的普及&#xff0c;阿…

一个开发者自述:我是如何设计针对冷热读写场景的 RocketMQ 存储系统

悸动 32 岁&#xff0c;码农的倒数第二个本命年&#xff0c;平淡无奇的生活总觉得缺少了点什么。 想要去创业&#xff0c;却害怕家庭承受不住再次失败的挫折&#xff0c;想要生二胎&#xff0c;带娃的压力让我想着还不如去创业&#xff1b;所以我只好在生活中寻找一些小感动&…

Serverless实战 - 2分钟,教你用Serverless每天给女朋友自动发土味情话

一、Serverless简介 Serverless&#xff0c;中文意思是“无服务器”&#xff0c;所谓的无服务器并非是说不需要依靠服务器等资源&#xff0c;而是说开发者再也不用过多考虑服务器的问题&#xff0c;可以更专注在产品代码上&#xff0c;同时计算资源也开始作为服务出现&#xf…

如何实现一个 Paxos

Paxos 作为一个经典的分布式一致性算法(Consensus Algorithm)&#xff0c;在各种教材中也被当做范例来讲解。但由于其抽象性&#xff0c;很少有人基于朴素 Paxos 开发一致性库&#xff0c;而 RAFT 则是工业界里实现较多的一致性算法&#xff0c;RAFT 的论文可以在下面参考资料中…

比 Bloom Filter 节省25%空间!Ribbon Filter 在 Lindorm 中的应用

1 前言 Lindorm是一个低成本高吞吐的多模数据库&#xff0c;目前&#xff0c;Lindorm是阿里内部数据体量最大&#xff0c;覆盖业务最广的数据库产品。超高的性能和低RT一直是Lindorm追求的目标&#xff0c;因此Lindorm也在不断地优化和迭代&#xff0c;争取在每个小点上都做到…

阿里云云原生一体化数仓 — 数据治理新能力解读

一、数据治理中心产品简介 阿里云DataWorks&#xff1a;一站式大数据开发与治理平台 架构大图 阿里云 DataWorks定位于一站式的大数据开发和治理平台&#xff0c;从下图可以看出&#xff0c;DataWorks 与 MaxCompute、Hologres 等大数据引擎紧密配合&#xff0c;在数据的 采、…

入门即享受!coolbpf 硬核提升 BPF 开发效率

编者按&#xff1a;BPF 技术还在如火如荼的发展着&#xff0c;本文先通过对 BPF 知识的介绍&#xff0c;带领大家入门 BPF&#xff0c;然后介绍 coolbpf 的远程编译&#xff08;原名 LCC&#xff0c;LibbpfCompilerCollection&#xff09;&#xff0c;意为酷玩 BPF&#xff0c;…

拥抱开放,Serverless 时代的下一征程

Serverless 作为云计算的最佳实践和未来演进趋势&#xff0c;其全托管免运维的使用体验和按量付费的成本优势使得它在云原生时代备受推崇。Serverless 的使用场景也由事件驱动&#xff0c;数据处理等部分特定场景转向更为广泛通用化的 WEB&#xff0c;微服务&#xff0c;AI&…

云原生混部系统 Koordinator 架构详解

混部技术的介绍和发展 混部的概念可以从两个角度来理解&#xff0c;从节点维度来看&#xff0c;混部就是将多个容器部署在同一个节点上&#xff0c;这些容器内的应用既包括在线类型&#xff0c;也包括离线类型&#xff1b;从集群维度来看&#xff0c;混部是将多种应用在一个集…

全链路灰度在数据库上我们是怎么做的?

什么是全链路灰度&#xff1f; 微服务体系架构中&#xff0c;服务之间的依赖关系错综复杂&#xff0c;有时某个功能发版依赖多个服务同时升级上线。我们希望可以对这些服务的新版本同时进行小流量灰度验证&#xff0c;这就是微服务架构中特有的全链路灰度场景&#xff0c;通过…

InnoDB 之 UNDO LOG 介绍

undo log的组织形式 此部分是关于Undo log的组织形式的一个介绍&#xff1b;主要分为两部分来对undo log的组织形式进行介绍&#xff1a;文件结构和内存结构。在介绍这两部分时&#xff0c;先从局部出发&#xff0c;最后再给出各个部分的联系。 1. 文件结构 首先&#xff0c…

Spark 如何对源端数据做切分?

引言 典型的Spark作业读取位于OSS的Parquet外表时&#xff0c;源端的并发度&#xff08;task/partition&#xff09;如何确定&#xff1f;特别是在做TPCH测试时有一些疑问&#xff0c;如源端扫描文件的并发度是如何确定的&#xff1f;是否一个parquet文件对应一个partition&am…

数据库事务隔离发展历史

事务隔离是数据库系统设计中根本的组成部分&#xff0c;本文主要从标准层面来讨论隔离级别的发展历史&#xff0c;首先明确隔离级别划分的目标&#xff1b;之后概述其否定之否定的发展历程&#xff1b;进而引出 Adya给出的比较合理的隔离级别定义&#xff0c;最终总结隔离标准一…

为什么游戏行业喜欢用PolarDB

为什么游戏行业喜欢用PolarDB 游戏行业痛点 在我看来, 不同行业对数据库使用有巨大的差别. 比如游戏行业没有复杂的事务交易场景, 他有一个非常大的blob 字段用于存储角色的装备信息, 那么大Blob 字段的更新就会成为数据库的瓶颈, 比如在线教育行业需要有抢课的需求, 因此会有…

从业务开发中学习和理解架构设计

前言 在软件开发领域经常会接触到架构这个词汇&#xff0c;在我最初的印象中&#xff0c;架构是一个很高级的词汇。它似乎代表了复杂的工程结构、高层次的抽象设计、最新的开发语言特性等等。对于当时只专注于写业务逻辑的我来说&#xff0c;不免心生对架构的敬畏。工作中对架…

腾讯云联合中国联通打造下一代IDC数字化运营应用

近日&#xff0c;腾讯云联合中国联通智网创新中心打造的下一代IDC数字化运营应用&#xff0c;正式亮相2022中国联通合作伙伴大会。立足双方资源和经验优势&#xff0c;该数字化应用可实现对数据中心电力系统、制冷环境、安全防范等全方位智慧化运营&#xff0c;助力中国联通推进…

研发效能的思考总结

前言 在谈效能之前&#xff0c;我想先谈谈作为一个技术人或者技术TL&#xff0c;研发的核心价值是什么&#xff1f; 之前看了一篇文章&#xff0c;比较有意思&#xff0c;分享一下观念&#xff1a; T外包公司&#xff1a;最核心的竞争力不是技术&#xff0c;而是快速响应、资…