使用Terraform创建具备自动伸缩功能的节点池

ACK的节点池及托管节点池中的节点默认不具备自动伸缩能力,您也可以通过使用Terraform工具创建开启自动伸缩功能的节点池。本文介绍如何通过Terraform创建开启自动伸缩功能的节点池。

前提条件

  • 已安装Terraform工具。具体操作,请参见在本地安装和配置Terraform

  • 自动伸缩功能依赖弹性伸缩(Auto Scaling,旧称ESS)服务。启动节点自动伸缩前,您需要开通弹性伸缩服务,并完成默认角色授权。具体操作,请参见开通弹性伸缩服务

    说明

    如果您之前已经使用了alicloud_cs_kubernetes_autoscaler组件,默认已开通弹性伸缩服务。

  • 在RAM控制台,为当前集群添加弹性伸缩服务的授权策略。关于如何授权的详细信息,请参见授权

  • 已为系统运维管理 OOS(CloudOps Orchestration Service)服务授权。您可以通过创建AliyunOOSLifecycleHook4CSRole角色,为OOS服务授权。

    1. 单击AliyunOOSLifecycleHook4CSRole

      说明
      • 如果当前账号是阿里云账号,单击AliyunOOSLifecycleHook4CSRole即可授权。

      • 如果当前账号是RAM用户,请先确保对应的阿里云账号已授权AliyunOOSLifecycleHook4CSRole,并为RAM用户授予AliyunRAMReadOnlyAccess系统策略。具体操作,请参见为RAM用户授权

    2. 云资源访问授权页面,单击同意授权

  • 配置阿里云账号信息。

    执行如下命令,创建环境变量,用于存放身份认证信息。

    • Linux 环境

      export ALICLOUD_ACCESS_KEY="************"   #替换为阿里云账号的AK信息。
      export ALICLOUD_SECRET_KEY="************"   #替换为阿里云账号的SK信息。
      export ALICLOUD_REGION="cn-beijing"         #替换为您集群所在的地域。
    • Windows 环境

      set ALICLOUD_ACCESS_KEY="************"   #替换为阿里云账号的AK信息。
      set ALICLOUD_SECRET_KEY="************"   #替换为阿里云账号的SK信息。
      set ALICLOUD_REGION="cn-beijing"         #替换为您集群所在的地域。
    说明

    为提高权限管理的灵活性和安全性,建议您创建名为Terraform的RAM用户,并为该RAM用户创建AccessKey和授权。具体操作,请参见创建RAM用户为RAM用户授权

背景信息

Terraform是一种开源工具,通过Provider来支持新的基础架构,用于安全高效地预览、配置和管理云基础架构和资源。更多信息,请参见什么是Terraform

Alibaba Cloud Provider的老版本中,ACK提供了一个名为alicloud_cs_kubernetes_autoscaler的组件。alicloud_cs_kubernetes_autoscaler组件可以实现节点的弹性伸缩,但是其能力受限:

  • 配置复杂,使用成本高。

  • 伸缩的节点都会被放置到默认节点池,自动伸缩的节点未单独维护。

  • 部分配置参数不可更改。

Alibaba Terraform Provider从1.111.0版本开始可通过组件alicloud_cs_kubernetes_node_pool创建开启自动伸缩功能的节点池,优势如下:

  • 配置简单,您只需要配置伸缩组内节点数的上下限。

  • 针对非必须配置,ACK使用默认值的配置,以防误操作带来的基础环境不一致的问题,例如:操作系统镜像。

  • 在ACK控制台中可以直观地观察节点池内节点的变化。

使用Terraform创建开启自动伸缩功能的节点池

如果您的集群之前已经使用alicloud_cs_kubernetes_autoscaler组件,在完成上述为当前集群添加弹性伸缩服务授权后,您需要执行以下步骤平滑切换alicloud_cs_kubernetes_autoscaler至alicloud_cs_kubernetes_node_pool,以创建开启自动伸缩功能的节点池。

说明

