
# 使用Terraform开启节点池自动伸缩
在业务运行中，流量上涨可能导致集群计算资源紧张，手动扩容节点响应慢且容易遗漏。CCE具备集群节点自动扩缩容能力，结合节点池可以实现节点的自动扩缩容，在资源不足时自动扩容节点，在资源空闲时自动缩容节点，提高资源利用率并降低运维成本。
本文介绍如何通过Terraform在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)。
- 已创建CCE集群。
 
#### 操作步骤
#### 步骤一：创建项目目录并初始化配置
1. 创建弹性伸缩管理目录（目录名可自定义）。
   ```
   mkdir terraform_cce_autoscale
   cd ./terraform_cce_autoscale
   ```
   
2. 将已准备好的Provider配置文件复制到当前目录。init.tf已在"安装Terraform并配置华为云Provider"章节的terraform_hw_demo目录中创建。
   ```
   cp ../terraform_hw_demo/init.tf .
   ```
   
 
#### 步骤二：创建配置文件
以下所有配置文件均在项目目录下创建：
1. 查询CCE集群信息。 创建data_cce_cluster.tf文件，通过集群名称查询集群ID，用于后续创建节点池时指定所属集群。
   ```
   variable "cluster_name" {
     description = "CCE集群名称"
     type        = string
   }
   data "huaweicloud_cce_cluster" "cluster" {
     name   = var.cluster_name
     status = "Available"
   }
   ```
   涉及参数说明如下表所示。
   
   | 参数     | 说明                          |
   |:---|:---|
   | name   | CCE集群名称，需与已创建的集群名称一致。       |
   | status | 集群状态，Available表示仅查询可用状态的集群。 |
      
   
2. 创建节点池并开启自动扩缩容。 创建node_pool_with_scale.tf文件，创建CCE节点池并开启自动扩缩容，同时配置扩展伸缩组以支持多规格节点弹性伸缩。
   ```
   variable "node_pool_name" {
     description = "节点池名称"
     type        = string
   }
   variable "node_pool_os_type" {
     description = "节点操作系统"
     type        = string
     default     = "Huawei Cloud EulerOS 2.0"
   }
   variable "node_pool_password" {
     description = "节点登录密码"
     type        = string
   }
   variable "node_pool_initial_node_count" {
     description = "节点池初始节点数量"
     type        = number
     default     = 2
   }
   variable "availability_zone" {
     description = "节点所在可用区"
     type        = string
     default     = "cn-north-4a"
   }
   variable "scale_down_cooldown_time" {
     description = "缩容冷却时间，单位分钟"
     type        = number
     default     = 10
   }
   variable "node_pool_priority" {
     description = "节点池优先级"
     type        = number
     default     = 1
   }
   variable "root_volume_type" {
     description = "系统盘类型"
     type        = string
     default     = "SSD"
   }
   variable "root_volume_size" {
     description = "系统盘大小，单位GB"
     type        = number
     default     = 50
   }
   variable "data_volume_type" {
     description = "数据盘类型"
     type        = string
     default     = "SSD"
   }
   variable "data_volume_size" {
     description = "数据盘大小，单位GB"
     type        = number
     default     = 100
   }
   resource "huaweicloud_cce_node_pool" "node_pool" {
     cluster_id               = data.huaweicloud_cce_cluster.cluster.id
     name                     = var.node_pool_name
     os                       = var.node_pool_os_type
     initial_node_count       = var.node_pool_initial_node_count
     flavor_id                = "c9.large.2"
     availability_zone        = var.availability_zone
     password                 = var.node_pool_password
     scale_enable             = true
     scale_down_cooldown_time = var.scale_down_cooldown_time
     priority                 = var.node_pool_priority
     type                     = "vm"
     root_volume {
       size       = var.root_volume_size
       volumetype = var.root_volume_type
     }
     data_volumes {
       size       = var.data_volume_size
       volumetype = var.data_volume_type
     }
     extension_scale_groups {
       metadata {
         name = "group1"
       }
       spec {
         flavor = "c9.xlarge.2"
         az     = var.availability_zone
         autoscaling {
           extension_priority = 1
           enable             = true
         }
       }
     }
     extension_scale_groups {
       metadata {
         name = "group2"
       }
       spec {
         flavor = "c9.2xlarge.2"
         az     = var.availability_zone
         autoscaling {
           extension_priority = 1
           enable             = true
         }
       }
     }
   }
   ```
   涉及参数说明如下表所示。
   
   | 参数                       | 说明                                  |
   |:---|:---|
   | cluster_id               | CCE集群ID，从步骤1的查询结果中获取。               |
   | name                     | 节点池名称。                              |
   | os                       | 节点操作系统，默认为Huawei Cloud EulerOS 2.0。 |
   | initial_node_count       | 节点池初始节点数量，默认为2。                     |
   | flavor_id                | 节点规格，示例为c9.large.2。                 |
   | availability_zone        | 节点所在可用区，请替换为实际局点的可用区。               |
   | password                 | 节点登录密码。                             |
   | scale_enable             | 是否开启自动扩缩容，true表示开启。                 |
   | scale_down_cooldown_time | 缩容冷却时间，单位分钟，默认10分钟。                 |
   | priority                 | 节点池优先级，数值越小优先级越高。                   |
   | type                     | 节点类型，vm表示虚拟机。                       |
   | root_volume.size         | 系统盘大小，单位GB。                         |
   | root_volume.volumetype   | 系统盘类型。取值：SSD、GPSSD、ESSD等。           |
   | data_volumes.size        | 数据盘大小，单位GB。                         |
   | data_volumes.volumetype  | 数据盘类型。                              |
   | extension_scale_groups   | 扩展伸缩组，支持配置多规格节点。                    |
      
   ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
   - flavor_id和availability_zone为示例值，请根据实际局点和业务需求替换。创建节点将产生ECS费用，请根据业务需求选择合适的节点规格。
   
   - **扩展伸缩组**（extension_scale_groups）：支持在同一节点池中配置多种规格的节点，当某一规格资源不足时自动使用下一规格创建节点，提高扩容成功率。示例中配置了3种规格：默认规格c9.large.2、扩展规格c9.xlarge.2和c9.2xlarge.2。
     
