Usando o Kubernetes Cluster Autoscaler

Descubra como usar o Kubernetes Cluster Autoscaler para redimensionar automaticamente os pools de nós gerenciados em um cluster que você criou usando o Kubernetes Engine (OKE).

Observação

Você não pode usar o Kubernetes Cluster Autoscaler com pools de nós virtuais.

Você pode usar o Kubernetes Cluster Autoscaler para redimensionar automaticamente os pools de nós gerenciados de um cluster com base nas demandas de carga de trabalho do aplicativo. Redimensionando automaticamente os pools de nós de um cluster, você pode garantir a disponibilidade do aplicativo e otimizar os custos.

O Kubernetes Cluster Autoscaler:

  • Adiciona nós de trabalho a um pool de nós quando um pod não pode ser programado no cluster por causa de restrições de recursos insuficientes.
  • Remove nós de trabalho de um pool de nós quando os nós foram subutilizados por um tempo prolongado e quando os pods podem ser colocados em outros nós existentes.

O Kubernetes Cluster Autoscaler aumenta ou diminui o tamanho de um pool de nós automaticamente com base nas solicitações de recursos, não na utilização de recursos dos nós do pool.

O Kubernetes Cluster Autoscaler funciona por pool de nós. Use um arquivo de configuração para especificar quais pools de nós serão direcionados para expansão e contração, os tamanhos mínimo e máximo para cada pool de nós e como você deseja que o dimensionamento automático ocorra. Os pools de nós não referenciados no arquivo de configuração não são gerenciados pelo Kubernetes Cluster Autoscaler.

Para permitir que o Kubernetes Cluster Autoscaler redimensione automaticamente os pools de nós de um cluster com base nas demandas de carga de trabalho do aplicativo, inclua sempre limites de solicitação de recursos nas especificações do pod (requests: em resources:).

Você pode implantar o Kubernetes Cluster Autoscaler em um cluster do Kubernetes de duas maneiras:

Para obter mais informações sobre o Kubernetes Cluster Autoscaler, consulte Cluster Autoscaler e Perguntas Mais Frequentes no GitHub.

Recomendações ao usar o Kubernetes Cluster Autoscaler em Ambientes de Produção

Considere as seguintes recomendações:

  • Sempre tenha pelo menos um pool de nós em um cluster que não seja gerenciado pelo Kubernetes Cluster Autoscaler. Este pool de nós é necessário para executar complementos críticos do cluster e o próprio Kubernetes Cluster Autoscaler. Observe também que é sua responsabilidade dimensionar manualmente todos os pools de nós que não são gerenciados pelo Kubernetes Cluster Autoscaler.
  • Sempre defina várias réplicas para a implantação do Kubernetes Cluster Autoscaler no arquivo de configuração. Se houver apenas uma réplica e ela for removida e não puder ser reprogramada, o Kubernetes Cluster Autoscaler não poderá criar mais nós de trabalho.
  • No arquivo de configuração, defina max-node-provision-time como 25 minutos. Normalmente, novos nós de trabalho são provisionados e movidos para a condição Pronto em muito menos tempo do que isso. No entanto, quando muitos nós são adicionados a um pool de nós ao mesmo tempo, pode levar mais tempo para provisioná-los. Observe que a Console exibe uma advertência ao lado dos nós de trabalho que levam mais de 20 minutos para serem inicializados. Supondo que os nós de trabalho passem para a condição Pronto dentro do tempo especificado para max-node-provision-time, você poderá ignorar a advertência.
  • No arquivo de configuração, você especifica o número máximo de nós permitidos no pool de nós. Certifique-se de que o número máximo de nós especificado não exceda o limite da tenancy para a forma do nó de trabalho definida para o pool de nós. O Kubernetes Cluster Autoscaler nunca criará mais nós do que o limite da tenancy. Se você especificar um número maior que o limite da tenancy, o Kubernetes Cluster Autoscaler tentará periodicamente criar nós adicionais, mas não o fará enquanto o limite da tenancy não tiver sido aumentado.
  • Ao definir clusters que você deseja que o Kubernetes Cluster Autoscaler gerencie, recomendamos criar vários pools de nós com um domínio de disponibilidade especificado por pool de nós.
  • Sempre projete aplicativos para que tolerem as interrupções que podem ocorrer quando o Kubernetes Cluster Autoscaler remove nós de trabalho ou move pods para outro nó de trabalho antes de remover um nó de trabalho subutilizado. Por exemplo, projete aplicativos que aproveitem os orçamentos de interrupção do pod (consulte Especificando um Orçamento de Interrupção para seu Aplicativo na documentação do Kubernetes).
  • Não altere manualmente os pools de nós gerenciados pelo Kubernetes Cluster Autoscaler. Por exemplo, não adicione ou remova nós usando kubectl ou usando a Console (ou a CLI ou API do Oracle Cloud Infrastructure). O Kubernetes Cluster Autoscaler poderá substituir essas alterações ou pode ser que elas modifiquem o comportamento dele. Por exemplo, se você quiser remover todos os nós de um pool de nós gerenciado pelo Kubernetes Cluster Autoscaler, sempre use o Kubernetes Cluster Autoscaler para escalar o pool de nós para zero.

Parâmetros do Kubernetes Cluster Autoscaler Suportados

Você controla como o Kubernetes Cluster Autoscaler redimensiona os pools de nós de um cluster usando parâmetros de configuração.

