使用Terraform创建CCE集群
在容器化业务快速迭代的场景下,运维工程师需要频繁创建CCE集群以部署和管理容器化应用。手动通过控制台创建集群需要依次配置VPC、子网、集群参数等多个环节,操作繁琐且容易出错,尤其在多环境(开发、测试、生产)需要重复创建时效率较低。
通过Terraform可以将集群创建过程定义为代码,实现一键自动化创建CCE集群及其依赖的网络资源,支持版本管理和可重复执行,适用于以下场景:
- CI/CD流水线中自动化创建和销毁测试集群
- 多环境批量创建配置一致的CCE集群
- 集群创建流程标准化,减少人工操作差异
前提条件
- 已准备一台可以连接公网的机器。
- 已获取华为云账号AK/SK,且账号具有创建并修改CCE集群的权限,详情请参见访问密钥。
- 已安装Terraform,详情请参见安装Terraform并配置华为云Provider。
操作步骤
步骤一:创建项目目录并初始化配置
- 创建CCE集群管理目录(目录名可自定义)。
mkdir terraform_cce_cluster cd ./terraform_cce_cluster
- 将已准备好的Provider配置文件复制到当前目录。init.tf已在“安装Terraform并配置华为云Provider”章节的terraform_hw_demo目录中创建。
cp ../terraform_hw_demo/init.tf .
步骤二:创建配置文件
以下所有配置文件均在项目目录下创建。
- 查询可用区。
创建az.tf文件,查询指定region下所有的可用区信息,用于后续创建CCE Turbo集群相关资源。
# 获取指定region(region参数缺省时默认继承当前provider块中所指定的region)下所有的可用区信息,用于创建Turbo集群相关资源 data "huaweicloud_availability_zones" "test" {} - (可选)如需自定义endpoint,创建endpoints.tf。
provider "huaweicloud" { insecure = true # 跳过SSL证书验证 endpoints = { ecs = "https://ecs.{region}.myhuaweicloud.com" cce = "https://cce.{region}.myhuaweicloud.com" vpc = "https://vpc.{region}.myhuaweicloud.com" } }将{region}替换为实际Region(如cn-north-7c)。
- 创建VPC(可选)。
如已有VPC,可跳过此步骤,在后续步骤中通过vpc_id变量指定已有VPC。创建vpc.tf文件:
variable "vpc_id" { description = "VPC的ID" type = string default = "" } variable "vpc_name" { description = "VPC的名称" type = string default = "" validation { condition = var.vpc_id != "" || var.vpc_name != "" error_message = "如果未提供vpc_id,则必须提供vpc_name" } } variable "vpc_cidr" { description = "VPC的CIDR块" type = string default = "192.168.0.0/16" } # 在指定region(region参数缺省时默认继承当前provider块中所指定的region)下创建VPC资源,用于为Turbo集群提供网络环境 resource "huaweicloud_vpc" "test" { count = var.vpc_id == "" && var.subnet_id == "" ? 1 : 0 name = var.vpc_name cidr = var.vpc_cidr }涉及参数说明如下表所示。
参数
说明
count
创建资源数量。如果提供了vpc_id则不再创建VPC资源。
name
VPC名称。
cidr
VPC网段,默认为192.168.0.0/16。
- 创建VPC子网。
如已执行步骤2创建VPC,则必须执行此步骤;如已有子网,可跳过此步骤,通过subnet_id变量指定已有子网。创建vpc_subnet.tf文件:
variable "subnet_id" { description = "子网的ID" type = string default = "" } variable "subnet_name" { description = "子网的名称" type = string default = "" validation { condition = var.subnet_id == "" || var.subnet_name == "" error_message = "如果未提供subnet_id,则必须提供subnet_name" } } variable "subnet_cidr" { description = "子网的CIDR块" type = string default = "" } variable "subnet_gateway_ip" { description = "子网的网关IP" type = string default = "" } variable "availability_zone" { description = "创建CCE集群的可用区" type = string default = "" } # 在指定region(region参数缺省时默认继承当前provider块中所指定的region)下创建VPC子网资源,用于为Turbo集群提供网络环境 resource "huaweicloud_vpc_subnet" "test" { count = var.subnet_id == "" ? 1 : 0 vpc_id = var.vpc_id != "" ? var.vpc_id : huaweicloud_vpc.test[0].id name = var.subnet_name cidr = var.subnet_cidr != "" ? var.subnet_cidr : cidrsubnet(huaweicloud_vpc.test[0].cidr, 4, 0) gateway_ip = var.subnet_cidr != "" ? cidrhost(var.subnet_cidr, 1) : cidrhost(cidrsubnet(huaweicloud_vpc.test[0].cidr, 4, 0), 1) availability_zone = var.availability_zone != "" ? var.availability_zone : try(data.huaweicloud_availability_zones.test.names[0], null) }涉及参数说明如下表所示。
参数
说明
count
创建资源数量。如果提供了subnet_id则不再创建子网。
vpc_id
需要在其下创建子网的VPC ID。
name
子网名称。
cidr
子网网段。未提供时自动从VPC网段中分割一个子网。
gateway_ip
子网网关IP地址。未提供时使用子网网段的第一个IP地址。
availability_zone
子网可用区。未提供时使用查询到的第一个可用区。
- 创建ENI子网。
CCE Turbo集群使用云原生网络2.0(eni),需要额外创建ENI子网为容器提供网络环境。如已有ENI子网,可通过eni_ipv4_subnet_id变量指定。
创建eni_subnet.tf文件:
variable "eni_ipv4_subnet_id" { description = "ENI子网的ID" type = string default = "" } variable "eni_subnet_name" { description = "ENI子网的名称" type = string default = "" validation { condition = var.eni_ipv4_subnet_id == "" || var.eni_subnet_name == "" error_message = "如果未提供eni_ipv4_subnet_id,则必须提供eni_subnet_name" } } variable "eni_subnet_cidr" { description = "ENI子网的CIDR块" type = string default = "" } # 在指定region(region参数缺省时默认继承当前provider块中所指定的region)下创建ENI子网资源,用于为Turbo集群提供ENI网络环境 resource "huaweicloud_vpc_subnet" "eni" { count = var.eni_ipv4_subnet_id == "" ? 1 : 0 vpc_id = var.vpc_id != "" ? var.vpc_id : huaweicloud_vpc.test[0].id name = var.eni_subnet_name cidr = var.eni_subnet_cidr != "" ? var.eni_subnet_cidr : cidrsubnet(huaweicloud_vpc.test[0].cidr, 4, 1) gateway_ip = var.eni_subnet_cidr != "" ? cidrhost(var.eni_subnet_cidr, 1) : cidrhost(cidrsubnet(huaweicloud_vpc.test[0].cidr, 4, 1), 1) availability_zone = var.availability_zone != "" ? var.availability_zone : try(data.huaweicloud_availability_zones.test.names[0], null) }涉及参数说明如下表所示。
参数
说明
count
创建资源数量。如果提供了eni_ipv4_subnet_id则不再创建ENI子网。
vpc_id
需要在其下创建子网的VPC ID。
name
ENI子网名称。
cidr
ENI子网网段。未提供时自动从VPC网段中分割一个子网。
gateway_ip
子网网关IP。未提供时使用子网网段的第一个IP。
availability_zone
子网可用区。未提供时使用查询到的第一个可用区。
ENI子网与普通VPC子网属于同一VPC下的不同子网,网段不能重叠。
- 创建cce_cluster.tf文件,以创建CCE集群。
variable "cluster_name" { description = "CCE集群的名称" type = string default = "" } variable "cluster_flavor_id" { description = "CCE集群的规格ID" type = string default = "cce.s1.small" } variable "cluster_version" { description = "CCE集群的版本" type = string default = null nullable = true } variable "cluster_type" { description = "CCE集群的类型" type = string default = "VirtualMachine" } variable "container_network_type" { description = "容器网络类型" type = string default = "eni" } variable "cluster_description" { description = "CCE集群的描述" type = string default = "" } variable "cluster_tags" { description = "CCE集群的标签" type = map(string) default = {} } # 在指定region(region参数缺省时默认继承当前provider块中所指定的region)下创建CCE集群资源,用于部署和管理高性能容器化应用 resource "huaweicloud_cce_cluster" "test" { name = var.cluster_name flavor_id = var.cluster_flavor_id cluster_version = var.cluster_version cluster_type = var.cluster_type container_network_type = var.container_network_type vpc_id = var.vpc_id != "" ? var.vpc_id : huaweicloud_vpc.test[0].id subnet_id = var.subnet_id != "" ? var.subnet_id : huaweicloud_vpc_subnet.test[0].id eni_subnet_id = var.eni_ipv4_subnet_id != "" ? var.eni_ipv4_subnet_id : huaweicloud_vpc_subnet.eni[0].ipv4_subnet_id description = var.cluster_description tags = var.cluster_tags }涉及参数说明如下表所示。
参数
说明
name
集群名称。
flavor_id
集群规格ID,默认为cce.s1.small。
cluster_version
集群版本,为null时使用当前默认版本。
cluster_type
集群Master节点架构。取值:VirtualMachine(X86)、ARM64(鲲鹏)。
container_network_type
容器网络类型。取值:overlay_l2(容器隧道网络,创建CCE Standard集群)、vpc-router(VPC网络,创建CCE Standard集群)、eni(云原生网络2.0,创建CCE Turbo集群)。
vpc_id
集群使用的VPC ID。
subnet_id
集群节点使用的子网ID。
eni_subnet_id
容器使用的ENI子网的IPv4子网ID。
description
集群描述信息。
tags
集群标签。
container_network_type参数决定了创建的集群类型和所需的网络资源。选择eni时需创建ENI子网,选择overlay_l2或vpc-router时无需创建ENI子网。
- 配置资源参数。以下为示例配置,请根据实际业务需求修改参数值。
创建terraform.tfvars文件,预设资源所需的入参:
vpc_name = "tf_test_vpc" subnet_name = "tf_test_subnet" eni_subnet_name = "tf_test_eni_subnet" cluster_name = "tf-test-cluster" cluster_description = "Created by terraform script" availability_zone = "cn-north-7c" # 请替换为实际可用区 cluster_tags = { owner = "terraform" }
步骤三:初始化并应用Terraform配置
- 初始化环境。
terraform init
- 查看执行计划,确认资源变更是否符合预期。
terraform plan
- 计划确认无误后,创建资源。执行时Terraform会向用户确认,输入yes确认执行。
terraform apply
- 查看已创建的资源。
terraform show
步骤四:清理资源
此操作将永久删除通过Terraform创建的所有资源(包括VPC、子网和CCE集群),请确认资源中无重要业务数据后再执行。
当不再需要通过Terraform创建的资源时,可以执行以下命令释放资源。
terraform destroy
执行时Terraform会向用户确认,输入yes确认执行。

相关文档
- 如需了解Terraform的安装和华为云Provider的配置,请参见安装Terraform并配置华为云Provider。
- 如需了解CCE集群规格和选型建议,请参见CCE集群选型建议_。