Como fazer o escalonamento automático de um cluster


Veja nesta página como fazer escalonamento automático dos seus clusters padrão do Google Kubernetes Engine (GKE). Para saber mais sobre como o escalonador automático de clusters funciona, consulte esta página.

Com os clusters do Autopilot, você não precisa se preocupar com o provisionamento de nós ou o gerenciamento de pools de nós porque eles são provisionados automaticamente usando o provisionamento automático de nós, e são escalonadas automaticamente para atender aos requisitos das cargas de trabalho.

Como usar o escalonador automático de cluster

Veja nas seções a seguir como usar o escalonador automático de clusters.

Como criar um cluster com escalonamento automático

É possível criar um cluster com escalonamento automático ativado usando a Google Cloud CLI ou o Console do Google Cloud.

gcloud

Para criar um cluster com escalonamento automático, use a sinalização --enable-autoscaling e especifique --min-nodes e --max-nodes:

gcloud container clusters create CLUSTER_NAME \
    --enable-autoscaling \
    --num-nodes NUM_NODES \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --region=COMPUTE_REGION

Substitua:

  • CLUSTER_NAME: o nome do cluster a ser criado.
  • NUM_NODES: o número de nós a serem criados em cada local;
  • MIN_NODES: o número mínimo de nós a ser escalonado automaticamente para o pool de nós especificado por zona. Para especificar o número mínimo de nós para todo o pool de nós no GKE versões 1.24 e posteriores, use --total-min-nodes. As sinalizações --total-min-nodes e --total-max-nodes são mutuamente exclusivas com as sinalizações --min-nodes e --max-nodes.
  • MAX_NODES: o número máximo de nós a ser escalonado automaticamente para o pool de nós especificado por zona. Para especificar o número máximo de nós para todo o pool de nós no GKE versões 1.24 e posteriores, use --total-max-nodes. As sinalizações --total-min-nodes e --total-max-nodes são mutuamente exclusivas com as sinalizações --min-nodes e --max-nodes.
  • COMPUTE_REGION: a região do Compute Engine para o novo cluster. Para clusters zonais, use --zone=COMPUTE_ZONE.

Exemplo: como criar um cluster com o escalonamento automático de nós ativado e os nós mínimo e máximo

O comando a seguir cria um cluster com 90 nós, ou 30 nós em cada uma das três zonas presentes na região. O escalonamento automático de nós está ativado e redimensiona o número deles com base na carga do cluster. O escalonador automático do cluster reduz o tamanho do pool de nós padrão para 15 nós ou aumenta para até 50 por zona.

gcloud container clusters create my-cluster --enable-autoscaling \
    --num-nodes=30 \
    --min-nodes=15 --max-nodes=50 \
    --region=us-central

Exemplo: como criar um cluster com o escalonamento automático de nós ativado e o total de nós

O comando a seguir cria um cluster com 30 nós, ou 10 nós em cada uma das 3 zonas presentes na região. O escalonamento automático de nós está ativado e redimensiona o número deles com base na carga do cluster. Neste exemplo, o tamanho total do cluster pode estar entre 10 e 60 nós, independentemente da propagação entre as zonas.

gcloud container clusters create my-cluster --enable-autoscaling \
    --num-nodes 10 \
    --region us-central1 \
    --total-min-nodes 10  --total-max-nodes 60

Console

Para criar um novo cluster no qual o pool de nós padrão esteja com o escalonamento automático ativado:

  1. Acesse a página Google Kubernetes Engine no Console do Google Cloud.

    Acessar o Google Kubernetes Engine

  2. Clique em Criar.

  3. Configure o cluster como quiser.

  4. No painel de navegação, em Pools de nós, clique em default-pool.

  5. Marque a caixa de seleção Ativar escalonamento automático.

  6. Altere os valores dos campos Número mínimo de nós e Número máximo de nós como desejar.

  7. Clique em Criar.

Como adicionar um pool de nós com escalonamento automático

É possível criar um pool de nós com escalonamento automático ativado usando a gcloud CLI ou o Console do Google Cloud.

gcloud

Para adicionar um pool de nós com escalonamento automático a um cluster atual, use o comando a seguir:

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --enable-autoscaling \
    --min-nodes=MIN_NODES \
    --max-nodes=MAX_NODES \
    --region=COMPUTE_REGION

