什么是基础架构即代码? 您所在的位置:网站首页 如何写架构文档文件格式 什么是基础架构即代码?

什么是基础架构即代码?

2023-06-17 07:51| 来源: 网络整理| 查看: 265

基础架构即代码 (IaC) 是一种像管理代码一样管理基础架构的方法。这为您提供了使用代码创建基础架构的所有好处,例如版本控制、跨不同环境更快、更安全的基础架构部署,以及拥有最新的基础架构文档。

本文将通过类比介绍基础架构即代码的工作原理。我们将涵盖不同的基础架构作为可用的代码工具以及声明式代码与命令式代码

我还将向您介绍 Terraform,这是一个开源基础设施即代码工具,您可以使用它来跨多个云提供商(如 AWS、GCP、Azure 等)创建基础设施。

(更|多优质内|容:java567 点 c0m)

基础设施即代码实践

想象一下,您正尝试在 AWS 上创建一个三层 Web 应用程序,如下图所示:

三层 Web 应用程序示例

表示层负责向用户呈现用户界面。它包括在 EC2 实例上运行的用户界面组件,例如 HTML、CSS 和 JavaScript。

逻辑层负责处理用户请求并生成响应,通过与数据库层通信来检索或存储数据。这也部署在 EC2 实例上

数据库层负责存储和管理应用程序的数据,并允许通过逻辑层访问其数据。数据库在 AWS RDS 上运行。

每个实例都在一个自动缩放组中,前面有一个负载均衡器(数据库层除外)。

如果你想通过 AWS 控制台创建这个基础设施,你将不得不手动点击各种屏幕来启动基础设施。如果这是一次性活动,这很好。

但是,如果您需要在不同的环境(如开发和测试)中重复此操作,或者需要添加额外的基础设施(如缓存、队列、防火墙规则、IAM或 SSL 证书),那么通过 AWS 控制台进行管理会变得越来越复杂。

通过控制台管理复杂的基础设施还可能会出现人为错误。

基础设施即代码以代码语言表达您想要的基础设施。这为管理您的基础架构带来了代码的所有好处,例如:

版本控制——允许您存储基础架构的历史记录,并在需要时恢复到以前的版本。 更快、更安全的部署——可以在新环境中快速重建基础设施,并且错误更少,因为基础设施的每个部分都在代码中明确定义。 文档 – 您当前的基础架构状态会被记录下来,并在您进行更改时自动保持最新状态。与将基础设施编写在文档中或在 confluence 页面上可能不会在发生更改时更新的基础设施相比,这可以使您的基础设施文档更加详细和准确。 基础设施即代码如何工作——用类比解释

基础设施即代码允许您创建基础设施的详细蓝图。此蓝图向您的云提供商提供有关您要创建的基础架构的说明。

这类似于架构蓝图的工作方式。它概述了结构的布局、尺寸、材料和各种组件。蓝图作为建筑师和工程师理解所需建筑的参考。

架构蓝图如何类似于基础架构即代码

蓝图几乎没有出错的余地。任何建筑师或工程师都会以同样的方式解释它。如果你想建造这座房子的精确副本,你所需要的只是建筑蓝图。

基础设施即代码在基本层面上的工作方式与架构蓝图相同。它详细说明了您希望以多种不同的可能语言(JSON、YAML、HCL、Python、Ruby、JavaScript 等)作为代码创建的基础架构,指示云提供商完全按照指定创建您的基础架构。

作为代码工具的声明式和命令式基础设施

有许多 IaC 选项可供选择,所有主要的云提供商都有自己的专用工具:

AWS 有 CloudFormation GCP 有部署管理器 Azure 有资源管理器

这些特定于云提供商的工具的一个限制是它们只能在各自的云中创建基础设施。因此 CloudFormation 仅适用于 AWS,而 Deployment Manager 仅适用于 GCP。使用这些提供者的 IaC 通常以 JSON 或 YAML 格式编写。

另一方面,Terraform 是开源的,您可以使用它来创建跨所有主要云提供商的基础设施。它使用 HCL(HashiCorp 配置语言)。