3. 配置资源参数。 创建terraform.tfvars文件，预设资源所需的入参。以下为示例配置，请根据实际业务需求修改。
   ```
   cluster_name       = "cluster-xxx"
   node_pool_name     = "tf-node-pool"
   node_pool_password = "*******"
   availability_zone   = "cn-north-7c"           # 请替换为实际可用区
   ```
   涉及参数说明如下表所示。
   
   | 参数                 | 说明                     |
   |:---|:---|
   | cluster_name       | 已创建的CCE集群名称。           |
   | node_pool_name     | 节点池名称。                 |
   | node_pool_password | 节点登录密码，请设置为符合复杂度要求的密码。 |
   | availability_zone  | 节点所在可用区，请替换为实际局点的可用区。  |
      
   
4. （可选）如需自定义endpoint，创建endpoints.tf。
   ```
   provider "huaweicloud" {
     insecure  = true  # 跳过SSL证书验证
     endpoints = {
       cce = "https://cce.{region}.myhuaweicloud.com"
     }
   }
   ```
   将{region}替换为实际Region（如cn-north-7c）。
   
#### 步骤三：初始化并应用Terraform配置
1. 初始化环境，下载所需的Provider插件。
   ```
   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创建的节点池和节点，请确认资源中无重要业务数据后再执行。清理节点池前需先释放节点池中的节点。
当不再需要通过Terraform创建的资源时，可以执行以下命令释放资源。
```
terraform destroy
```
执行时Terraform会向用户确认，输入yes确认执行。
![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002685905197.png "点击放大")
#### 相关文档
- 如需了解Terraform的安装和华为云Provider的配置，请参见[安装Terraform并配置华为云Provider](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_100712.html)。
 
- 如需了解CCE节点池自动伸缩的更多信息，请参见 [节点伸缩原理](https://support.huaweicloud.com/usermanual-cce/cce_10_0296.html)。
- 如需通过Terraform安装AutoScaler插件，请参见[使用Terraform安装AutoScaler插件](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_100717.html)。
- 如需通过Terraform创建节点池并加入服务器组，请参见[使用Terraform创建节点池并加入服务器组](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_100715.html)。
 
