Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Create an auto-scaling node pool with Terraform

Última atualização: Sep 21, 2026

Configure scaling_config em alicloud_cs_kubernetes_node_pool para dimensionar os nós do ACK sob demanda.

Execute estes exemplos no Terraform Explorer .
Aviso

Os recursos criados aqui geram custos. Exclua-os com terraform destroy ao terminar.

Pré-requisitos

Certifique-se de que você possui:

  • O serviço Auto Scaling está ativado com a função padrão atribuída.

    Se você usou o componente alicloud_cs_kubernetes_autoscaler anteriormente, o serviço Auto Scaling já está ativado.
  • A função AliyunOOSLifecycleHook4CSRole está criada para acesso ao CloudOps Orchestration Service (OOS):

    1. Clique em AliyunOOSLifecycleHook4CSRole para abrir a página RAM Quick Authorization.

      Nota
      • Para contas Alibaba Cloud: clique diretamente no link.

      • Para usuários RAM: a sua conta Alibaba Cloud deve ter a função AliyunOOSLifecycleHook4CSRole. Anexe a política AliyunRAMReadOnlyAccess ao usuário RAM. Consulte Grant permissions to a RAM user.

    2. Na página RAM Quick Authorization, clique em Authorize.

  • Um ambiente de execução do Terraform configurado com uma destas opções:

    Opção

    Ideal para

    Terraform Explorer

    Testes rápidos sem instalação local

    Cloud Shell

    Terraform com credenciais pré-configuradas

    Local machine

    Redes instáveis ou ambientes de desenvolvimento personalizados

Contexto

O Alibaba Cloud Provider 1.111.0 introduziu o recurso alicloud_cs_kubernetes_node_pool para gerenciar pools de nós com dimensionamento automático. Ele substitui o componente mais antigo alicloud_cs_kubernetes_autoscaler, que apresentava três limitações:

  • Configuração complexa com alta sobrecarga operacional.

  • Os nós dimensionados eram adicionados ao pool de nós padrão e não podiam ser gerenciados separadamente.

  • Não era possível modificar certos parâmetros após a criação.

O recurso alicloud_cs_kubernetes_node_pool resolve esses três problemas:

  • O dimensionamento automático requer apenas dois parâmetros: min_size e max_size.

  • Cada pool de nós tem gerenciamento independente e é visível no console do ACK.

  • Os parâmetros opcionais usam padrões seguros para evitar divergências de ambiente entre os nós.

Recursos do Terraform

Recurso

Função

alicloud_instance_types

Consulta os tipos de instância do Elastic Compute Service (ECS) que atendem às condições especificadas

alicloud_vpc

Cria uma VPC

alicloud_vswitch

Cria vSwitches em uma VPC

alicloud_cs_managed_kubernetes

Cria um cluster gerenciado do ACK

alicloud_cs_kubernetes_node_pool

Cria um pool de nós para um cluster gerenciado do ACK

Recurso

Finalidade

alicloud_instance_types

Consulta os tipos de instância disponíveis do Elastic Compute Service (ECS)

alicloud_vpc

Cria uma VPC

alicloud_vswitch

Cria vSwitches (sub-redes) na VPC

alicloud_cs_managed_kubernetes

Cria um cluster gerenciado do ACK

alicloud_cs_kubernetes_node_pool

Cria um pool de nós com dimensionamento automático

Gere parâmetros do Terraform a partir do console do ACK

Se estes exemplos não cobrirem sua configuração, gere os parâmetros exatos do Terraform a partir do console do ACK.

  1. Acesse o console do ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Clique no nome do cluster de destino. No painel de navegação à esquerda, escolha Nodes > Node Pools.

  3. Clique em Create Node Pool, configure os parâmetros e clique em Confirm. Na caixa de diálogo, clique em Console-to-Code.

  4. No painel Console-to-Code, clique na aba Terraform. O bloco de código mostra os parâmetros do seu pool de nós. Clique em def60920129c15b1257006a07a2b4da4 para usá-lo.

Crie um pool de nós com dimensionamento automático ativado

Escolha o procedimento adequado à sua situação.

Se você usou o alicloud_cs_kubernetes_autoscaler anteriormente

Migre para o alicloud_cs_kubernetes_node_pool:

