Autoscaling para zero nós
O escalonamento automático de um grupo de nós até zero ajuda a economizar recursos quando eles não estão em uso. Isso é útil para tarefas pontuais (por exemplo, Jobs) ou ambientes de staging que ficam inativos durante a noite.
Requisitos Copiar link
Para que o escalonamento até zero funcione, o cluster deve ter pelo menos dois nós adicionais que permaneçam permanentemente ativos. Esses nós podem pertencer a grupos diferentes. Eles são usados para executar os componentes do sistema do Kubernetes.
Configuração de Pods Copiar link
Para que o autoscaler inicie nós no grupo desejado, especifique o ID desse grupo no manifesto usando nodeSelector ou nodeAffinity.
Você pode usar tanto o ID do grupo de nós de trabalho quanto um rótulo personalizado atribuído ao grupo como condição. Os rótulos permitem um posicionamento flexível dos pods e evitam o acoplamento rígido a IDs específicos.
Como encontrar o ID do grupo
- Acesse a seção Kubernetes e clique no cluster.
- Abra a aba Recursos.
- Clique nos três pontos ao lado do grupo e selecione Editar grupo.
- O ID do grupo será exibido na URL, por exemplo:
https://my.hostman.com/kubernetes/1048329/54289/editOnde:
1048329: ID do cluster54289: ID do grupo de nós
Exemplo com nodeSelector:
nodeSelector:
k8s.hostman.com/cluster-node-group-id: "54289"Exemplo com nodeAffinity:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: k8s.hostman.com/cluster-node-group-id
operator: In
values:
- "54289"Quando o escalonamento para zero não funciona Copiar link
O autoscaler não poderá remover o último nó de um grupo nos seguintes casos:
- O pod possui a anotação:
cluster-autoscaler.kubernetes.io/safe-to-evict: "false" - Os pods não podem ser movidos para outros nós devido a restrições do scheduler
- Um
PodDisruptionBudgetimpede a exclusão de pods sem exceder o limite definido - O pod não é gerenciado por um controller (
Deployment,StatefulSet,Job,ReplicaSet)
Exemplo prático Copiar link
Neste exemplo, criaremos um grupo de nós com escalonamento automático para zero habilitado, executaremos um Job nele e veremos como o cluster cria automaticamente um nó para executar a tarefa e o remove após a conclusão.
Ao criar um grupo de nós de trabalho, você pode definir rótulos personalizados e utilizá-los para o posicionamento de pods. Neste exemplo, o ID do grupo é usado para simplificar.
Pré-requisitos
Um cluster Kubernetes existente com pelo menos um grupo de nós.
Criar um grupo de nós com autoescalonamento para zero Copiar link
- Acesse a seção Kubernetes e clique no cluster.
- Abra a aba Recursos.
- Clique em Adicionar grupos.
- Selecione a configuração do worker node.
- Ative Autoescalonamento e defina o número mínimo de nós como 0.
Após a criação do grupo, um nó será exibido e será removido automaticamente se não houver pods de usuário em execução.
Agora o cluster possui dois grupos:
- Um grupo com nós ativos que não escalam para zero
- Um grupo com autoescalonamento para zero habilitado. Neste exemplo, o ID é 54289
Verificar os nós existentes Copiar link
Execute o comando:
kubectl get nodesExemplo de saída:
NAME STATUS ROLES AGE VERSION
worker-192.168.0.25 Ready <none> 21h v1.33.3+k0s
worker-192.168.0.8 Ready <none> 22h v1.33.3+k0sCriar um Job Copiar link
Crie um arquivo chamado job.yaml com o seguinte conteúdo:
apiVersion: batch/v1
kind: Job
metadata:
name: hello-job
spec:
ttlSecondsAfterFinished: 30
template:
metadata:
name: hello-job
spec:
restartPolicy: Never
nodeSelector:
k8s.hostman.com/cluster-node-group-id: "54289"
containers:
- name: hello
image: busybox
command:
- sh
- -c
- 'i=0; while [ $i -lt 10 ]; do echo "Hello from job"; sleep 30; i=$((i+1)); done'
resources:
requests:
cpu: "50m"
memory: "32Mi"
limits:
cpu: "100m"
memory: "64Mi"Este Job executa um contêiner usando a imagem busybox que grava uma mensagem no log 10 vezes em intervalos de 30 segundos.
Observação: na seção nodeSelector, especificamos o ID do grupo de nós (54289).
Aplique o manifesto:
kubectl apply -f job.yamlVerifique a lista de pods:
kubectl get podExemplo de saída:
NAME READY STATUS RESTARTS AGE
hello-job-s7ktd 0/1 Pending 0 4sO pod está com status Pending porque ainda não há nós no grupo. Vá até a seção Recursos no painel de Hostman; você verá que um novo nó está sendo criado no grupo de autoescalonamento.
Após a criação do nó, verifique novamente:
kubectl get nodesExemplo de saída:
NAME STATUS ROLES AGE VERSION
worker-192.168.0.25 Ready <none> 21h v1.33.3+k0s
worker-192.168.0.6 Ready <none> 7m v1.33.3+k0s
worker-192.168.0.8 Ready <none> 22h v1.33.3+k0sworker-192.168.0.6 é o novo nó criado para o Job.
Verifique o pod novamente:
kubectl get podExemplo de saída:
NAME READY STATUS RESTARTS AGE
hello-job-s7ktd 1/1 Running 0 5m30sAgora o pod está em execução.
Conclusão do Job e remoção do nó Copiar link
Após a conclusão do Job, o nó onde ele estava em execução receberá um taint. Visualize o taint com:
kubectl describe node worker-192.168.0.6Procure a linha:
Taints: DeletionCandidateOfClusterAutoscaler=1755679271:PreferNoScheduleIsso significa que o nó foi marcado para exclusão. Dois minutos após a aplicação do taint, o nó será removido.
Verifique com:
kubectl get nodes