如果您未在集群中使用alicloud_cs_kubernetes_autoscaler组件,则跳过以下步骤1和步骤2,请直接进行步骤3的操作。

  1. 修改集群的autoscaler-meta配置项。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择配置管理 > 配置项

    3. 配置项页面左上角的命名空间下拉框中,选择kube-system,然后在autoscaler-meta配置项右侧操作列下,单击编辑

    4. 编辑面板中,修改autoscaler-meta配置项的值。

      您需将taints值的String类型改成数组类型,即在文本框中,修改"taints":"""taints":[]

    5. 单击确定

  2. 同步节点池。

    1. 在集群管理页左侧导航栏,选择节点管理 > 节点池

    2. 节点池页面右上方,单击同步节点池

如果您未在集群中使用alicloud_cs_kubernetes_autoscaler组件,请直接进行以下操作。

  1. 使用Terraform创建开启自动伸缩功能的节点池。

    1. 创建节点池的配置文件。

      • 在已有集群中创建开启自动伸缩功能的节点池,配置示例如下。

        展开查看配置示例

        provider "alicloud" {
        }
        # 为已有集群创建开启自动伸缩功能的节点池。
        resource "alicloud_cs_kubernetes_node_pool" "at1" {
          # 目标集群ID。
          cluster_id           = ""
          name                 = "np-test"
          # 节点池内节点使用的vswitch,至少提供一个。
          vswitch_ids          = ["vsw-bp1mdigyhmilu2h4v****"]
          instance_types       = ["ecs.e3.medium"]
          password             = "Hello1234"
         
          scaling_config {
            # 最小节点数。
            min_size     = 1
            # 最大节点数。
            max_size     = 5
          }
        
        }
      • 如果未创建集群,创建节点池的配置示例如下,需要先创建集群,然后才能创建节点池。

        展开查看配置示例

        provider "alicloud" {
        }
        
        variable "name" {
          default    = "tf-test"
        }
        
        data "alicloud_zones" default {
          available_resource_creation  = "VSwitch"
        }
        data "alicloud_instance_types" "default" {
          availability_zone            = data.alicloud_zones.default.zones.0.id
          cpu_core_count               = 2
          memory_size                  = 4
          kubernetes_node_role         = "Worker"
        }
        
        resource "alicloud_vpc" "default" {
          name                         = var.name
          cidr_block                   = "10.1.0.0/21"
        }
        resource "alicloud_vswitch" "default" {
          name                         = var.name
          vpc_id                       = alicloud_vpc.default.id
          cidr_block                   = "10.1.1.0/24"
          availability_zone            = data.alicloud_zones.default.zones.0.id
        }
        resource "alicloud_key_pair" "default" {
          key_name                     = var.name
        }
        
        # 创建托管版集群。
        resource "alicloud_cs_managed_kubernetes" "default" {
          name                         = var.name
          count                        = 1
          cluster_spec                 = "ack.pro.small"
          is_enterprise_security_group = true
          worker_number                = 2
          password                     = "Hello1234"
          pod_cidr                     = "172.20.0.0/16"
          service_cidr                 = "172.21.0.0/20"
          worker_vswitch_ids           = [alicloud_vswitch.default.id]
          worker_instance_types        = [data.alicloud_instance_types.default.instance_types.0.id]
        }
        
        # 为集群创建一个开启自动伸缩功能的节点池。
        resource "alicloud_cs_kubernetes_node_pool" "at1" {
          cluster_id                   = alicloud_cs_managed_kubernetes.default.0.id
          name                         = var.name
          vswitch_ids                  = [alicloud_vswitch.default.id]
          instance_types               = [data.alicloud_instance_types.default.instance_types.0.id]
          key_name                     = alicloud_key_pair.default.key_name
         
          scaling_config {
            min_size     = 1
            max_size     = 5
          }
        
        }

    2. 执行terraform apply命令完成创建。

    完成创建节点池后,在节点池列表中可以看到新建的节点池,该节点池名称下会标注已开启自动伸缩nodepool