Para executar cargas de trabalho (workloads) no seu cluster, você precisa de Nós. Os nós do seu cluster podem ter escalonamento automático (autoscaling) — provisionados dinamicamente ou consolidados para fornecer a capacidade necessária enquanto otimizam os custos. O escalonamento automático é realizado por autoscalers de nós.
Se houver Pods em um cluster que não possam ser agendados nos Nós existentes, novos Nós podem ser adicionados automaticamente ao cluster—provisionados—para acomodá-los. Isso é especialmente útil se o número de Pods muda ao longo do tempo, por exemplo, como resultado da combinação de carga de trabalho horizontal com escalonamento automático de nós.
Os autoscalers provisionam os Nós criando e excluindo os recursos do provedor de nuvem que os sustentam. Mais comumente, os recursos que sustentam os Nós são máquinas virtuais.
O objetivo principal do provisionamento é tornar todos os Pods agendáveis. Esse objetivo nem sempre é atingível devido a várias limitações, incluindo o alcance dos limites de provisionamento configurados, a configuração de provisionamento não ser compatível com um conjunto específico de pods ou a falta de capacidade do provedor de nuvem. Durante o provisionamento, os autoscalers de nós frequentemente tentam atingir objetivos adicionais (por exemplo, minimizar o custo dos Nós provisionados ou equilibrar o número de Nós entre domínios de falha).
Há duas entradas principais para um autoscaler de nós ao determinar quais Nós provisionar—restrições de agendamento de Pods e restrições de Nós impostas pela configuração do autoscaler.
A configuração do autoscaler também pode incluir outros gatilhos de provisionamento de Nós (por exemplo, o número de Nós caindo abaixo de um limite mínimo configurado).
Os Pods podem expressar restrições de agendamento para impor limitações sobre o tipo de Nós em que podem ser agendados. Os autoscalers de nós levam essas restrições em consideração para garantir que os Pods pendentes possam ser agendados nos Nós provisionados.
O tipo mais comum de restrições de agendamento são as solicitações de recursos (resource requests) especificadas pelos contêineres do Pod. Os autoscalers garantirão que os Nós provisionados tenham recursos suficientes para satisfazer as solicitações. No entanto, eles não levam diretamente em consideração o uso real de recursos dos Pods depois de começarem a ser executados. Para escalonar automaticamente os Nós com base no uso real de recursos da carga de trabalho, você pode combinar o escalonamento automático de carga de trabalho horizontal com o escalonamento automático de nós.
Outras restrições comuns de agendamento de Pods incluem afinidade de nó, afinidade entre Pods ou um requisito por um determinado volume de armazenamento.
As especificidades dos Nós provisionados (por exemplo, a quantidade de recursos, a presença de um determinado label) dependem da configuração do autoscaler. Os autoscalers podem escolhê-las a partir de um conjunto pré-definido de configurações de Nós, ou usar provisionamento automático.
O provisionamento automático de nós é um modo de provisionamento no qual o usuário não precisa configurar totalmente as especificidades dos Nós que podem ser provisionados. Em vez disso, o autoscaler escolhe dinamicamente a configuração do Nó com base nos Pods pendentes aos quais está reagindo, bem como nas restrições pré-configuradas (por exemplo, a quantidade mínima de recursos ou a necessidade de um determinado label).
A principal consideração ao executar um cluster é garantir que todos os pods agendáveis estejam em execução, mantendo o custo do cluster o mais baixo possível. Para conseguir isso, as solicitações de recursos dos Pods devem utilizar o máximo possível dos recursos dos Nós. Sob essa perspectiva, a utilização geral dos Nós em um cluster pode ser usada como um indicador (proxy) de quão econômico o cluster é.
Os Nós do seu cluster podem ser automaticamente consolidados para melhorar a utilização geral dos Nós e, por sua vez, a efetividade de custo do cluster. A consolidação acontece através da remoção de um conjunto de Nós subutilizados do cluster. Opcionalmente, um conjunto diferente de Nós pode ser provisionado para substituí-los.
A consolidação, assim como o provisionamento, considera apenas as solicitações de recursos dos Pods e não o uso real de recursos ao tomar decisões.
Para fins de consolidação, um Nó é considerado vazio se tiver apenas Pods de DaemonSet e Pods estáticos em execução nele. Remover Nós vazios durante a consolidação é mais simples do que os não vazios, e os autoscalers geralmente têm otimizações projetadas especificamente para consolidar Nós vazios.
Remover Nós não vazios durante a consolidação é disruptivo—os Pods em execução neles são terminados e possivelmente precisam ser recriados (por exemplo, por um Deployment). No entanto, todos esses Pods recriados devem poder ser agendados nos Nós existentes do cluster ou nos Nós de substituição provisionados como parte da consolidação. Nenhum Pod deveria normalmente ficar pendente como resultado da consolidação.
A configuração do autoscaler também pode permitir o acionamento da consolidação por outras condições (por exemplo, o tempo decorrido desde a criação de um Nó), para otimizar diferentes propriedades (por exemplo, o tempo de vida máximo dos Nós em um cluster).
Os detalhes de como a consolidação é executada dependem da configuração de um determinado autoscaler.
As funcionalidades descritas nas seções anteriores são fornecidas pelos autoscalers de nós. Além da API do Kubernetes, os autoscalers também precisam interagir com as APIs do provedor de nuvem para provisionar e consolidar Nós. Isso significa que eles precisam ser explicitamente integrados a cada provedor de nuvem suportado. O desempenho e o conjunto de recursos de um determinado autoscaler podem diferir entre as integrações com provedores de nuvem.
graph TD
na[Autoscaler de nós]
k8s[Kubernetes]
cp[Provedor de nuvem]
k8s --> |obter Pods/Nós|na
na --> |drenar nós|k8s
na --> |criar/remover recursos subjacentes aos nós|cp
cp --> |obter recursos subjacentes aos nós|na
classDef white_on_blue fill:#326ce5,stroke:#fff,stroke-width:4px,color:#fff;
classDef blue_on_white fill:#fff,stroke:#bbb,stroke-width:2px,color:#326ce5;
class na blue_on_white;
class k8s,cp white_on_blue;
O Cluster Autoscaler e o Karpenter são os dois autoscalers de nós atualmente patrocinados pelo SIG Autoscaling.
Da perspectiva de um usuário de cluster, ambos os autoscalers devem fornecer uma experiência semelhante de escalonamento automático de nós. Ambos provisionarão novos Nós para Pods não agendáveis, e ambos consolidarão os Nós que não estiverem mais sendo utilizados de forma otimizada.
Autoscalers diferentes também podem fornecer recursos fora do escopo do escalonamento automático de nós descrito nesta página, e esses recursos adicionais podem diferir entre eles.
Consulte as seções abaixo e a documentação vinculada dos autoscalers individuais para decidir qual autoscaler se adapta melhor ao seu caso de uso.
O Cluster Autoscaler adiciona ou remove Nós de grupos de nós (Node groups) pré-configurados. Os grupos de nós geralmente correspondem a algum tipo de grupo de recursos do provedor de nuvem (mais comumente um grupo de máquinas virtuais). Uma única instância do Cluster Autoscaler pode gerenciar simultaneamente múltiplos grupos de nós. Durante o provisionamento, o Cluster Autoscaler adicionará Nós ao grupo que melhor se adequa às solicitações dos Pods pendentes. Ao consolidar, o Cluster Autoscaler sempre seleciona Nós específicos para remover, em vez de apenas redimensionar o grupo de recursos subjacente do provedor de nuvem.
Contexto adicional:
O Karpenter provisiona automaticamente Nós com base nas configurações de NodePool fornecidas pelo operador do cluster. O Karpenter cuida de todos os aspectos do ciclo de vida dos nós, não apenas do escalonamento automático. Isso inclui atualizar automaticamente os Nós quando eles atingem um determinado tempo de vida, e atualizar automaticamente os Nós quando novas imagens de worker Node são lançadas. Ele funciona diretamente com recursos individuais do provedor de nuvem (mais comumente máquinas virtuais individuais) e não depende de grupos de recursos do provedor de nuvem.
Contexto adicional:
Principais diferenças entre o Cluster Autoscaler e o Karpenter:
O escalonamento automático de nós geralmente funciona em resposta aos Pods—ele provisiona novos Nós para acomodar Pods não agendáveis e, em seguida, consolida os Nós quando eles não são mais necessários.
O escalonamento automático horizontal de cargas de trabalho escala automaticamente o número de réplicas da carga de trabalho para manter uma utilização média de recursos desejada entre as réplicas. Em outras palavras, ele cria automaticamente novos Pods em resposta à carga da aplicação e, em seguida, remove os Pods quando a carga diminui.
Você pode usar o escalonamento automático de nós junto com o escalonamento automático horizontal de cargas de trabalho para escalonar automaticamente os Nós do seu cluster com base na utilização média real de recursos dos seus Pods.
Se a carga da aplicação aumentar, a utilização média de seus Pods também deve aumentar, levando o escalonamento automático da carga de trabalho a criar novos Pods. O escalonamento automático de nós deve, então, provisionar novos Nós para acomodar os novos Pods.
Quando a carga da aplicação diminui, o escalonamento automático da carga de trabalho deve remover os Pods desnecessários. O escalonamento automático de nós deve, por sua vez, consolidar os Nós que não são mais necessários.
Se configurado corretamente, esse padrão garante que sua aplicação sempre tenha a capacidade de Nós necessária para lidar com picos de carga, se necessário, mas você não precisa pagar pela capacidade quando ela não é necessária.
Ao usar o escalonamento automático de nós, é importante definir corretamente as solicitações de recursos dos Pods. Se as solicitações de um determinado Pod forem muito baixas, provisionar um novo Nó para ele pode não ajudar o Pod a realmente executar. Se as solicitações de um determinado Pod forem muito altas, isso pode impedir incorretamente a consolidação de seu Nó.
O escalonamento automático vertical de cargas de trabalho ajusta automaticamente as solicitações de recursos dos seus Pods com base no seu uso histórico de recursos.
Você pode usar o escalonamento automático de nós junto com o escalonamento automático vertical de cargas de trabalho para ajustar as solicitações de recursos dos seus Pods, preservando as capacidades de escalonamento automático de nós no seu cluster.
Esta seção descreve componentes que fornecem funcionalidades relacionadas ao escalonamento automático de nós.
O descheduler é um componente que fornece funcionalidade de consolidação de nós com base em políticas personalizadas, além de outros recursos relacionados à otimização de Nós e Pods (por exemplo, excluir Pods que reiniciam com frequência).
O Cluster Proportional Autoscaler e o Cluster Proportional Vertical Autoscaler fornecem escalonamento automático horizontal e vertical de cargas de trabalho com base no número de Nós no cluster. Você pode ler mais em escalonamento automático baseado no tamanho do cluster.