Substitua:

  • POOL_NAME: o nome do pool de nós desejado.
  • CLUSTER_NAME: o nome do cluster em que o pool de nós será criado.
  • MIN_NODES: o número mínimo de nós a ser escalonado automaticamente para o pool de nós especificado por zona. Para especificar o número mínimo de nós para todo o pool de nós no GKE versões 1.24 e posteriores, use --total-min-nodes. As sinalizações --total-min-nodes e --total-max-nodes são mutuamente exclusivas com as sinalizações --min-nodes e --max-nodes.
  • MAX_NODES: o número máximo de nós a ser escalonado automaticamente para o pool de nós especificado por zona. Para especificar o número máximo de nós para todo o pool de nós no GKE versões 1.24 e posteriores, use --total-max-nodes. As sinalizações --total-min-nodes e --total-max-nodes são mutuamente exclusivas com as sinalizações --min-nodes e --max-nodes.
  • COMPUTE_REGION: a região do Compute Engine para o novo cluster. Para clusters zonais, use --zone=COMPUTE_ZONE.

Exemplo: como adicionar um pool de nós com escalonamento automático de nós ativado

O comando a seguir cria um pool de nós com escalonamento automático de nós que escalona o pool de nós para um máximo de cinco nós e um mínimo de um nó:

gcloud container node-pools create my-node-pool \
    --cluster my-cluster \
    --enable-autoscaling \
    --min-nodes 1 --max-nodes 5 \
    --zone us-central1-c

Console

Para adicionar um pool de nós com escalonamento automático a um cluster atual:

  1. Acesse a página Google Kubernetes Engine no console do Google Cloud.

    Acessar o Google Kubernetes Engine

  2. Na lista de clusters, clique no nome do cluster que você quer modificar.

  3. Clique em Adicionar pool de nós.

  4. Configure o pool de nós como quiser.

  5. Em Tamanho, marque a caixa de seleção Ativar escalonamento automático.

  6. Altere os valores dos campos Número mínimo de nós e Número máximo de nós como desejar.

  7. Clique em Criar.

Como ativar o escalonamento automático de um pool de nós existente

É possível ativar o escalonamento automático de um pool de nós atual usando a gcloud CLI ou o Console do Google Cloud.

gcloud

Para ativar o escalonamento automático em um pool de nós atual, use o comando a seguir:

gcloud container clusters update CLUSTER_NAME \
    --enable-autoscaling \
    --node-pool=POOL_NAME \
    --min-nodes=MIN_NODES \
    --max-nodes=MAX_NODES \
    --region=COMPUTE_REGION

Substitua:

  • CLUSTER_NAME: o nome do cluster a se fazer upgrade.
  • POOL_NAME: o nome do pool de nós pretendido. Se você tiver apenas um pool de nós, forneça default-pool como o valor.
  • MIN_NODES: o número mínimo de nós a ser escalonado automaticamente para o pool de nós especificado por zona. Para especificar o número mínimo de nós para todo o pool de nós no GKE versões 1.24 e posteriores, use --total-min-nodes. As sinalizações --total-min-nodes e --total-max-nodes são mutuamente exclusivas com as sinalizações --min-nodes e --max-nodes.
  • MAX_NODES: o número máximo de nós a ser escalonado automaticamente para o pool de nós especificado por zona. Para especificar o número máximo de nós para todo o pool de nós no GKE versões 1.24 e posteriores, use --total-max-nodes. As sinalizações --total-min-nodes e --total-max-nodes são mutuamente exclusivas com as sinalizações --min-nodes e --max-nodes.
  • COMPUTE_REGION: a região do Compute Engine para o novo cluster. Para clusters zonais, use --zone=COMPUTE_ZONE.

Console

Para ativar o escalonamento automático de um pool de nós atual:

  1. Acesse a página Google Kubernetes Engine no console do Google Cloud.

    Acessar o Google Kubernetes Engine

  2. Na lista de clusters, clique no nome do cluster que você quer modificar.

  3. Clique na guia Nós.

  4. Em Pools de nós, clique no nome do pool de nós que você quer modificar e clique em Editar.

  5. Em Tamanho, marque a caixa de seleção Ativar escalonamento automático.

  6. Altere os valores dos campos Número mínimo de nós e Número máximo de nós como desejar.

  7. Clique em Salvar.

Como verificar se o escalonamento automático do pool de nós está ativado

Verifique se o cluster está usando o escalonamento automático com a Google Cloud CLI ou o console do Google Cloud.

gcloud

Descreva os pools de nós no cluster:

