
# 使用Terraform创建CCE集群
在容器化业务快速迭代的场景下，运维工程师需要频繁创建CCE集群以部署和管理容器化应用。手动通过控制台创建集群需要依次配置VPC、子网、集群参数等多个环节，操作繁琐且容易出错，尤其在多环境（开发、测试、生产）需要重复创建时效率较低。
通过Terraform可以将集群创建过程定义为代码，实现一键自动化创建CCE集群及其依赖的网络资源，支持版本管理和可重复执行，适用于以下场景：
- CI/CD流水线中自动化创建和销毁测试集群
- 多环境批量创建配置一致的CCE集群
- 集群创建流程标准化，减少人工操作差异
#### 前提条件
- 已准备一台可以连接公网的机器。
- 已获取华为云账号AK/SK，且账号具有创建并修改CCE集群的权限，详情请参见[访问密钥](https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html)。
- 已安装Terraform，详情请参见[安装Terraform并配置华为云Provider](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_100712.html)。
 
#### 操作步骤
#### 步骤一：创建项目目录并初始化配置
1. 创建CCE集群管理目录（目录名可自定义）。
   ```
   mkdir terraform_cce_cluster
   cd ./terraform_cce_cluster
   ```
   
2. 将已准备好的Provider配置文件复制到当前目录。init.tf已在"安装Terraform并配置华为云Provider"章节的terraform_hw_demo目录中创建。
   ```
   cp ../terraform_hw_demo/init.tf .
   ```
   
 
#### 步骤二：创建配置文件
以下所有配置文件均在项目目录下创建。
1. 查询可用区。 创建az.tf文件，查询指定region下所有的可用区信息，用于后续创建CCE Turbo集群相关资源。
   ```
   # 获取指定region（region参数缺省时默认继承当前provider块中所指定的region）下所有的可用区信息，用于创建Turbo集群相关资源
   data "huaweicloud_availability_zones" "test" {}
   ```
   
2. （可选）如需自定义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）。
   
3. 创建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。      |
      
   
4. 创建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 | 子网可用区。未提供时使用查询到的第一个可用区。       |
      
   
5. 创建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 | 子网可用区。未提供时使用查询到的第一个可用区。                   |
      
   ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
   ENI子网与普通VPC子网属于同一VPC下的不同子网，网段不能重叠。
   
6. 创建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                   | 集群标签。                                                                                                         |
      
   ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
   container_network_type参数决定了创建的集群类型和所需的网络资源。选择eni时需创建ENI子网，选择overlay_l2或vpc-router时无需创建ENI子网。
   
7. 配置资源参数。以下为示例配置，请根据实际业务需求修改参数值。 创建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配置
1. 初始化环境。
   ```
   terraform init
   ```
   
2. 查看执行计划，确认资源变更是否符合预期。
   ```
   terraform plan
   ```
   
3. 计划确认无误后，创建资源。执行时Terraform会向用户确认，输入yes确认执行。
   ```
   terraform apply
   ```
   
4. 查看已创建的资源。
   ```
   terraform show
   ```
   
 
#### 步骤四：清理资源
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/caution_3.0-zh-cn.png)
此操作将永久删除通过Terraform创建的所有资源（包括VPC、子网和CCE集群），请确认资源中无重要业务数据后再执行。
当不再需要通过Terraform创建的资源时，可以执行以下命令释放资源。
```
terraform destroy
```
执行时Terraform会向用户确认，输入yes确认执行。
![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002686065009.png "点击放大")
#### 相关文档
- 如需了解Terraform的安装和华为云Provider的配置，请参见[安装Terraform并配置华为云Provider](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_100712.html)。
- 如需了解CCE集群规格和选型建议，请参见[CCE集群选型建议](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_10016.html)。
 
