Escalonador automático de cluster

Nesta página, você verá como redimensionar automaticamente os pools de nós do cluster do Google Kubernetes Engine (GKE) com base nas demandas das cargas de trabalho. Quando a demanda é alta, o escalonador automático de cluster adiciona nós ao pool. Quando ela é baixa, o escalonador automático do cluster volta para um tamanho mínimo designado por você. Isso pode aumentar a disponibilidade das cargas de trabalho quando você precisar delas e, ao mesmo tempo, controlar os custos. Também é possível configurar o escalonador automático de cluster em um cluster.

Visão geral

O escalonador automático de cluster do GKE faz o escalonamento automático do número de nós em um determinado pool de nós, com base nas demandas das cargas de trabalho. Não é preciso adicionar ou remover manualmente nós ou provisionar os pools de nós em excesso. Em vez disso, especifique um tamanho mínimo e máximo para o pool de nós, e o restante é automático.

Se os recursos forem excluídos ou movidos durante o escalonamento automático do cluster, as cargas de trabalho poderão sofrer interrupções temporárias. Por exemplo, se a carga de trabalho consistir em um controlador com uma única réplica, o pod dessa réplica poderá ser remarcado em um nó diferente caso o nó atual seja excluído. Antes de ativar o escalonador automático de cluster, projete as cargas de trabalho para tolerar possíveis interrupções ou garantir que os pods críticos não sejam interrompidos.

Como funciona o escalonador automático de cluster

O escalonador automático de cluster funciona por pool de nós. Ao configurar um pool de nós com ele, você especifica os tamanhos mínimo e máximo para o pool de nós.

O escalonador automático de cluster aumenta ou diminui o tamanho do pool de nós automaticamente com base nas solicitações de recursos dos usuários em execução nos nós do conjunto de nós, em vez da utilização real de recursos. Ele verifica periodicamente o status de pods e nós e toma as seguintes medidas:

  • Se os pods forem não-modificáveis porque não há nós suficientes no pool de nós, o escalonador automático de cluster acrescentará nós até o tamanho máximo do pool de nós.
  • Se os nós forem subutilizados e todos os pods puderem ser programados mesmo com menos nós no pool de nós, o escalonador automático de cluster removerá nós até o tamanho mínimo do pool de nós. Se o nó não puder ser reduzido corretamente após um tempo limite (atualmente 10 minutos), ele será encerrado. O período de carência não é configurável para clusters do GKE.

Se os pods tiverem solicitado poucos recursos (ou não tiverem alterado os recursos padrão, o que pode ser insuficiente) e os nós estiverem passando por uma escassez, o escalonador automático de clusters não corrigirá a situação. Para garantir que o autoescalador de cluster trabalhe com a maior precisão possível, faça solicitações de recursos explícitas para todas as cargas de trabalho.

Critérios de operação

O autoescalador de clusters parte dos seguintes pressupostos ao redimensionar um pool de nós:

  • Todos os pods replicados podem ser reiniciados em outro nó, o que pode causar uma breve interrupção. Se os serviços não puderem ser interrompidos, o uso do escalonador automático de cluster não é recomendado.
  • Usuários ou administradores não estão gerenciando manualmente os nós. Qualquer operação de gerenciamento manual de nós realizada pode ser substituída.
  • Todos os nós em um único pool têm o mesmo conjunto de rótulos.
  • O escalonador automático de clusters considera o custo relativo dos tipos de instâncias nos vários pools e tenta expandir o mais barato possível. O custo reduzido de pools de nós contendo VMs preemptivas é considerado.
  • Os rótulos adicionados manualmente após a criação inicial do cluster ou do pool de nós não são rastreados. Os nós criados pelo escalonador automático de cluster recebem rótulos especificados com --node-labels no momento da criação do pool de nós.

Balanceamento entre zonas

Se o pool de nós tiver vários grupos com instâncias gerenciadas do mesmo tipo, o autoescalador de cluster tentará manter o tamanho desses grupos balanceado durante o aumento da escala. Isso evita uma distribuição desigual de nós entre os grupos de instâncias gerenciadas em várias zonas de um pool de nós.

Para saber mais sobre como o escalonador automático de cluster toma decisões de balanceamento, consulte as Perguntas frequentes sobre escalonamento automático (em inglês) na documentação do Kubernetes.

Tamanho mínimo e máximo do pool de nós

Você pode especificar os tamanhos mínimo e máximo de cada pool de nós no cluster. O autoescalador de clusters tomará as decisões de redimensionamento dentro desses limites. Ao ativar o escalonamento automático, se o tamanho atual do pool de nós for menor que o mínimo ou maior que o máximo especificado, o escalonador automático entrará em ação somente após um novo nó ser necessário ou quando um nó puder ser excluído com segurança.