Etapa 1: Modifique o ConfigMap autoscaler-meta

  1. Acesse o console do ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Clique no nome do cluster de destino. No painel de navegação à esquerda, escolha Configurations > ConfigMaps.

  3. Na página ConfigMap, selecione kube-system na lista suspensa Namespace. Encontre autoscaler-meta e clique em Edit na coluna Actions.

  4. No painel Edit, altere o valor de taints de "taints":"" para "taints":[] na caixa de texto Value.

  5. Clique em OK.

Etapa 2: Sincronize o pool de nós

  1. No painel de navegação à esquerda, escolha Nodes > Node Pools.

  2. Na página Node Pools, clique em Sync Node Pool.

Se você não usou o alicloud_cs_kubernetes_autoscaler anteriormente

Os exemplos abaixo usam scaling_config para definir os limites de nós.

Adicione um pool de nós com dimensionamento automático a um cluster existente

Se você já tem um cluster ACK, adicione um pool de nós com esta configuração mínima:

provider "alicloud" {
}

# Add an auto-scaling node pool to an existing ACK cluster.
resource "alicloud_cs_kubernetes_node_pool" "at1" {
  # The ID of the existing ACK cluster.
  cluster_id     = ""
  name           = "np-test"
  # Specify at least one vSwitch for the node pool.
  vswitch_ids    = ["vsw-bp1mdigyhmilu2h4v****"]
  instance_types = ["ecs.e3.medium"]
  password       = "Hello1234"

  scaling_config {
    min_size = 1  # Minimum node count
    max_size = 5  # Maximum node count
  }
}

Crie um cluster e um pool de nós com dimensionamento automático simultaneamente

Provisione uma VPC, um cluster ACK Pro e um pool de nós com dimensionamento automático em um único terraform apply:

provider "alicloud" {
  region = var.region_id
}

variable "region_id" {
  type    = string
  default = "cn-shenzhen"
}

variable "cluster_spec" {
  type        = string
  description = "The cluster specifications of kubernetes cluster,which can be empty. Valid values:ack.standard : Standard managed clusters; ack.pro.small : Professional managed clusters."
  default     = "ack.pro.small"
}

# Specify the zones of vSwitches.
variable "availability_zone" {
  description = "The availability zones of vswitches."
  default     = ["cn-shenzhen-c", "cn-shenzhen-e", "cn-shenzhen-f"]
}

# The CIDR blocks used to create vSwitches.
variable "node_vswitch_cidrs" {
  type        = list(string)
  default     = ["172.16.0.0/23", "172.16.2.0/23", "172.16.4.0/23"]
}

# This variable specifies the CIDR blocks in which Terway vSwitches are created.
variable "terway_vswitch_cidrs" {
  type        = list(string)
  default     = ["172.16.208.0/20", "172.16.224.0/20", "172.16.240.0/20"]
}

# Specify the ECS instance types of worker nodes.
variable "worker_instance_types" {
  description = "The ecs instance types used to launch worker nodes."
  default     = ["ecs.g6.2xlarge", "ecs.g6.xlarge"]
}

# Specify a password for the worker node.
variable "password" {
  description = "The password of ECS instance."
  default     = "Test123456"
}

# Specify the prefix of the name of the ACK managed cluster.
variable "k8s_name_prefix" {
  description = "The name prefix used to create managed kubernetes cluster."
  default     = "tf-ack-shenzhen"
}

# Specify the components to install in the ACK managed cluster.
# Components: Terway (network), csi-plugin (volume), csi-provisioner (volume),
# logtail-ds (logging), nginx-ingress-controller (Ingress), arms-prometheus (monitoring),
# ack-node-problem-detector (node diagnostics).
variable "cluster_addons" {
  type = list(object({
    name   = string
    config = string
  }))

  default = [
    {
      "name"   = "terway-eniip",
      "config" = "",
    },
    {
      "name"   = "logtail-ds",
      "config" = "{\"IngressDashboardEnabled\":\"true\"}",
    },
    {
      "name"   = "nginx-ingress-controller",
      "config" = "{\"IngressSlbNetworkType\":\"internet\"}",
    },
    {
      "name"   = "arms-prometheus",
      "config" = "",
    },
    {
      "name"   = "ack-node-problem-detector",
      "config" = "{\"sls_project_name\":\"\"}",
    },
    {
      "name"   = "csi-plugin",
      "config" = "",
    },
    {
      "name"   = "csi-provisioner",
      "config" = "",
    }
  ]
}

