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.
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 --versionpara 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:
alicloud_vpc— uma VPC para a rede do clusteralicloud_vswitch(×2 conjuntos) — vSwitches de nó e vSwitches de pod Terway em cada zonaalicloud_ecs_deployment_set— o conjunto de implantação que impõe o isolamento físico de hostalicloud_cs_managed_kubernetes— um cluster gerenciado ACKalicloud_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.
alicloud_vpc: crie uma VPC.
alicloud_vswitch: crie vSwitches em uma VPC para formar sub-redes.
alicloud_ecs_deployment_set: crie um conjunto de implantação.
alicloud_cs_managed_kubernetes: crie um cluster gerenciado ACK.
alicloud_cs_kubernetes_node_pool: crie um node pool para um cluster gerenciado ACK.
Crie um node pool com um conjunto de implantação
-
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. } } -
Inicialize o ambiente de execução do Terraform:
terraform initUma 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. -
Crie os recursos:
terraform applyQuando solicitado, insira
yespara 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 addedconfirma 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

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.
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
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
Próximos passos
Para aprender a controlar a distribuição de instâncias ECS em um node pool, consulte Melhores práticas para associar conjuntos de implantação a node pools.
O Terraform está disponível como serviço gerenciado no ROS. Para implantar modelos do Terraform no console do ROS, consulte Crie uma pilha do Terraform.