gcloud container node-pools describe NODE_POOL_NAME --cluster=CLUSTER_NAME |grep autoscaling -A 1

Substitua:

  • POOL_NAME: o nome do novo pool de nós escolhido.
  • CLUSTER_NAME: o nome do cluster.

Se o escalonamento automático estiver ativado, a saída será semelhante a esta:

autoscaling:
  enabled: true

Console

  1. Acesse a página Google Kubernetes Engine no console do Google Cloud.

    Acessar o Google Kubernetes Engine

  2. Na lista de clusters, clique no nome do cluster que você quer verificar.

  3. Clique na guia Nós.

  4. Em Pools de nós, verifique o estado Autoscalling do pool.

Como criar um pool de nós que prioriza a otimização de reservas não utilizadas

Use a sinalização --location_policy=ANY ao criar um pool de nós para instruir o escalonador automático de clusters a priorizar o uso de reservas não utilizadas:

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location_policy=ANY

Substitua:

  • POOL_NAME: o nome do novo pool de nós escolhido.
  • CLUSTER_NAME: o nome do cluster.

Como desativar o escalonamento automático de um pool de nós existente

É possível desativar o escalonamento automático de um pool de nós atual usando a gcloud CLI ou o Console do Google Cloud.

gcloud

Para desativar o escalonamento automático de um pool de nós específico, use a sinalização --no-enable-autoscaling:

gcloud container clusters update CLUSTER_NAME \
    --no-enable-autoscaling \
    --node-pool=POOL_NAME \
    --region=COMPUTE_REGION

Substitua:

  • CLUSTER_NAME: o nome do cluster a se fazer upgrade.
  • POOL_NAME: o nome do pool de nós desejado.
  • COMPUTE_REGION: a região do Compute Engine para o novo cluster. Para clusters zonais, use --zone=COMPUTE_ZONE.

O tamanho do cluster é determinado pelo tamanho atual do seu pool de nós padrão, que pode ser atualizado manualmente.

Console

Para desativar o escalonamento automático de um pool de nós específico:

  1. Acesse a página Google Kubernetes Engine no console do Google Cloud.

    Acessar o Google Kubernetes Engine

  2. Na lista de clusters, clique no nome do cluster que você quer modificar.

  3. Clique na guia Nós.

  4. Em Pools de nós, clique no nome do pool de nós que você quer modificar e clique em Editar.

  5. Em Tamanho, desmarque a caixa de seleção Ativar escalonamento automático.

  6. Clique em Salvar.

Como redimensionar um pool de nós

Para clusters com escalonamento automático ativado, o escalonador automático de clusters redimensiona automaticamente os pools de nós dentro dos limites especificados pelo tamanho mínimo (--min-nodes) e o tamanho máximo (--max-nodes) ou o tamanho mínimo total (--total-min-nodes) e o tamanho total máximo (--total-max-nodes). Essas sinalizações são mutuamente exclusivas. Não é possível redimensionar manualmente um pool de nós alterando esses valores.

Se você quiser redimensionar manualmente um pool de nós no cluster com o escalonamento automático ativado, faça o seguinte:

  1. Desative o escalonamento automático no pool de nós.
  2. Redimensione manualmente o cluster.
  3. Reative o escalonamento automático e especifique o tamanho mínimo e máximo do pool de nós.

Como impedir a programação de pods em nós selecionados

É possível usar taints startup ou status para evitar que os pods sejam programados em nós selecionados, dependendo do caso de uso.

Este recurso está disponível no GKE a partir da versão 1.28.

Taints de inicialização

Use taints startup quando houver uma operação que precise ser concluída antes que qualquer pod possa ser executado no nó. Por exemplo, os pods não devem ser executados até que a instalação dos drivers no nó seja concluída.

O escalonador automático de clusters trata os nós com taints startup como não lidos, mas são considerados durante a lógica de escalonamento vertical, supondo que ficarão prontos em breve.

Os taints de inicialização são definidos como todos os taints com o prefixo startup-taint.cluster-autoscaler.kubernetes.io/

Taints de status

Use taints status quando o GKE não puder usar um determinado nó para executar pods.

O escalonador automático de clusters trata os nós com taint com status como prontos, mas os ignora durante a lógica de escalonamento vertical. Mesmo que o nó com taint esteja pronto, nenhum pod será executado. Se os pods precisarem de mais recursos, o GKE vai escalonar o cluster e ignorar os nós com taint.

