
# 使用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_nodepool
   cd ./terraform_cce_nodepool
   ```
   
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. 创建云服务器组。 创建server_group.tf文件，创建云服务器组并配置反亲和策略，使组内的云服务器调度到不同物理机。
   ```
   variable "ecs_group_name" {
     description = "云服务器组名称"
     type        = string
   }
   variable "ecs_group_policies" {
     description = "云服务器组策略"
     type        = list(string)
     default     = ["anti-affinity"]
   }
   resource "huaweicloud_compute_servergroup" "test-sg" {
     name     = var.ecs_group_name
     policies = var.ecs_group_policies
   }
   ```
   涉及参数说明如下表所示。
   
   | 参数       | 说明                                                                       |
   |:---|:---|
   | name     | 云服务器组名称。                                                                 |
   | policies | 服务器组策略。取值：anti-affinity（反亲和，组内云服务器调度到不同物理机）、affinity（亲和，组内云服务器调度到同一物理机）。 |
      
   
3. 创建节点池并加入服务器组。 创建node_pool_with_sg.tf文件，创建CCE节点池并关联步骤2中创建的云服务器组，同时开启自动扩缩容。
   ```
   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 "root_volume_type" {
     description = "根卷的类型"
     type        = string
     default     = "SSD"
   }
   variable "root_volume_size" {
     description = "根卷的大小"
     type        = number
     default     = 50
   }
   variable "data_volume_type" {
     description = "数据盘的类型"
     type        = string
     default     = "SSD"
   }
   variable "data_volume_size" {
     description = "数据盘的大小"
     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
     ecs_group_id             = huaweicloud_compute_servergroup.test-sg.id
     scall_enable             = true
     scale_down_cooldown_time = 100
     priority                 = 1
     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
     }
   }
   ```
   涉及参数说明如下表所示。具体值请根据实际局点和业务需求替换。
   
   | 参数                       | 说明                                  |
   |:---|:---|
   | cluster_id               | CCE集群ID，从步骤1的查询结果中获取。               |
   | name                     | 节点池名称。                              |
   | os                       | 节点操作系统，默认为Huawei Cloud EulerOS 2.0。 |
   | initial_node_count       | 节点池初始节点数量，默认为2。                     |
   | flavor_id                | 节点规格，示例为c9.large.2。                 |
   | availability_zone        | 节点所在可用区，请替换为实际局点的可用区。               |
   | password                 | 节点登录密码。                             |
   | ecs_group_id             | 云服务器组ID，即步骤2中创建的云服务器组ID。            |
   | scale_enable             | 是否开启自动扩缩容，true表示开启。                 |
   | scale_down_cooldown_time | 缩容冷却时间，单位秒。                         |
   | priority                 | 节点池优先级，数值越小优先级越高。                   |
   | type                     | 节点类型，vm表示虚拟机。                       |
   | root_volume.size         | 系统盘大小，单位GB。                         |
   | root_volume.volumetype   | 系统盘类型。取值：SSD、GPSSD、ESSD等。           |
   | data_volumes.size        | 数据盘大小，单位GB。                         |
   | data_volumes.volumetype  | 数据盘类型。                              |
      
   
4. 配置资源参数。 创建terraform.tfvars文件，预设资源所需的入参。以下为示例配置，请根据实际业务需求修改。
   ```
   cluster_name       = "cluster-xxx"
   ecs_group_name     = "ecs-group-xxx" 
   node_pool_name     = "tf-node-pool"
   node_pool_password = "*******"
   availability_zone   = "cn-north-7c"           # 请替换为实际可用区
   ```
   涉及参数说明如下表所示。
   
   | 参数                 | 说明                     |
   |:---|:---|
   | cluster_name       | 已创建的CCE集群名称。           |
   | ecs_group_name     | 云服务器组名称，用于创建反亲和服务器组。   |
   | node_pool_name     | 节点池名称。                 |
   | node_pool_password | 节点登录密码，请设置为符合复杂度要求的密码。 |
   | availability_zone  | 节点所在可用区，请替换为实际局点的可用区。  |
      
   
5. （可选）如需自定义endpoint，创建endpoints.tf。
   ```
   provider "huaweicloud" {
     insecure  = true  # 跳过SSL证书验证
     endpoints = {
       ecs = "https://ecs.{region}.myhuaweicloud.com"
       cce = "https://cce.{region}.myhuaweicloud.com"
     }
   }
   ```
   将{region}替换为实际Region（如cn-north-7c）。
   
 
#### 步骤三：初始化并应用Terraform配置
1. 初始化环境。
   ```
   terraform init
   ```
   
2. 查看执行计划，确认资源变更是否符合预期。
   ```
   terraform plan
   ```
   
3. 计划确认无误后，创建资源。执行时Terraform会向用户确认，输入yes确认执行。
   ```
   terraform apply
   ```
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002654462360.png)
   
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_0000002655985500.png "点击放大")
#### 相关文档
- 如需了解云服务器组的更多信息，请参见[云服务器组](https://support.huaweicloud.com/usermanual-ecs/ecs_03_0150.html)。
- 如需了解CCE节点池的更多信息，请参见[节点池概述](https://support.huaweicloud.com/usermanual-cce/cce_10_0081.html)。
- 如需了解CCE节点规格，请参见[节点规格说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0719.html)。
- 如需通过Terraform开启节点池自动伸缩，请参见[使用Terraform开启节点池自动伸缩](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_100716.html)。
 
