Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Associate a deployment set with a node pool

Última atualização: Jul 05, 2026

Distribuir instâncias de node pools do ACK em diferentes servidores físicos elimina pontos únicos de falha quando um host fica indisponível. Use o Terraform para crie um node pool associado a um conjunto de implantação do Elastic Compute Service (ECS) e garantir o isolamento físico dos nós ECS subjacentes em vários hosts.

Nota

Execute o código de exemplo deste tópico com poucos cliques. Clique em aqui para execute o código de exemplo.

Limitações

Antes de começar, observe as seguintes restrições obrigatórias:

  • Apenas no momento da criação: Associe um conjunto de implantação a um node pool somente ao crie o node pool. Não é possível atualizar node pools existentes para usar um conjunto de implantação.

  • Um conjunto de implantação por node pool: Cada node pool pode ser associado a apenas um conjunto de implantação.

  • Sem instâncias preemptíveis: Node pools associados a um conjunto de implantação não suportam instâncias preemptíveis.

  • Sem gerenciamento manual de instâncias: Adicione ou remova instâncias ECS em um conjunto de implantação apenas dimensionando o node pool associado. O sistema não suporta adições e remoções manuais. Para mais informações, consulte Crie e gerencie um node pool.

  • Cota: Cada conjunto de implantação suporta até 20 instâncias ECS por zona. O máximo para uma região é 20 × number of zones in the region. Esse limite não pode ser aumentado, mas você pode solicitar uma cota maior para o número total de conjuntos de implantação no console do Quota Center.

  • Recursos de instância: Estoque insuficiente de instâncias em uma zona pode causar falhas na criação ou inicialização de instâncias ECS. Aguarde e tente novamente se isso ocorrer.

Pré-requisitos

Antes de iniciar, certifique-se de ter:

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

    • Explorer: ambiente Terraform online fornecido pela Alibaba Cloud. Nenhuma instalação necessária. Ideal para testes e depuração com baixa sobrecarga.

    • Cloud Shell: Terraform pré-instalado e configurado com suas credenciais de identidade. Recomendado para acesso rápido sem configuração local.

    • Resource Orchestration Service (ROS): integra modelos do Terraform ao ROS para gerencie recursos na Alibaba Cloud, AWS ou Azure.

    • Instalação local: adequada para ambientes de rede instáveis ou configurações personalizadas de desenvolvimento.

    É necessário o Terraform 0.12.28 ou posterior. Execute terraform --version para verifique sua versão.
  • Cota suficiente de ECS no conjunto de implantação e estoque adequado para os tipos de instância especificados. Por padrão, cada conjunto de implantação pode conter até 20 instâncias ECS por zona. Para mais informações, consulte Gerencie cotas de ECS.

  • Um par de AccessKey para o usuário do Resource Access Management (RAM) usado no login.

    Utilize um usuário RAM com permissões limitadas em vez da conta raiz da Alibaba Cloud. Isso reduz o impacto caso as credenciais sejam comprometidas.
  • A seguinte política do RAM anexada ao seu usuário RAM. Essa política concede as permissões mínimas necessárias para execute a configuração do Terraform neste tópico (crie, visualize e exclua virtual private clouds (VPCs), vSwitches, conjuntos de implantação e clusters ACK). Para detalhes sobre como conceder permissões, consulte Conceder permissões a um usuário RAM.

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "vpc:CreateVpc",
                    "vpc:CreateVSwitch",
                    "cs:CreateCluster",
                    "vpc:DescribeVpcAttribute",
                    "vpc:DescribeVSwitchAttributes",
                    "vpc:DescribeRouteTableList",
                    "vpc:DescribeNatGateways",
                    "cs:DescribeTaskInfo",
                    "cs:DescribeClusterDetail",
                    "cs:GetClusterCerts",
                    "cs:CheckControlPlaneLogEnable",
                    "cs:CreateClusterNodePool",
                    "cs:DescribeClusterNodePoolDetail",
                    "cs:ModifyClusterNodePool",
                    "vpc:DeleteVpc",
                    "vpc:DeleteVSwitch",
                    "cs:DeleteCluster",
                    "cs:DeleteClusterNodepool",
                    "ecs:CreateDeploymentSet",
                    "ecs:DescribeDeploymentSets",
                    "ecs:ModifyDeploymentSetAttribute",
                    "ecs:DeleteDeploymentSet"
                ],
                "Resource": "*"
            }
        ]
    }

Contexto

