Este documento descreve o escalonamento automático para um cluster de usuários 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 cluster.
O escalonador automático de clusters parte dos seguintes pressupostos:
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 cluster.
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 substituir 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 autoescalador de cluster funciona por 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 cluster aumenta ou diminui o número de nós no pool automaticamente com base nas solicitações de recursos (e não na utilização real de recursos) dos pods em execução nos nós. Ele verifica periodicamente o status de pods e nós e toma as seguintes medidas:
Se os pods não puderem ser programados porque não há nós suficientes no pool, o escalonador automático de cluster vai 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 não for possível esvaziar um nó, ele será encerrado forçadamente, e o disco gerenciado pelo Kubernetes anexado será removido com segurança.
Se os pods tiverem solicitado poucos recursos (ou não alteraram os recursos padrão, o que pode ser insuficiente) e os nós estiverem passando por uma escassez, o autoescalador de clusters não corrigirá a situação. Para garantir que o escalonador automático de cluster 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 expandir o pool de nós de forma 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 o 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 3 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 do pool de nós como 5.
O valor minReplicas
precisa ser ≥ 1 Um pool de nós não pode ser escalonado verticalmente 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:
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 dereplicas
,minReplicas
emaxReplicas
conforme necessário. Exemplo:nodePools: - name: my-new-node-pool … replicas: 3 ... autoscaling: minReplicas: 2 maxReplicas: 6
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:
Edite um
nodePool
específico no arquivo de configuração do cluster de usuário e inclua a seçãoautoscaling
. Defina os valores deminReplicas
emaxReplicas
conforme pretendido.nodePools: - name: my-existing-node-pool … replicas: 3 ... autoscaling: minReplicas: 1 maxReplicas: 5
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:
Edite o arquivo de configuração do cluster de usuário e remova a seção
autoscaling
deste pool de nós.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 cluster:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods -n USER_CLUSTER_NAME | grep cluster-autoscaler
Verifique os registros no pod do escalonador automático de cluster:
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 conferir 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 cluster tem as seguintes limitações:
A programação personalizada com filtros alterados não é compatível.
Os nós não serão escalonados se os pods tiverem um valor
PriorityClass
abaixo de-10
. Saiba mais em Como o escalonador automático de cluster funciona com a prioridade e a preempção do pod?.O escalonamento automático para pools de nós do Windows não é compatível.
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 podskube-system
. Para mais informações sobre como adicionar manualmente umPodDisruptionBudget
para os podskube-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:
As regras de afinidade ou antiafinidade impedem a reprogramação.
O pod tem armazenamento local.
O pod não é gerenciado por um controlador, como Deployment, StatefulSet, Job ou ReplicaSet.
O pod está no namespace kube-system e não tem um PodDisruptionBudget (link em inglês).
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, o cluster não terá a escala 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:
- Como funciona a redução de escala?
- O escalonador automático de clusters funciona com o PodDisruptionBudget em redução de escala?
- Que tipos de pods podem impedir que o escalonador automático de cluster remova um nó?