Os parâmetros de configuração que você pode usar para gerenciar clusters criados pelo Kubernetes Engine e como especificá-los dependem se você está usando o Kubernetes Cluster Autoscaler como um programa independente ou como complemento de cluster.

  • Usando o Kubernetes Cluster Autoscaler como um programa standalone

    Se você estiver usando o Kubernetes Cluster Autoscaler como um programa independente, especifique os parâmetros de configuração em um arquivo de configuração.

    Ao usar o Kubernetes Cluster Autoscaler como um programa independente, você não pode usar os seguintes parâmetros de configuração para gerenciar clusters criados pelo Kubernetes Engine:

    • --node-autoprovisioning-enabled=true: Não suportado.
    • --gpu-total : Não suportado (específico do provedor de nuvem).
    • --expander=price : Não suportado (específico do provedor de nuvem).

    Exceto pelos parâmetros acima, você pode usar qualquer um dos parâmetros de configuração ao usar o Kubernetes Cluster Autoscaler como um programa independente.

    Para obter uma lista completa dos parâmetros de configuração do Kubernetes Cluster Autoscaler, consulte Quais são os parâmetros para CA? nas Perguntas Mais Frequentes do Cluster Autoscaler em GitHub.

  • Usando o Kubernetes Cluster Autoscaler como um complemento de cluster

    Se você estiver usando o Kubernetes Cluster Autoscaler como um complemento de cluster, especifique os parâmetros de configuração em um arquivo de configuração (ao usar a CLI ou a API) ou na Console.

    Ao usar o Kubernetes Cluster Autoscaler como um complemento de cluster, você não pode usar os seguintes parâmetros de configuração para gerenciar clusters criados pelo Kubernetes Engine:

    • --node-autoprovisioning-enabled=true: Não suportado.
    • --gpu-total : Não suportado (específico do provedor de nuvem).
    • --expander=price : Não suportado (específico do provedor de nuvem).

    Observe que vários outros parâmetros de configuração do Kubernetes Cluster Autoscaler também não são suportados ao usar o Kubernetes Cluster Autoscaler como um complemento de cluster.

    Para obter uma lista dos parâmetros de configuração suportados ao usar o Kubernetes Cluster Autoscaler como um complemento de cluster, juntamente com os nomes a serem usados ao especificá-los, consulte Argumentos de configuração do complemento do Cluster Autoscaler.

Observações sobre o Kubernetes Cluster Autoscaler

Observe o seguinte:

  • O Kubernetes Cluster Autoscaler adiciona e remove nós de e para pools de nós existentes em clusters existentes. Mais especificamente, observe que o Kubernetes Cluster Autoscaler:

  • Ao remover nós de trabalho de um pool de nós, o Kubernetes Cluster Autoscaler respeita as regras de programação e remoção de pods. Essas regras podem impedir que o Kubernetes Cluster Autoscaler remova um nó de trabalho.

    Por exemplo, por padrão, o Kubernetes Cluster Autoscaler não removerá nós que executam pods kube-system (como pods coredns), com exceção de pods DaemonSet ou espelho. Você pode controlar esse comportamento usando um parâmetro de configuração (skip-nodes-with-system-pods quando implantado como um programa independente, skipNodesWithSystemPods quando implantado como um complemento de cluster). O parâmetro é definido como true por padrão.

    Para obter mais informações, consulte Que tipo de pod pode impedir que a CA remova um nó? em Perguntas Frequentes do Cluster Autoscaler no GitHub.

  • Se você estiver usando o Terraform e o Kubernetes Cluster Autoscaler para gerenciar pools de nós, observe que o Terraform pode reverter as alterações para o tamanho de um pool de nós feito pelo Kubernetes Cluster Autoscaler. Para evitar esse comportamento, use o recurso ignore_changes do Terraform, que é especificamente destinado a situações em que o Terraform compartilha responsabilidade por gerenciar um único objeto com outro processo. Por exemplo, quando um recurso é criado com referência a dados que podem mudar no futuro, mas você não quer que essas alterações potenciais de dados afetem o recurso após sua criação. O metaargumento ignore_changes especifica atributos de recursos que o Terraform deve ignorar ao planejar atualizações para o objeto remoto associado. Para obter mais informações, consulte O Metaargumento do Ciclo de Vida na documentação do Terraform.

    Por exemplo:

    resource "node_pool_1" "example" {
      # ...
    
      lifecycle {
        ignore_changes = [
          node_config_details.size
        ]
      }
    }
  • Quando você faz upgrade de um cluster para uma nova versão do Kubernetes, é sua responsabilidade fazer upgrade manualmente do Kubernetes Cluster Autoscaler para torná-lo compatível com a nova versão do Kubernetes do cluster. O upgrade do Kubernetes Cluster Autoscaler não é feito automaticamente.
  • Para usar o Kubernetes Cluster Autoscaler para gerenciar um cluster que você criou com o Kubernetes Engine, o cluster deve estar executando determinadas versões do Kubernetes da seguinte forma:
    • Ao usar o Kubernetes Cluster Autoscaler como um programa independente, os clusters devem estar executando o Kubernetes versão 1.17 ou posterior.
    • Ao usar o Kubernetes Cluster Autoscaler como um complemento de cluster, os clusters devem estar executando o Kubernetes versão 1.25 ou posterior.
  • Você pode usar o Kubernetes Cluster Autoscaler com pools de nós gerenciados, mas não com pools de nós virtuais.