
# 使用Terraform安装AutoScaler插件
CCE集群弹性引擎插件（AutoScaler）是实现节点自动扩缩容的核心组件，配合节点池可以在业务流量上涨时自动扩容节点，在资源空闲时自动缩容节点。通过Terraform自动化部署插件，可以将插件安装纳入基础设施即代码的管理体系，实现多环境批量部署和版本统一管控。
本文以安装AutoScaler插件为例，介绍如何使用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_addon
   cd ./terraform_cce_addon
   ```
   
2. 将已准备好的Provider配置文件复制到当前目录。init.tf已在"安装Terraform并配置华为云Provider"章节的terraform_hw_demo目录中创建。
   ```
   cp ../terraform_hw_demo/init.tf .
   ```
   
 
#### 步骤二：创建配置文件
以下所有配置文件均在项目目录下创建：
1. 查询CCE集群ID。 创建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. 查询项目信息。 创建data_project.tf文件，查询指定区域下的IAM项目信息，用于插件配置中的tenant_id参数。
   ```
   variable "project_id" {
     description = "项目ID"
     type        = string
     default     = ""
   }
   variable "region_name" {
     description = "区域名称"
     type        = string
   }
   # 获取指定region（region参数缺省时默认继承当前provider块中所指定的region）下符合条件的IAM项目信息，用于创建插件相关资源
   data "huaweicloud_identity_projects" "test" {
     name = var.region_name
   }
   ```
   涉及参数说明如下表所示。
   
   | 参数   | 说明    |
   |:---|:---|
   | name | 局点名称。 |
      
   
3. 获取插件模板。 创建data_addon.tf文件，查询CCE插件模板信息，获取插件的默认配置参数。
   ```
   variable "addon_template_name" {
     description = "CCE插件模板的名称"
     type        = string
     default     = "autoscaler"
   }
   variable "addon_version" {
     description = "CCE插件模板的版本"
     type        = string
   }
   # 获取指定region（region参数缺省时默认继承当前provider块中所指定的region）下符合条件的CCE插件模板信息，用于创建插件相关资源
   data "huaweicloud_cce_addon_template" "test" {
     cluster_id = data.huaweicloud_cce_cluster.cluster.id
     name       = var.addon_template_name
     version    = var.addon_version
   }
   ```
   涉及参数说明如下表所示。
   
   | 参数         | 说明                              |
   |:---|:---|
   | cluster_id | CCE集群ID，从步骤1的查询结果中获取。           |
   | name       | 待安装的插件名称，默认为autoscaler。         |
   | version    | 待安装的插件版本，可在CCE控制台插件中心页面查询可用版本号。 |
      
   
4. 配置插件参数。 创建addon_config.tf文件，解析插件模板的默认配置，并补充cluster_id和tenant_id字段。
   ```
   # 本地变量，用于解析和合并插件模板的配置
   locals {
     # 解析插件模板中的custom配置
     original_custom = jsondecode(data.huaweicloud_cce_addon_template.test.spec).parameters.custom
     # 合并custom配置，添加cluster_id和tenant_id字段，保留其他字段
     merged_custom = jsonencode({
       # 与模板相比，需要在custom中添加的字段：cluster_id和tenant_id
       cluster_id                         = data.huaweicloud_cce_cluster.cluster.id
       tenant_id                          = var.project_id != "" ? var.project_id : try(data.huaweicloud_identity_projects.test.projects[0].id, "")
       # 其余custom字段的值全部保留
       annotations                        = local.original_custom.annotations
       coresTotal                         = local.original_custom.coresTotal
       expander                           = local.original_custom.expander
       ignoreDaemonSetsUtilization        = local.original_custom.ignoreDaemonSetsUtilization
       ignoreLocalVolumeNodeAffinity      = local.original_custom.ignoreLocalVolumeNodeAffinity
       initialNodeGroupBackoffDuration    = local.original_custom.initialNodeGroupBackoffDuration
       logLevel                           = local.original_custom.logLevel
       maxEmptyBulkDeleteFlag             = local.original_custom.maxEmptyBulkDeleteFlag
       maxNodeGroupBackoffDuration        = local.original_custom.maxNodeGroupBackoffDuration
       maxNodeGroupBinPackingDuration     = local.original_custom.maxNodeGroupBinPackingDuration
       maxNodeProvisionTime               = local.original_custom.maxNodeProvisionTime
       maxNodesTotal                      = local.original_custom.maxNodesTotal
       memoryTotal                        = local.original_custom.memoryTotal
       multiAZBalance                     = local.original_custom.multiAZBalance
       multiAZEnabled                     = local.original_custom.multiAZEnabled
       newEphemeralVolumesPodScaleUpDelay = local.original_custom.newEphemeralVolumesPodScaleUpDelay
       node_match_expressions             = local.original_custom.node_match_expressions
       podDisruptionBudget                = local.original_custom.podDisruptionBudget
       resetUnNeededWhenScaleUp           = local.original_custom.resetUnNeededWhenScaleUp
       scaleDownDelayAfterAdd             = local.original_custom.scaleDownDelayAfterAdd
       scaleDownDelayAfterDelete          = local.original_custom.scaleDownDelayAfterDelete
       scaleDownDelayAfterFailure         = local.original_custom.scaleDownDelayAfterFailure
       scaleDownEnabled                   = local.original_custom.scaleDownEnabled
       scaleDownUnneededTime              = local.original_custom.scaleDownUnneededTime
       scaleDownUtilizationThreshold      = local.original_custom.scaleDownUtilizationThreshold
       scaleUpCpuUtilizationThreshold     = local.original_custom.scaleUpCpuUtilizationThreshold
       scaleUpMemUtilizationThreshold     = local.original_custom.scaleUpMemUtilizationThreshold
       scaleUpUnscheduledPodEnabled       = local.original_custom.scaleUpUnscheduledPodEnabled
       scaleUpUtilizationEnabled          = local.original_custom.scaleUpUtilizationEnabled
       scanInterval                       = local.original_custom.scanInterval
       skipNodesWithCustomControllerPods  = local.original_custom.skipNodesWithCustomControllerPods
       tolerations                        = local.original_custom.tolerations
       unremovableNodeRecheckTimeout      = local.original_custom.unremovableNodeRecheckTimeout
     })
   }
   ```
   涉及参数说明如下表所示。
   
   | 参数              | 说明                                            |
   |:---|:---|
   | original_custom | 从插件模板中解析出的原始custom配置。                         |
   | merged_custom   | 合并后的custom配置，在原始配置基础上补充了cluster_id和tenant_id。 |
      
   ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
   tenant_id优先使用project_id变量的值，若未配置则自动从项目查询结果中获取。
   
5. 创建插件安装资源。 创建addon.tf文件，声明CCE插件安装资源。
   ```
   resource "huaweicloud_cce_addon" "test" {
     cluster_id    = data.huaweicloud_cce_cluster.cluster.id
     template_name = var.addon_template_name
     version       = var.addon_version
     values {
       basic_json  = jsonencode(jsondecode(data.huaweicloud_cce_addon_template.test.spec).parameters.custom)
       custom_json = local.merged_custom
       flavor_json = jsonencode(jsondecode(data.huaweicloud_cce_addon_template.test.spec).parameters.flavor1)
     }
   }
   ```
   涉及参数说明如下表所示。
   
   | 参数            | 说明                    |
   |:---|:---|
   | cluster_id    | 待安装插件的CCE集群ID。        |
   | template_name | 待安装的CCE插件名称。          |
   | version       | 待安装的CCE插件版本。          |
   | basic_json    | 插件的基础配置，从插件模板中获取。     |
   | custom_json   | 插件的自定义配置，即步骤4中合并后的配置。 |
   | flavor_json   | 插件的规格配置，从插件模板中获取。     |
      
   
6. 配置资源参数。 创建terraform.tfvars文件，预设资源所需的入参。以下为示例配置，请根据实际业务需求修改。
   ```
   cluster_name  = "devops-turbo"
   addon_version = "1.25.200"
   region_name   = "cn-north-4"
   availability_zone   = "cn-north-7c"           # 请替换为实际可用区
   ```
   涉及参数说明如下表所示。
   
   | 参数                | 说明                          |
   |:---|:---|
   | cluster_name      | 已创建的CCE集群名称。                |
   | addon_version     | 插件版本，可在CCE控制台插件中心页面查询可用版本号。 |
   | region_name       | 局点名称。                       |
   | availability_zone | 节点所在可用区，请替换为实际局点的可用区。       |
      
   
7. （可选）如需自定义endpoint，创建endpoints.tf。
   ```
   provider "huaweicloud" {
     region     = "cn-north-**"
     insecure  = true  # 跳过SSL证书验证
     endpoints = {
       cce = "https://cce.{region}.myhuaweicloud.com"
     }
   }
   ```
   将{region}替换为实际Region（如cn-north-7c）。
   
 
#### 步骤三：初始化并应用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)
此操作将卸载CCE集群中的AutoScaler插件，卸载后集群将失去节点自动扩缩容能力，请确认不再需要后再执行。
当不再需要通过Terraform创建的资源时，可以执行以下命令释放资源。
```
terraform destroy
```
执行时Terraform会向用户确认，输入yes确认执行。
![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002655825578.png "点击放大")
#### 相关文档
- 如需了解Terraform的安装和华为云Provider的配置，请参见[安装Terraform并配置华为云Provider](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_100712.html)。
- 如需了解CCE集群弹性引擎插件的更多信息，请参见[CCE集群弹性引擎](https://support.huaweicloud.com/usermanual-cce/cce_10_0154.html)。
- 如需通过Terraform创建CCE集群，请参见[使用Terraform创建CCE集群](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_100714.html)。
- 如需通过Terraform开启节点池自动伸缩，请参见[使用Terraform开启节点池自动伸缩](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_100716.html)。
 
