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:
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 desejado. 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 desejado.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
desse 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 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:
A programação personalizada com filtros alterados não é compatível.
Os nós não serão escalonar verticalmente se os pods tiverem um valor
PriorityClass
abaixo de-10
. Saiba mais em Como o escalonador automático de cluster funciona com prioridade e 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.
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:
- 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 clusters remova um nó?