Um conjunto de implantação é um recurso do ECS que distribui instâncias em diferentes servidores físicos dentro de uma zona. Quando um servidor físico fica indisponível, apenas as instâncias nesse servidor são afetadas, e não todas as instâncias do conjunto de implantação. Ao associar um conjunto de implantação a um node pool do ACK, você garante a distribuição dos nós ECS subjacentes por vários hosts físicos. Em seguida, utilize regras de afinidade de pods para agendar pods de aplicação em diferentes nós e obter isolamento no nível de host.

Os conjuntos de implantação são suportados tanto em clusters dedicados ACK quanto em clusters gerenciados ACK.

Para mais informações, consulte Conjunto de implantação.

Estratégias de implantação

A variável strategy na configuração do Terraform controla como as instâncias são distribuídas. Os valores válidos são Availability, AvailabilityGroup e LowLatency. Os conjuntos de implantação de node pools usam a estratégia de alta disponibilidade (Availability) por padrão.

A estratégia escolhida afeta quais famílias de instâncias ECS são compatíveis. Para verifique quais famílias de instâncias suportam uma determinada estratégia, chame DescribeDeploymentSetSupportedInstanceTypeFamily .

Compatibilidade de famílias de instâncias

A tabela a seguir lista as famílias de instâncias suportadas por cada estratégia de implantação.

Estratégia de implantação

Famílias de instâncias suportadas

Estratégia de alta disponibilidade ou estratégia de grupo de alta disponibilidade

g8a, g8i, g8y, g7se, g7a, g7, g7h, g7t, g7ne, g7nex, g6, g6e, g6a, g5, g5ne, sn2ne, sn2, sn1; c8a, c8i, c8y, c7se, c7, c7t, c7nex, c7a, c6, c6a, c6e, c5, ic5, sn1ne; r8a, r8i, r8y, r7, r7se, r7t, r7a, r6, r6e, r6a, re6, re6p, r5, re4, se1ne, se1; hfc8i, hfg8i, hfr8i, hfc7, hfg7, hfr7, hfc6, hfg6, hfr6, hfc5, hfg5; d3c, d2s, d2c, d1, d1ne, d1-c14d3, d1-c8d3; i3g, i3, i2, i2g, i2ne, i2gne, i1; ebmg5, ebmc7, ebmg7, ebmr7, sccgn6, scch5, scch5s, sccg5, sccg5s; e, t6, xn4, mn4, n4, e4, n2, n1; gn6i

Estratégia de baixa latência

g8a, g8i, g8ae, g8y; c8a, c8i, c8ae, c8y; ebmc8i, ebmg8i, ebmr8i; r8a, r8i, r8ae, r8y; ebmc7, ebmg7, ebmr7

Recursos necessários

Os recursos neste exemplo geram custos. Libere os recursos quando não precisar mais deles.

A configuração do Terraform cria os seguintes recursos nesta ordem:

  1. alicloud_vpc — uma VPC para a rede do cluster

  2. alicloud_vswitch (×2 conjuntos) — vSwitches de nó e vSwitches de pod Terway em cada zona

  3. alicloud_ecs_deployment_set — o conjunto de implantação que impõe o isolamento físico de host

  4. alicloud_cs_managed_kubernetes — um cluster gerenciado ACK

  5. alicloud_cs_kubernetes_node_pool — um node pool que referencia o ID do conjunto de implantação

O campo deployment_set_id do node pool o vincula ao conjunto de implantação. Esta é a configuração essencial que aciona a distribuição física de hosts para todos os nós no pool.

