云网络与基础设施即代码(第二部分):基础设施即代码云网络





5.00/5 (2投票s)
Terraform 的工作原理以及如何使用它通过 IaC 在 Azure 中配置虚拟网络
基础设施即代码 (IaC) 是一种使用声明性模型管理云资源的方法。在 IaC 中,您使用特定格式的文本文件声明您的云环境,包括 VNet。这些文件通常称为模板。
其思想是拥有可重现的云环境声明或模板,您可以使用单个命令进行部署、更新和删除。专用工具将获取您的模板文件,将资源列表与当前部署状态进行比较,并相应地更新云服务和资源。
在本文中,我们将重点介绍 IaC 的关键优势。然后,我们将探讨 Azure Resource Manager 和流行的开源 IaC 软件解决方案 Terraform,并演示如何使用 Terraform 部署 Azure VNet。
我们将使用 Azure Cloud Shell,因此您无需在本地安装任何内容。Terraform 命令行界面已包含在内。但是,如果您想在本地安装 Terraform,可以 遵循安装文档。
IaC 的优势
让我们首先探讨 IaC 的四个关键优势。首先,您可以将声明保存在源代码控制系统中。这使得对声明文件进行协作成为可能。它还允许您跟踪团队成员对环境所做的所有更改。通过这样做,您可以加快云部署速度,并采用与应用程序源代码类似的资源配置策略。例如,可以使用拉取请求在部署前验证和与团队成员协商基础设施更改。
其次,使用 Azure Portal 等 Web 门户配置云资源和服务的易用性和便利性通常高于使用命令行工具。但有时,您需要执行许多重复性任务,这些任务容易出错。您通常需要对基础设施进行临时更改,这些更改很容易被忽略。通过将声明保存在源代码控制系统中,您可以跟踪更改并根据需要快速回滚基础设施。
第三,通过环境声明,您可以快速将其克隆或类似版本部署到其他区域。通常,IaC 工具允许您参数化部署。这意味着您可以快速部署类似的环境。
第四,许多代码部署和 DevOps 工具都支持 IaC。您可以使用与代码部署相同的 CI/CD 流水线来部署环境。然后,云环境配置就成为代码部署过程的一部分。因此,随着您的应用程序或服务的增长,您可以根据工作负载的变化来调整底层硬件。
Azure Resource Manager 和 Terraform
Azure 原生提供 Azure Resource Manager (ARM) 作为 IaC。ARM 使用 JSON 格式的模板文件。要生成 ARM 模板,您可以使用 Azure 门户。在预配任何服务时,在任何 Azure 门户向导的最后几个步骤之一中,您会看到“生成自动化模板”的选项。这将生成必要的文件。
请记住,ARM 是 Azure 特有的。其他云平台有自己的工具。例如,Google 使用 Deployment Manager,而 Amazon Web Services 有 CloudFormation。此外,第三方还提供跨平台工具,可用于针对任何云或本地进行 IaC。
其中一个工具是 HashiCorp 的 Terraform,它已成为 IaC 自动化的标准。在 Terraform 中,您创建描述基础设施的模板文件,然后使用单个命令行工具 (terraform apply
) 将其部署到云端。
Terraform 结构和工作流程
Terraform 使用提供程序使其能够跨不同的云和本地数据中心使用。提供程序是连接 Terraform CLI 和由云提供商提供的目标 API(如 ARM)的桥梁。可以通过 Terraform 注册表访问公开可用的 Terraform 提供程序。
通常,Terraform 提供程序是您在 Terraform 模板文件中指定的第一个内容。然后,您声明要预配的资源。实际上,单个模板文件可以使用多个提供程序同时部署到不同云上的各种资源。要安装提供程序,请使用 terraform init
CLI 命令。
拥有模板文件后,就可以使用 terraform validate
对其进行验证。然后,创建所谓的执行计划(terraform apply
)。Terraform 生成执行计划,以将实际基础设施模型(您已在云中拥有的资源)与模板文件进行比较。在评估差异后,Terraform 会在您批准计划后列出将要执行的更改。
让我们看看如何使用 Terraform 在 Azure 中预配 VNet!
单个虚拟网络模式
首先,我们部署实现单个虚拟网络模式的 VNet。具体来说,我们将创建具有两个子网的 VNet — 一个用于假设的后端,另一个用于前端。
登录 Azure 后,打开 **Cloud Shell**,然后通过点击右上角菜单中的第一个图标选择 **Bash 解释器**
Cloud Shell 初始化后,创建新文件夹 _01_,并在该文件夹内创建新文件 _vnet.tf_。
mkdir 01
cd 01
code vnet.tf
然后,使用以下语句修改文件
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0.2"
}
}
required_version = ">= 1.1.0"
}
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "rg-terraform-vnet" {
name = "rg-terraform-vnet"
location = "eastus"
}
resource "azurerm_virtual_network" "single-vnet" {
name = "single-vnet"
location = azurerm_resource_group.rg-terraform-vnet.location
resource_group_name = azurerm_resource_group. rg-terraform-vnet.name
address_space = ["10.0.0.0/16"]
dns_servers = ["10.0.0.4", "10.0.0.5"]
subnet {
name = "subnet-backends"
address_prefix = "10.0.1.0/24"
}
subnet {
name = "subnet-frontends"
address_prefix = "10.0.2.0/24"
}
tags = {
Pattern = "Single Virtual Network"
}
}
之后,使用代码编辑器菜单保存并关闭文件
在继续之前,让我们分析一下我们刚刚创建的 Terraform 模板文件的结构。首先,我们需要 Terraform 安装 azurerm
提供程序
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0.2"
}
}
required_version = ">= 1.1.0"
}
然后,我们需要这个提供程序
provider "azurerm" {
features {}
}
azurerm
提供程序会将 Terraform 的所有请求转换为 Azure Resource Manager,以预配 Azure 资源。
要部署的资源列表遵循提供程序声明。我们从名为 rg-terraform-vnet
的资源组开始,该资源组将在东 US 区域(eastus
)中预配
resource "azurerm_resource_group" "rg-terraform-vnet" {
name = "rg-terraform-vnet"
location = "eastus"
}
然后,我们声明 VNet
resource "azurerm_virtual_network" "single-vnet" {
name = "single-vnet"
location = azurerm_resource_group.rg-terraform-vnet.location
resource_group_name = azurerm_resource_group.rg-terraform-vnet.name
address_space = ["10.0.0.0/16"]
dns_servers = ["10.0.0.4", "10.0.0.5"]
subnet {
name = "subnet-backends"
address_prefix = "10.0.1.0/24"
}
subnet {
name = "subnet-frontends"
address_prefix = "10.0.2.0/24"
}
tags = {
Pattern = "Single Virtual Network"
}
}
此 VNet 将部署到与资源组相同的区域(location 参数)。它将使用 10.0.0.0/16 的 IP 地址范围,并包含两个 DNS 服务器。所有请求都将相同。
然后,我们有两个子网声明:一个名为 subnet-backends
(地址范围为 10.0.1.0/24),一个名为 subnet-frontends
(10.0.2.0/24)。此外,我们创建了一个名为 Pattern
、值为 Single Virtual Network
的标签。基本上,您可以通过与使用 Azure 门户相同的方式配置 VNet。
拥有此模板文件后,我们将通过输入以下命令来初始化 Terraform
terraform init
这将产生一个输出,类似于下图所示
然后,我们可以验证我们的模板
terraform validate
如果模板有效,命令应输出“Success! The configuration is valid.”字符串,如下所示。
现在,我们可以创建执行计划
terraform apply
执行计划包含要部署、更新或删除的资源列表
向下滚动,您将看到摘要
现在,您需要通过输入“yes
”来确认执行计划。Terraform 将开始预配过程。完成后,您将看到摘要
在后台,Terraform 创建了一个 _terraform.tfstate_ 文件,这是一个 JSON 格式的文本文件,Terraform 用于部署
资源部署完成后,您可以在 Azure 门户中看到新的 VNet
请注意,配置与 Terraform 模板文件匹配。此外,在转到 **设置** > **子网** 后,您将看到我们的后端和前端子网
如上所述,我们可以使用单个 Terraform 命令删除所有资源
terraform destroy
VNet 对等互连
现在您已经了解了如何使用 Terraform 部署 VNet,让我们创建另一个 Terraform 模板,它将创建两个 VNet。此外,该模板将配置两个虚拟网络之间的 VNet 对等互连。
在 **Cloud Shell** 中,创建一个新文件夹 _02_。假设您仍在 _01_ 中,可以使用以下命令完成此操作
cd ..
mkdir 02
在此文件夹下,创建新的 vnet_with_peering.tf (code vnet_with_peering.tf)
并使用以下语句填充它
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0.2"
}
}
required_version = ">= 1.1.0"
}
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "rg-terraform-vnet" {
name = "rg-terraform-vnet"
location = "eastus"
}
resource "azurerm_virtual_network" "vnet-1" {
name = "vnet-1"
resource_group_name = azurerm_resource_group.rg-terraform-vnet.name
address_space = ["10.0.1.0/24"]
location = azurerm_resource_group.rg-terraform-vnet.location
}
resource "azurerm_virtual_network" "vnet-2" {
name = "vnet-2"
resource_group_name = azurerm_resource_group.rg-terraform-vnet.name
address_space = ["10.0.2.0/24"]
location = azurerm_resource_group.rg-terraform-vnet.location
}
resource "azurerm_virtual_network_peering" "peer-vnet1-to-vnet2" {
name = "peer-vnet1-to-vnet2"
resource_group_name = azurerm_resource_group.rg-terraform-vnet.name
virtual_network_name = azurerm_virtual_network.vnet-1.name
remote_virtual_network_id = azurerm_virtual_network.vnet-2.id
}
resource "azurerm_virtual_network_peering" "peer-vnet2-to-vnet1" {
name = "peer-vnet2-to-vnet1"
resource_group_name = azurerm_resource_group.rg-terraform-vnet.name
virtual_network_name = azurerm_virtual_network.vnet-2.name
remote_virtual_network_id = azurerm_virtual_network.vnet-1.id
}
除了提供程序,该模板还包含五个资源:资源组、两个 VNet 和两个 VNet 对等互连。VNet 声明遵循与之前相同的结构。新增的元素是 azurerm_virtual_network_peering
资源,它将配置 VNet 对等互连。如上所示,这些资源使用 virtual_network_name
提供对等互连将从中发起的 VNet,以及指向目标 VNet 的 remote_virtual_network_id
。目标网络的标识符从相应的 azurerm_virtual_network
资源中检索。
我们现在可以初始化 Terraform
terraform init
要验证模板并预配资源,请键入(记住通过键入 yes
确认执行计划)
terraform validate
terraform apply
部署完成后,您现在将拥有两个 VNet
每个 VNet 都将包含对等互连配置
同样,要销毁资源,请输入
terraform destroy
摘要
在本教程中,我们学习了如何使用 Terraform 通过 IaC 在 Azure 中预配虚拟网络。我们还学习了 Terraform 的工作原理,并利用这些知识创建了一个带有两个子网的单个 VNet 以及具有对等互连的多个 VNet。
最重要的是,由于 Azure Cloud Shell 和内置代码编辑器,我们无需在本地安装任何内容即可完成所有这些工作。本系列的最后一篇文章将介绍如何保护和路由您的云网络。
要详细了解 IaC 如何将测试和版本控制等软件工程实践应用于您的 DevOps 实践,请参阅资源 基础设施即代码。