Os taints de status são definidos como todos os taints com o prefixo status-taint.cluster-autoscaler.kubernetes.io/

Ignorar taints

Taints de ignorar são definidos como todos os taints com o prefixo ignore-taint.cluster-autoscaler.kubernetes.io/

Solução de problemas

Verifique se o problema está ocorrendo por uma das limitações do escalonador automático de cluster. Caso contrário, consulte as seguintes informações de solução de problemas do escalonador automático de cluster:

O cluster não está reduzindo escala vertical

Depois que o cluster é escalonado verticalmente e tenta reduzir escala vertical, os nós subutilizados permanecem ativados e impedem essa redução do cluster. Esse erro ocorre por um dos seguintes motivos:

  • Restrições podem impedir que um nó seja excluído pelo escalonador automático. O GKE pode impedir a exclusão de um nó se ele contiver um pod com qualquer uma destas condições:

    • As regras de afinidade ou antiafinidade impedem a reprogramação.
    • No GKE versão 1.21 e anteriores, o pod tem armazenamento local.
    • O Pod não é gerenciado por um Controlador, como o Deployment, o StatefulSet, o Job ou o ReplicaSet.

    Para resolver esse problema, configure as regras de remoção e programação do escalonador automático de cluster nos pods. Para mais informações, consulte Programação e interrupção de pods.

  • Os pods do sistema estão em execução em um nó. Para verificar se os nós estão executando pods kube-system, execute estas etapas:

    1. Acesse a página do Explorador de registros no console do Google Cloud:

      Acessar o Explorador de registros

    2. Clique em Criador de consultas.

    3. Use a seguinte consulta para encontrar todos os registros de políticas de rede:

        - resource.labels.location="CLUSTER_LOCATION"
        resource.labels.cluster_name="CLUSTER_NAME"
        logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fcluster-autoscaler-visibility"
        jsonPayload.noDecisionStatus.noScaleDown.nodes.node.mig.nodepool="NODE_POOL_NAME"
      

      Substitua:

      • CLUSTER_LOCATION: a região em que o cluster está.
      • CLUSTER_NAME: o nome do cluster.
      • PROJECT_ID: o ID do projeto em que o cluster foi criado.
      • NODE_POOL_NAME: o nome do pool de nós.

        Se houver pods kube-system em execução no pool de nós, a saída incluirá:

        "no.scale.down.node.pod.kube.system.unmovable"
        

    Para resolver esse problema, você precisa realizar uma destas ações:

Incompatibilidade de tamanho do pool de nós

O problema a seguir ocorre quando você configura o tamanho do pool de nós:

  • O tamanho de um pool de nós atual é menor que o número mínimo de nós especificado para o cluster.

A lista a seguir descreve as possíveis causas comuns desse comportamento:

  • Você especificou um novo número mínimo de nós quando o número atual de nós é maior.
  • Você reduziu a escala vertical manualmente do pool de nós ou do grupo gerenciado de instâncias. Essa operação manual especificou o número de nós com um valor menor do que número mínimo de nós.
  • Você implantou VMs spot com interrupção forçada no pool de nós.
  • O pod tem armazenamento local, e a versão do plano de controle do GKE é anterior à 1.22. Nos clusters do GKE com a versão de plano de controle 1.22 ou posterior, os pods com armazenamento local não bloqueiam mais a redução da escala vertical.
  • O pod tem a anotação "cluster-autoscaler.kubernetes.io/safe-to-evict": "false".

    Para mais etapas de solução de problemas durante eventos de reduzir escala vertical, consulte Cluster não reduzindo escala vertical.

  • Ao reduzir escala vertical, o escalonador automático de clusters respeita o período de carência do encerramento do pod, até um máximo de 10 minutos. Após 10 minutos, os pods têm o encerramento forçado.

  • Talvez o tamanho do pool de nós seja menor que o número mínimo especificado de nós para o cluster. Esse comportamento acontece porque o escalonador automático usa o número mínimo de nós somente quando precisa determinar uma redução da escala vertical. Veja a seguir uma lista das possíveis causas comuns desse comportamento.

Para resolver esse problema, aumente manualmente o tamanho do pool de nós para pelo menos o número mínimo de nós. Para mais informações, consulte como redimensionar manualmente um cluster.

Para mais informações sobre o escalonador automático de cluster e prevenção de interrupções, consulte os seguintes itens nas Perguntas frequentes sobre o escalonador automático de cluster do Kubernetes:

A seguir