Crie um node pool com um conjunto de implantação

  1. Crie o arquivo de configuração do Terraform usando o seguinte modelo:

    provider "alicloud" {
      region = var.region_id
    }
    
    variable "region_id" {
      type    = string
      default = "cn-shenzhen"
    }
    
    variable "name" {
      default = "tf-example"
    }
    
    variable "strategy" {
      default     = "Availability"
      description = "The deployment strategy. Valid values: Availability, AvailabilityGroup, LowLatency."
    }
    
    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"]
    }
    
    # The CIDR blocks used to create Terway vSwitches.
    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 cluster add-on components (Terway, csi-plugin, csi-provisioner, logtail-ds, nginx-ingress-controller, arms-prometheus, ack-node-problem-detector).
    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" = "",
        }
      ]
    }
    
    # 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"
    }
    
    variable "vpc_name" {
      default = "tf-vpc"
    }
    variable "nodepool_name" {
      default = "default-nodepool"
    }
    
    # The default resource names.
    locals {
      k8s_name_terway = substr(join("-", [var.k8s_name_prefix, "terway"]), 0, 63)
    }
    
    # The VPC.
    resource "alicloud_vpc" "default" {
      vpc_name   = var.vpc_name
      cidr_block = "172.16.0.0/12"
    }
    
    # The node vSwitches.
    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 vSwitches.
    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)
    }
    
    # Create a deployment set.
    resource "alicloud_ecs_deployment_set" "default" {
      strategy            = var.strategy
      domain              = "Default"
      granularity         = "Host"
      deployment_set_name = var.name
      description         = "example_value"
    }
    
    # The ACK managed cluster.
    resource "alicloud_cs_managed_kubernetes" "default" {
      name         = local.k8s_name_terway # The ACK cluster name.
      cluster_spec = var.cluster_spec      # Create an ACK Pro cluster.
      worker_vswitch_ids           = split(",", join(",", alicloud_vswitch.vswitches.*.id))        # The vSwitches used by the node pool. Specify one or more vSwitch IDs. The vSwitches must reside in the zone specified by availability_zone.
      pod_vswitch_ids              = split(",", join(",", alicloud_vswitch.terway_vswitches.*.id)) # The vSwitches used by pods.
      new_nat_gateway              = true                                                          # Specify whether to create a NAT gateway when the ACK cluster is created. Default value: true.
      service_cidr                 = "10.11.0.0/16"                                                # The pod CIDR block. If you set the cluster_network_type parameter to flannel, this parameter is required. The pod CIDR block cannot be the same as the VPC CIDR block or the CIDR blocks of other ACK clusters in the VPC. You cannot change the pod CIDR block after the cluster is created. Maximum number of hosts in the cluster: 256.
      slb_internet_enabled         = true                                                          # Specify whether to create an Internet-facing SLB instance for the API server of the cluster. Default value: false.
      enable_rrsa                  = true
      control_plane_log_components = ["apiserver", "kcm", "scheduler", "ccm"] # The control plane logs.
    
      dynamic "addons" { # Component management.
        for_each = var.cluster_addons
        content {
          name   = lookup(addons.value, "name", var.cluster_addons)
          config = lookup(addons.value, "config", var.cluster_addons)
        }
      }
    }
    
    # The regular node pool.
    # deployment_set_id links this node pool to the deployment set created above.
    # All nodes in this pool are distributed across separate physical hosts, as defined by the strategy.
    # You can associate a deployment set with a node pool only when you create the node pool.
    resource "alicloud_cs_kubernetes_node_pool" "default" {
      cluster_id           = alicloud_cs_managed_kubernetes.default.id              # The ACK cluster name.
      node_pool_name       = var.nodepool_name                                      # The node pool name.
      vswitch_ids          = split(",", join(",", alicloud_vswitch.vswitches.*.id)) # The vSwitches used by the node pool. Specify one or more vSwitch IDs. The vSwitches must reside in the zone specified by availability_zone.
      instance_types       = var.worker_instance_types
      instance_charge_type = "PostPaid"
      runtime_name         = "containerd"
      desired_size          = 2            # The expected number of nodes in the node pool.
      password              = var.password # The password that is used to log on to the cluster by using SSH.
      install_cloud_monitor = true         # Specify whether to install the CloudMonitor agent on the nodes in the cluster.
      system_disk_category  = "cloud_essd"
      system_disk_size      = 100
      image_type            = "AliyunLinux"
      deployment_set_id     = alicloud_ecs_deployment_set.default.id
    
      data_disks {              # The data disk configuration of the node.
        category = "cloud_essd" # The disk category.
        size     = 120          # The disk size.
      }
    }
  2. Inicialize o ambiente de execução do Terraform:

    terraform init

    Uma inicialização bem-sucedida retorna uma saída semelhante a:

    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.
  3. Crie os recursos:

    terraform apply

    Quando solicitado, insira yes para confirme. Uma aplicação bem-sucedida retorna uma saída semelhante a:

    Do you want to perform these actions?
      Terraform will perform the actions described above.
      Only 'yes' will be accepted to approve.
    
      Enter a value: yes
    
    ...
    
    Apply complete!  Resources: 10 added, 0 changed, 0 destroyed.

    A mensagem Resources: 10 added confirma que todos os recursos necessários — incluindo VPC, vSwitches, conjunto de implantação, cluster ACK e node pool — foram provisionados.

Verifique o resultado

Verifique com o Terraform

Execute o comando a seguir para inspecionar o estado do Terraform:

terraform show

image

Na saída, localize o recurso alicloud_cs_kubernetes_node_pool.default e confirme se deployment_set_id corresponde ao ID de alicloud_ecs_deployment_set.default. Isso confirma que o node pool está vinculado ao conjunto de implantação correto.

