怎么理解基础设施即代码?使用Terraform用代码描述代替沟通

2023年 10月 27日 27.6k 0

通常申请基础设施,我们需要向运维描述我们需要什么基础设施、什么规格,运维根据我们的描述去检查是否已经申请过这样的资源,有就会直接给我们使用基础设施的信息,没有再帮我们申请,然后告诉我们使用基础设施的信息,例如mysql的jdbc和用户名、密码。

如果将描述代码化,基础设施的申请自动化,就能实现“基础设施即代码”。而terraform就是实现“将描述代码化”的工具软件。

将描述代码化

回忆我们部署一个中间件的步骤,少不了需要跟运维沟通申请云资源。以往我们部署网关都是使用虚拟机部署,最先要做的事情就是需要申请几台一样规格的虚拟机,假设我们使用的基础设施资源提供商是AWS,我们需要这样跟运维描述:“申请两台规格为m5.large(2核8G)的EC2实例”,运维同事则根据描述去帮我们申请EC2实例,申请完后告诉我们虚拟机的内网ip地址。

terraform要做的事情就是让我们能够用代码的方式去描述“申请两台规格为m5.large的EC2实例,并告诉我ip地址”,并且不需要找运维沟通,就能自动的根据代码描述去申请资源。而这个事情也能够通过代码记录一下。

让我们用HCL语言描述这一需求。为了便于理解,简化一下需求,假设只需要申请一台规格为m5.large的EC2实例:

resource "aws_instance" "ec2instance" {
  instance_type = "m5.large"
}

output "ip" {
  value = aws_instance.ec2instance.ip
}

当然,实际申请一台ec2实例需要填非常多的参数,而这里为了便于入门理解,假设申请一台ec2实例只需要传规则,即instance_type。

现在我们来解读一下这几行代码。

一、资源的描述:

resource "aws_instance" "ec2instance" {
  instance_type = "m5.large"
}

通过resource声明需要申请一个资源,接着“aws_instance”为资源的类型,“ec2instance”则是我们自己为这个资源定义的一个变量名,这个名字只在当前hcl代码中使用。{}里面是描述资源,例如instance_type= "m5.large"就是描述资源的规则为m5.large。

二、输出的描述:

output "ip" {
  value = aws_instance.ec2instance.ip
}

通过output声明输出变量,接着“ip”是输出的变量名,{}里面声明value,value = aws_instance.ec2instance.ip指变量的值来源于资源aws_instance.ec2instance的ip字段。引用一个资源需要通过“资源类型.资源名称”引用。

Terraform介绍

Terraform是用于实现基础设施即代码的工具软件。它将基础设施抽象成资源,并提供自定义的HCL语言,用于描述期望申请的资源,terraform既是HCL语言的编译器,同时也提供插件化的能力为各云厂商提供接入的扩展插件,核心引擎实现根据HCL的代码描述,通过gRPC调用插件去申请/更新/删除资源。

Terraform插件的底层逻辑就是通过调用云产商的基础设施API,实现资源的增删改查。

上图为官方的terraform工作原理图。图中Terraform Core就是terraform cli工具,包括terraform核心引擎。假设图中的Target Apis就是我们的私有云/混合云;那么CLIENT LIBRARY就是私有云平台提供给用户用于操作基础设施资源的HTTP接口的封装,即私有云SDK。PLUGINS就是插件能力集合,每个插件就是一个PROVIDER,我们需要为私有云/混合云开发我们自己的PROVIDER。

Terraform还提供状态持久化,实现类似k8s的控制器调协能力。对于已经申请过的资源,先对比输入参数是否有改变,以及查询资源的输出是否有改变,调协资源达到期望状态。但开源版的terraform并不具备k8s的自动监听调协资源的能力,需要人为的执行apply命令,或者实现定时任务定期去apply。

Terraform的核心概念:

  • Resource:基础设施资源的管理,定义具体资源的属性。
  • DataSource:基础设施资源的查询。

《云原生实战笔记》专栏:terraform篇01:初识terraform,用代码减少沟通成本_Java艺术的博客-CSDN博客

相关文章

KubeSphere 部署向量数据库 Milvus 实战指南
探索 Kubernetes 持久化存储之 Longhorn 初窥门径
征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
那些年在 Terraform 上吃到的糖和踩过的坑
无需 Kubernetes 测试 Kubernetes 网络实现
Kubernetes v1.31 中的移除和主要变更

发布评论