基础设施即代码也可以使用 Python 和 JavaScript 等流行语言编写。

这些脚本/编程语言依赖于一系列声明性和命令性代码,如下所示。

一系列声明式和命令式语言以及 Terraform HCL 适用的地方

命令式语言和声明式语言之间的主要区别在于命令式语言明确定义了控制流。这只是指令在程序中执行的顺序。控制流决定了程序所采用的路径以及它如何响应不同的条件或事件。

在命令式语言中,控制流是使用循环、条件和函数调用等控制结构显式定义的。命令式语言使您可以更灵活地配置基础架构。这不一定是积极的,因为更多的灵活性意味着更多的机会将错误引入您的基础架构。

声明性语言侧重于描述期望的结果,而不给出如何实现它的具体说明。

说明声明式语言和命令式语言之间差异的插图

示例 JSON 如下所示,在 AWS CloudFormation 中用于创建 EC2 实例:

 "Type": "AWS::EC2::Instance",       "Properties": {         "ImageId": "ami-0123456789",         "InstanceType": "t2.micro",         "KeyName": "my-key-pair",         "SecurityGroupIds": ["sg-0123456789"],         "SubnetId": "subnet-0123456789",         "Tags": [           {             "Key": "Name",             "Value": "MyEC2Instance"           }         ]       }

像 JSON 这样的声明性语言抽象出了详细描述 EC2 实例创建方式的底层复杂性。它只关心最终状态。

Terraform HCL 更接近声明式的一端。Terraform 允许您描述所需基础架构的最终状态,而无需指定到达那里的确切步骤。Terraform 在内部管理执行顺序、资源依赖性,并根据所需配置处理基础架构更改。

但 Terraform 确实支持一些命令式功能,如变量和表达式,允许基于输入的动态行为。所以,它不是像 JSON 那样完全声明性的语言。

Terraform 的工作原理

有两个基本概念可以作为理解 Terraform 的基础:

配置文件——这描述了所需的基础设施 状态文件——它描述了现实世界中存在的当前基础设施

Terraform 的工作是根据需要创建、修改或删除基础设施,以满足所需的基础设施配置。它通过对您的云提供商执行必要的 API 调用来创建、修改或销毁指定的资源来实现这一点。

一旦基础设施被创建/修改/销毁以匹配配置文件,状态文件就会更新以反映当前的基础设施。

该terraform plan命令会创建一个执行计划,让您可以预览 Terraform 计划对您的基础设施所做的更改。

默认情况下,当 Terraform 创建计划时,它会将配置文件中描述的所需配置与状态文件中描述的当前配置进行比较。然后,Terraform 会提出需要更改的列表,以确保当前配置与所需配置相匹配。

如果您随后运行该terraform apply命令,Terraform 将修改现实世界的基础设施以使其匹配所需的配置,并更新状态文件以显示新的基础设施配置。

在高层次上,这就是 Terraform 所做的:

运行terraform apply命令时会发生什么

让我们回到建筑蓝图的类比。

配置文件就像建筑蓝图。它详细说明了需要建造的基础设施,即所需的建筑。现实世界的基础设施是物理世界中的现有结构,状态文件是当前存在的表示——当前蓝图。工程师努力确保现有建筑符合建筑蓝图。

在这个类比中,工程师负责 Terraform 的工作,以确保现有结构与架构蓝图相匹配。您无需指定如何建造房屋的细节,您只需指定要建造的房屋,其余的由工程师处理。

跑步的建筑类比terraform apply

把它放在一起

基础设施即代码 (IaC) 是一种以代码形式管理复杂基础设施配置的好方法。这自然会为您的基础架构带来代码的所有优势,例如版本控制、跨不同环境更快、更安全的基础架构部署以及您的基础架构的最新文档。

Terraform 是一种开源 IaC 工具,可让您与多个云提供商合作,按照配置文件中的定义启动基础架构。

Terraform HCL 是一种声明性语言,可让您描述所需的基础设施配置。您所要做的就是指定您想要创建的内容,Terraform 会通过对您选择的云提供商进行 API 调用来代表您处理创建。

(更|多优质内|容:java567 点 c0m)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有