Verifique no console do ACK

No console do ACK, acesse a página Node Pools e encontre o node pool criado. Clique em Edit na coluna Actions para visualize o conjunto de implantação associado.image

Limpar recursos

Quando não precisar mais dos recursos, execute o comando a seguir para liberá-los:

terraform destroy

Para mais informações sobre o comando terraform destroy, consulte Comandos comuns.

Exemplo

Nota

Execute o código de exemplo deste tópico com poucos cliques. Clique em aqui para execute o código de exemplo.

Código de exemplo

provider "alicloud" {
  region = var.region_id
}

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

variable "name" {
  default = "tf-example"
}

variable "strategy" {
  default     = "Availability"
  description = "The deployment strategy. Valid values: Availability, AvailabilityGroup, LowLatency."
}

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"]
}

# The CIDR blocks used to create Terway vSwitches.
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 cluster add-on components (Terway, csi-plugin, csi-provisioner, logtail-ds, nginx-ingress-controller, arms-prometheus, ack-node-problem-detector).
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" = "",
    }
  ]
}

# 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"
}

variable "vpc_name" {
  default = "tf-vpc"
}
variable "nodepool_name" {
  default = "default-nodepool"
}

# The default resource names.
locals {
  k8s_name_terway = substr(join("-", [var.k8s_name_prefix, "terway"]), 0, 63)
}

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

# The node vSwitches.
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 vSwitches.
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)
}

# Create a deployment set.
resource "alicloud_ecs_deployment_set" "default" {
  strategy            = var.strategy
  domain              = "Default"
  granularity         = "Host"
  deployment_set_name = var.name
  description         = "example_value"
}

# The ACK managed cluster.
resource "alicloud_cs_managed_kubernetes" "default" {
  name         = local.k8s_name_terway # The ACK cluster name.
  cluster_spec = var.cluster_spec      # Create an ACK Pro cluster.
  worker_vswitch_ids           = split(",", join(",", alicloud_vswitch.vswitches.*.id))        # The vSwitches used by the node pool. Specify one or more vSwitch IDs. The vSwitches must reside in the zone specified by availability_zone.
  pod_vswitch_ids              = split(",", join(",", alicloud_vswitch.terway_vswitches.*.id)) # The vSwitch used by pods.
  new_nat_gateway              = true                                                          # Specify whether to create a NAT gateway when the ACK cluster is created. Default value: true.
  service_cidr                 = "10.11.0.0/16"                                                # The pod CIDR block. If you set the cluster_network_type parameter to flannel, this parameter is required. The pod CIDR block cannot be the same as the VPC CIDR block or the CIDR blocks of other ACK clusters in the VPC. You cannot change the pod CIDR block after the cluster is created. Maximum number of hosts in the cluster: 256.
  slb_internet_enabled         = true                                                          # Specify whether to create an Internet-facing SLB instance for the API server of the cluster. Default value: false.
  enable_rrsa                  = true
  control_plane_log_components = ["apiserver", "kcm", "scheduler", "ccm"] # The control plane logs.

  dynamic "addons" { # Component management.
    for_each = var.cluster_addons
    content {
      name   = lookup(addons.value, "name", var.cluster_addons)
      config = lookup(addons.value, "config", var.cluster_addons)
    }
  }
}

# The regular node pool.
resource "alicloud_cs_kubernetes_node_pool" "default" {
  cluster_id           = alicloud_cs_managed_kubernetes.default.id              # The ACK cluster name.
  node_pool_name       = var.nodepool_name                                      # The node pool name.
  vswitch_ids          = split(",", join(",", alicloud_vswitch.vswitches.*.id)) # The vSwitches used by the node pool. Specify one or more vSwitch IDs. The vSwitches must reside in the zone specified by availability_zone.
  instance_types       = var.worker_instance_types
  instance_charge_type = "PostPaid"
  runtime_name         = "containerd"
  desired_size          = 2            # The expected number of nodes in the node pool.
  password              = var.password # The password that is used to log on to the cluster by using SSH.
  install_cloud_monitor = true         # Specify whether to install the CloudMonitor agent on the nodes in the cluster.
  system_disk_category  = "cloud_essd"
  system_disk_size      = 100
  image_type            = "AliyunLinux"
  deployment_set_id     = alicloud_ecs_deployment_set.default.id

  data_disks {              # The data disk configuration of the node.
    category = "cloud_essd" # The disk category.
    size     = 120          # The disk size.
  }
}

Para exemplos mais completos, visite Mais exemplos e selecione o diretório do Container Service for Kubernetes (ACK).

Próximos passos