# The default resource names.
locals {
  k8s_name_terway         = "k8s_name_terway_${random_integer.default.result}"
  vpc_name                = "vpc_name_${random_integer.default.result}"
  autoscale_nodepool_name = "autoscale-node-pool-${random_integer.default.result}"
}

# Query ECS instance types with 8 vCPUs and 32 GiB memory to use as worker nodes.
data "alicloud_instance_types" "default" {
  cpu_core_count       = 8
  memory_size          = 32
  availability_zone    = var.availability_zone[0]
  kubernetes_node_role = "Worker"
}

resource "random_integer" "default" {
  min = 10000
  max = 99999
}

# The VPC.
resource "alicloud_vpc" "default" {
  vpc_name   = local.vpc_name
  cidr_block = "172.16.0.0/12"
}

# The node vSwitch.
resource "alicloud_vswitch" "vswitches" {
  count      = length(var.node_vswitch_cidrs)
  vpc_id     = alicloud_vpc.default.id
  cidr_block = element(var.node_vswitch_cidrs, count.index)
  zone_id    = element(var.availability_zone, count.index)
}

# The Pod vSwitch (used by Terway for Pod IP allocation).
resource "alicloud_vswitch" "terway_vswitches" {
  count      = length(var.terway_vswitch_cidrs)
  vpc_id     = alicloud_vpc.default.id
  cidr_block = element(var.terway_vswitch_cidrs, count.index)
  zone_id    = element(var.availability_zone, count.index)
}

# The ACK managed cluster.
resource "alicloud_cs_managed_kubernetes" "default" {
  name         = local.k8s_name_terway
  cluster_spec = var.cluster_spec  # ack.pro.small creates an ACK Pro cluster.
  # vSwitches must reside in the zones specified by availability_zone.
  worker_vswitch_ids           = split(",", join(",", alicloud_vswitch.vswitches.*.id))
  pod_vswitch_ids              = split(",", join(",", alicloud_vswitch.terway_vswitches.*.id))
  new_nat_gateway              = true   # Create a NAT gateway for the cluster.
  service_cidr                 = "10.11.0.0/16"  # Must not overlap with the VPC CIDR block. Maximum 256 hosts.
  slb_internet_enabled         = true   # Create an Internet-facing SLB instance for the API server.
  enable_rrsa                  = true
  control_plane_log_components = ["apiserver", "kcm", "scheduler", "ccm"]
  dynamic "addons" {
    for_each = var.cluster_addons
    content {
      name   = lookup(addons.value, "name", var.cluster_addons)
      config = lookup(addons.value, "config", var.cluster_addons)
    }
  }
}

# Create a node pool with auto scaling enabled. Scales between 1 and 10 nodes.
resource "alicloud_cs_kubernetes_node_pool" "autoscale_node_pool" {
  cluster_id     = alicloud_cs_managed_kubernetes.default.id
  node_pool_name = local.autoscale_nodepool_name
  vswitch_ids    = split(",", join(",", alicloud_vswitch.vswitches.*.id))

  scaling_config {
    min_size = 1
    max_size = 10
  }

  instance_types        = var.worker_instance_types
  password              = var.password  # SSH login password for worker nodes.
  install_cloud_monitor = true          # Install the CloudMonitor agent on nodes.
  system_disk_category  = "cloud_efficiency"
  system_disk_size      = 100
  image_type            = "AliyunLinux3"

  data_disks {
    category = "cloud_essd"  # Disk category.
    size     = 120            # Disk size in GiB.
  }
}

Etapa 1: Inicialize o Terraform

terraform init

Uma inicialização bem-sucedida retorna:

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

Etapa 2: Aplique a configuração

terraform apply

Etapa 3: Verifique o resultado

Após a conclusão do apply, acesse a página Node Pools no console do ACK. O novo pool de nós exibe Auto Scaling Enabled abaixo do seu nome.

Limpe os recursos

Exclua todos os recursos criados por esta configuração:

terraform destroy

Para obter detalhes sobre o terraform destroy, consulte Common commands.

Próximos passos

Referências