基础设施即代码

已发行

本章内容概览:

  • IaC 的概念和优势
  • Terraform 基础
  • 创建 Kubernetes 集群
  • 创建容器仓库
  • 最佳实践

7.1 什么是基础设施即代码?

定义 IaC 使用代码管理和配置基础设施,而非手动流程。

优势:

  • 可重复性:多次创建相同环境
  • 版本控制:基础设施配置纳入版本控制
  • 自动化:自动创建、更新和删除资源
  • 文档化:代码即文档
  • 一致性:确保环境间一致
  • 快速恢复:灾难恢复更容易

方法:

  • 声明式:描述期望状态(Terraform、Kubernetes YAML)
  • 命令式:描述如何达到期望状态(脚本、CLI)

7.2 为什么选择 Terraform?

开源的 IaC 工具。

特点:

  • 多云支持:几乎所有云服务商
  • 声明式语言:HCL
  • 依赖管理:自动处理资源依赖
  • 状态管理:跟踪基础设施状态
  • 执行计划:预览变更影响
  • 模块化:可重用的配置模块
图 7.1 Terraform 工作流程
图 7.1 Terraform 工作流程

工作流程:

  1. Write:编写 HCL 配置
  2. Plan:预览执行计划
  3. Apply:应用配置

7.3 Terraform 配置基础

Provider(提供者):

provider "azurerm" {
  features {}
}

Resource(资源):

resource "azurerm_resource_group" "example" {
  name     = "myResourceGroup"
  location = "East US"
}

Variable(变量):

variable "location" {
  default = "East US"
}

resource "azurerm_resource_group" "example" {
  location = var.location
}

Output(输出):

output "resource_group_name" {
  value = azurerm_resource_group.example.name
}

7.4 创建 Kubernetes 集群

完整 AKS 配置:

resource "azurerm_resource_group" "example" {
  name     = "myResourceGroup"
  location = "East US"
}

resource "azurerm_kubernetes_cluster" "example" {
  name                = "myAKSCluster"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  dns_prefix          = "myakscluster"

  default_node_pool {
    name       = "default"
    node_count = 2
    vm_size    = "Standard_DS2_v2"
  }

  identity {
    type = "SystemAssigned"
  }
}

应用配置:

terraform init
terraform plan
terraform apply

7.5 创建容器仓库

ACR 配置:

resource "azurerm_container_registry" "example" {
  name                = "myContainerRegistry"
  resource_group_name = azurerm_resource_group.example.name
  location            = azurerm_resource_group.example.location
  sku                 = "Basic"
  admin_enabled        = true
}

7.6 依赖关系

Terraform 自动管理资源依赖。

隐式依赖:

resource "azurerm_kubernetes_cluster" "main" {
  resource_group_name = azurerm_resource_group.main.name
  # 自动推断依赖
}

显式依赖:

resource "azurerm_kubernetes_cluster" "main" {
  depends_on = [azurerm_container_registry.main]
}

7.7 状态管理

远程状态配置(推荐):

terraform {
  backend "azurerm" {
    resource_group_name   = "myResourceGroup"
    storage_account_name   = "mystorageaccount"
    container_name         = "tfstate"
    key                    = "prod.terraform.tfstate"
  }
}

7.8 最佳实践

  • 模块化:使用模块组织可重用配置

  • 版本控制:所有代码纳入版本控制

  • 环境分离:使用工作空间管理不同环境

    terraform workspace new dev
    terraform workspace new prod
    
  • 安全

    • 不硬编码敏感信息
    • 使用环境变量或密钥管理服务
    • 限制 Terraform 权限
    • 定期审计变更

总结

  • IaC 使用代码管理基础设施,提高效率和可靠性
  • Terraform 支持多云平台,使用声明式语言 HCL
  • 核心概念:Provider、Resource、Variable、Output
  • 工作流程:Write → Plan → Apply
  • 自动管理资源依赖
  • 远程状态更安全
  • 最佳实践:模块化、版本控制、环境分离、安全

下一章学习使用 GitHub Actions 创建持续部署流水线。

创建于 2026/01/06 更新于 2026/01/06 873 字 阅读约 2 分钟

提交勘误/建议