Ativar o escalonamento automático de clusters

Neste documento, descrevemos o escalonamento automático de um cluster de usuário no Google Distributed Cloud.

O escalonamento automático de clusters aumenta ou diminui o número de nós em um pool de nós com base nas demandas das cargas de trabalho.

Antes de começar

Leia sobre as limitações do escalonador automático de clusters.

O escalonador automático de clusters parte das seguintes premissas:

  • Todos os pods replicados podem ser reiniciados em outro nó, o que pode causar uma interrupção breve. Se os serviços não tolerarem interrupções, não recomendamos o uso do escalonador automático de clusters.

  • Usuários ou administradores não gerenciam nós manualmente. Se o escalonamento automático estiver ativado para um pool de nós, não será possível modificar o campo replicas do pool de nós.

  • Todos os nós em um único pool têm o mesmo conjunto de rótulos.

Como funciona o escalonamento automático de clusters

O escalonador automático de clusters funciona com base em um pool de nós. Ao ativar o escalonamento automático para um pool de nós, você especifica um número mínimo e máximo de nós para o pool.

O escalonador automático de clusters aumenta ou diminui o número de nós no pool automaticamente com base nas solicitações de recursos dos pods em execução nos nós, em vez da utilização real de recursos. Ele verifica periodicamente o status de pods e nós e realiza as seguintes ações:

  • Se os pods forem não programáveis porque não há nós suficientes no pool, o escalonador automático de cluster adicionará nós até o máximo especificado.

  • Se os nós forem subutilizados e todos os pods puderem ser programados com menos nós no pool, o escalonador automático de cluster removerá nós até o mínimo especificado. Se isso não for possível, ele será forçado a ser encerrado e o disco anexado gerenciado pelo Kubernetes será removido com segurança.

Se os pods solicitaram poucos recursos (ou não alteraram os padrões, o que pode ser insuficiente) e os nós estão passando por uma escassez, o escalonador automático de clusters não corrige essa situação. Para garantir que o escalonador automático de clusters funcione com precisão, faça solicitações de recursos explícitas para todas as cargas de trabalho.

Para um pool de nós individual, minReplicas precisa ser ≥ 1. No entanto, a soma dos nós de cluster de usuário sem taint em qualquer momento precisa ser pelo menos três. Isso significa que a soma dos valores minReplicas de todos os pools de nós com escalonamento automático, além da soma dos valores replicas de todos os pools de nós sem escalonamento automático, precisa ser pelo menos três.

O escalonador automático de clusters considera o custo relativo dos tipos de instâncias nos vários pools de nós e tenta expandi-los de maneira a causar o menor desperdício possível.

Criar um cluster de usuário com escalonamento automático

Para criar um cluster de usuário com escalonamento automático ativado para um pool de nós, preencha a seção autoscaling do pool de nós no arquivo de configuração do cluster de usuário. Exemplo:

nodePools:
- name: pool‐1
  …
  replicas: 3
  ...
  autoscaling:
    minReplicas: 1
    maxReplicas: 5

A configuração anterior cria um pool de nós com três réplicas e aplica o escalonamento automático com o tamanho mínimo do pool de nós como 1 e o tamanho máximo como 5.

O valor minReplicas precisa ser ≥ 1 Um pool de nós não pode reduzir escala verticall para zero nós.

Adicione um pool de nós com escalonamento automático

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

  1. Edite o arquivo de configuração do cluster de usuário para adicionar um novo pool de nós e inclua uma seção autoscaling para o pool. Defina os valores de replicas, minReplicas e maxReplicas conforme desejado. Exemplo:

    nodePools:
    - name: my-new-node-pool
      …
      replicas: 3
      ...
      autoscaling:
        minReplicas: 2
        maxReplicas: 6
    
  2. Atualize o cluster:

    gkectl update cluster --config USER_CLUSTER_CONFIG \
      --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

Ativar o escalonamento automático de um pool de nós atual

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

  1. Edite um nodePool específico no arquivo de configuração do cluster de usuário e inclua a seção autoscaling. Defina os valores de minReplicas e maxReplicas conforme desejado.

    nodePools:
    - name: my-existing-node-pool
      …
      replicas: 3
      ...
      autoscaling:
        minReplicas: 1
        maxReplicas: 5
    
  2. Atualize o cluster:

    gkectl update cluster --config USER_CLUSTER_CONFIG \
      --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

Desativar o escalonamento automático de um pool de nós atual

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

  1. Edite o arquivo de configuração do cluster de usuário e remova a seção autoscaling desse pool de nós.

  2. Execute gkectl update cluster.

Verifique o comportamento do escalonador automático de cluster

É possível determinar o que o escalonador automático de cluster está fazendo de várias maneiras.

Verifique os registros do escalonador automático de cluster

Primeiro, encontre o nome do pod do escalonador automático de clusters:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods -n USER_CLUSTER_NAME | grep cluster-autoscaler

Verifique os registros no pod do escalonador automático de clusters:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG logs cluster-autoscaler-POD_NAME --container cluster-autoscaler -n USER_CLUSTER_NAME

Substitua POD_NAME pelo nome do pod do escalonador automático de cluster.

Verifique o mapa de configuração

O escalonador automático de cluster publica o mapa de configuração kube-system/cluster-autoscaler-status.

Para ver o mapa de configuração:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get configmap cluster-autoscaler-status -n kube-system -o yaml

Verifique os eventos de escalonamento automático do cluster.

É possível verificar os eventos de escalonamento automático do cluster:

  • Em pods (especialmente aqueles que não podem ser programados ou em nós subutilizados)
  • Em nós
  • No mapa de configuração do kube-system/cluster-autoscaler-status.

Limitações

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

Solução de problemas

  • 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).

  • Se você tiver problemas com a diminuição de cluster, consulte Programação e interrupção de pods. Talvez seja necessário adicionar um PodDisruptionBudget para os pods kube-system. Para mais informações sobre como adicionar manualmente um PodDisruptionBudget para os pods kube-system, consulte as Perguntas frequentes do escalonador automático de cluster do Kubernetes.

  • Ao reduzir a escala, o escalonador automático 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:

  • O PodDisruptionBudget de um aplicativo pode impedir o escalonamento automático. Se a exclusão de nós fizer com que o orçamento seja excedido, a escala vertical do cluster não será reduzida.

Mais informações

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 do Kubernetes: