O autoescalonamento de clusters no Kubernetes permite gerenciar recursos de forma flexível, adicionando ou removendo nós e pods automaticamente conforme a carga de trabalho.
O número máximo de nós em um grupo não pode exceder o número máximo permitido de nós worker no cluster. Por exemplo, se o limite do cluster for 100 nós e um dos grupos já estiver usando 30 nós, o novo grupo poderá ter no máximo 70 nós.
Para ativar o autoescalonamento durante a criação do cluster, selecione a opção Autoescalonamento na seção Configuração dos nós worker. O número mínimo de nós na criação do cluster é 1.

Se o cluster já foi criado, você pode habilitar o autoescalonamento da seguinte forma:

Parâmetros usados para gerenciar a criação e remoção de nós:
|
Parâmetro |
Descrição |
|
|
Tempo que um nó deve permanecer ocioso antes de ser removido (ex.: 5 minutos). |
|
|
Número máximo de nós que podem ser removidos simultaneamente (ex.: 1). |
|
|
Tempo máximo de espera para criação de um nó (3 minutos). |
|
|
Tempo máximo de inatividade antes de iniciar a redução de nós (3 minutos). |
|
|
Tempo de atraso após adicionar um nó antes de iniciar a redução (3 minutos). |
|
|
Tempo máximo permitido para criar um novo nó (3 minutos). |
Esses parâmetros determinam a velocidade com que os nós são adicionados ou removidos conforme a carga atual. A remoção acontece gradualmente para evitar redução abrupta de recursos. Quando a carga aumenta, novos nós são adicionados com limite de 3 minutos para não causar atrasos.
O autoescalonamento mantém equilíbrio entre disponibilidade de recursos e eficiência de custos.
O autoescalonamento funciona apenas se requests e limits forem especificados no deployment. Exemplo de arquivo de deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- name: example-container
image: example-image
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "400m"
memory: "512Mi"
O Horizontal Pod Autoscaler (HPA) ajusta dinamicamente o número de pods baseado no consumo de recursos, como CPU ou memória. Exemplo de manifest HPA:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: example-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: example-deployment
minReplicas: 1
maxReplicas: 5
targetCPUUtilizationPercentage: 50
Parâmetros do HPA:
apiVersion: versão da API usada (ex.: autoscaling/v1).
kind: tipo do recurso, HorizontalPodAutoscaler.
metadata: metadados, incluindo nome do HPA (example-hpa).
scaleTargetRef: objeto a ser escalado:
apiVersion: versão da API do recurso.
kind: tipo do recurso, Deployment.
name: nome do recurso (example-deployment).
minReplicas: mínimo de réplicas de pods (ex.: 1).
maxReplicas: máximo de réplicas (ex.: 5).
targetCPUUtilizationPercentage: porcentagem de uso de CPU para ajustar réplicas (ex.: 50%).
Para configurar o autoescalonamento, criaremos um deployment Nginx com limites de recursos:
deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
Esse deployment cria um pod Nginx com limites de recursos, essenciais para o HPA.
Para demonstrar o autoescalonamento de pods, use o objeto HPA:
hpa.yaml:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 1
maxReplicas: 4
targetCPUUtilizationPercentage: 20
Neste exemplo, o HPA ajusta o número de réplicas do nginx-deployment baseado na utilização de CPU, mantendo-a em 20%.
Para distribuir a carga entre os pods, use um Service do tipo LoadBalancer:
service.yaml:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
Este serviço fornece acesso aos pods com balanceamento entre múltiplas portas.
Para aplicar os arquivos YAML, use:
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-hpa.yaml
kubectl apply -f nginx-service.yaml
Esses comandos criam o deployment Nginx, HPA e load balancer, gerando todos os componentes para autoescalonamento.
Antes de gerar carga, certifique-se que todos os recursos estão em estado Running. Para observar o autoescalonamento, use a ferramenta hey para enviar requisições HTTP:
Gerar carga:
hey -z 10m -c 20 http://<load_balancer_ip>
Isso gera 10 minutos de carga com 20 conexões paralelas para o serviço Nginx, acionando o escalonamento de réplicas de pods e nós worker, se necessário.
Verificar escalonamento de nós:
kubectl get nodes
Verificar escalonamento de pods (até 4 réplicas conforme hpa.yaml):
kubectl get pods