Limites do escalonamento automático

Ao fazer o escalonamento automático de clusters, os limites de dimensionamento do pool de nós são determinados pela disponibilidade da zona.

Por exemplo, o comando a seguir cria um cluster com várias zonas de escalonamento automático com seis nós em três zonas, com um mínimo de um nó por zona e um máximo de quatro nós por zona:

gcloud container clusters create example-cluster \
  --zone us-central1-a \
  --node-locations us-central1-a,us-central1-b,us-central1-f \
  --num-nodes 2 --enable-autoscaling --min-nodes 1 --max-nodes 4

O tamanho total do cluster é de 3 a 12 nós, distribuídos por três zonas. Se uma delas falhar, o tamanho total do cluster fica entre dois e oito nós.

Perfis de escalonamento automático

A decisão de quando remover um nó está relacionada à otimização da utilização ou à disponibilidade de recursos. Remover nós subutilizados melhora o uso do cluster, mas talvez novas cargas de trabalho precisem esperar que os recursos sejam provisionados novamente antes de serem executadas.

Quando tomar essas decisões, especifique qual perfil de escalonamento automático deve ser usado. Os perfis disponíveis no momento são:

  • balanced: o perfil padrão.
  • optimize-utilization: prioriza a otimização do uso em vez de manter recursos sobressalentes no cluster. Quando selecionado, o escalonador automático do cluster reduz o escalonamento de forma mais agressiva: ele pode remover mais nós e mais rapidamente. Esse perfil foi otimizado para uso com cargas de trabalho em lote que não são sensíveis à latência de inicialização. No momento, não recomendamos o uso desse perfil com a disponibilização de cargas de trabalho.

Na versão 1.18 e posterior do GKE, quando você especifica o perfil de escalonamento automático optimize-utilization, o GKE prefere programar pods em nós que já têm alta utilização, ajudando o escalonador automático de cluster a identificar e remover nós subutilizados. Para alcançar essa otimização, o GKE define o nome do programador na especificação do pod como gke.io/optimize-utilization-scheduler. Os pods que especificam um programador personalizado não são afetados.

O comando a seguir ativa o perfil de escalonamento automático optimize-utilization em um cluster atual:

gcloud beta container clusters update example-cluster \
--autoscaling-profile optimize-utilization

Como considerar a programação e a interrupção do pod

Ao reduzir a escala, o autoescalador de clusters respeita as regras de programação e remoção definidas nos pods. Essas restrições podem impedir que um nó seja excluído pelo autoescalador. A exclusão de um nó pode ser evitada se ele contiver um pod com qualquer uma das seguintes condições:

Com o PodDisruptionBudget (em inglês) de um aplicativo, também é possível impedir o escalonamento automático. Se a exclusão de nós fizer com que o orçamento seja excedido, o cluster não terá a escala reduzida.

Para mais informações sobre o escalonador automático de clusters e prevenção de interrupções, consulte os seguintes itens nas Perguntas frequentes sobre o escalonador automático de clusters (em inglês):

Mais informações

Veja mais informações sobre o escalonador automático de clusters nas Perguntas frequentes sobre escalonamento automático no projeto de código aberto do Kubernetes (em inglês).

Limitações

O escalonador automático de cluster tem as seguintes limitações:

  • PersistentVolumes locais.
  • Como escalonar verticalmente um grupo de nós de tamanho 0 para pods que solicitam recursos além da CPU, da memória e da GPU (por exemplo, armazenamento temporário).
  • O escalonador automático de clusters é compatível com até 5.000 nós executando 30 pods cada. Para mais detalhes sobre as garantias de escalonabilidade, consulte este relatório.
  • Ao reduzir o dimensionamento, o escalonador automático de clusters respeita um período de encerramento de 10 minutos para reprogramar os pods do nó em um nó diferente antes de forçar seu encerramento.
  • Em alguns casos, não será possível reduzir a escala com o escalonador automático de cluster, e haverá um nó extra após esse processo. Isso ocorre quando os pods necessários do sistema são programados em nós diferentes. O motivo é porque não há nenhum acionador nesses pods para transferir para um nó diferente. Consulte a pergunta Tenho um par de nós com baixa utilização, mas ele não está com a escala reduzida. Por quê? (em inglês). Para contornar essa limitação, configure um orçamento de interrupção de pod (em inglês).
  • A programação personalizada com Filtros alterados não é compatível.

A seguir