Kubernetes 101: Resource Limits
Fala galera! Seis tão baum?
No Kubernetes, a gestão eficiente dos recursos (CPU e memória) é fundamental para garantir a estabilidade do cluster e evitar que um pod consuma mais do que deveria, afetando outras aplicações. Para isso, utilizamos Resource Requests e Resource Limits.
Neste artigo, vamos explorar como funcionam os limites de recursos, como configurá-los e monitorá-los, e a importância de definir corretamente esses valores para manter um ambiente Kubernetes saudável.
O que são Resource Requests e Limits?
No Kubernetes, ao definir recursos para um pod, você pode especificar dois tipos de valores:
- Requests: a quantidade mínima de CPU e memória garantida para o pod. O agendador usa esses valores para decidir em qual nó colocar o pod.
- Limits: o limite máximo de CPU e memória que o pod pode consumir. Se um pod tentar exceder esses valores, o Kubernetes pode restringir ou até encerrar o pod.
Sintaxe básica:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
kind: Pod
metadata:
name: meu-pod
spec:
containers:
- name: meu-container
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- CPU é medido em milicores (1000m = 1 core).
- Memória é medida em bytes (Mi = Mebibytes).
Como funciona na prática
- Criando um pod com Resource Limits
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
name: resource-limited-pod
spec:
containers:
- name: stress-container
image: polinux/stress
command: ["stress"]
args: ["--cpu", "1", "--vm", "1", "--vm-bytes", "100M", "--vm-hang", "1"]
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Aplicar o pod:
1
kubectl apply -f resource-limited-pod.yaml
- Checando o consumo de recursos
Você pode monitorar o uso de CPU e memória dos pods com o comando:
1
kubectl top pod
Exemplo de saída:
1
2
NAME CPU(cores) MEMORY(bytes)
resource-limited-pod 300m 110Mi
Se os limites forem ultrapassados, você verá o pod sendo encerrado ou ficando no estado OOMKilled.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
name: stress-test
spec:
containers:
- name: stress-container
image: polinux/stress
command: ["stress"]
args: ["--cpu", "2", "--vm", "1", "--vm-bytes", "200M", "--vm-hang", "1"]
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Aplicar o pod:
1
kubectl apply -f stress-test.yaml
Verificando o status do pod:
1
kubectl describe pod stress-test
Saída esperada ao ultrapassar o limite:
1
2
State: Terminated
Reason: OOMKilled
QoS Classes (Classes de Qualidade de Serviço)
O Kubernetes classifica os pods em diferentes classes de QoS, dependendo de como você configura requests e limits:
- Guaranteed: quando requests e limits são iguais para todos os recursos.
- Burstable: quando requests são definidos, mas os limits são maiores.
- BestEffort: quando nenhum request ou limit é definido.
Exemplo:
1
kubectl get pod resource-limited-pod -o custom-columns="NAME:.metadata.name,QOS:.status.qosClass"
Saída esperada
1
2
NAME QOS
resource-limited-pod Burstable
Conclusão
Configurar Resource Limits corretamente é essencial para manter a estabilidade e a performance dos seus clusters Kubernetes. Requests e limits ajudam a:
- Garantir que cada pod tenha os recursos mínimos necessários.
- Proteger o cluster contra pods que consomem recursos excessivos.
- Classificar pods em QoS, permitindo maior previsibilidade no agendamento.
Lembre-se de sempre testar seus workloads e avaliar qual abordagem se encaixa melhor nas necessidades da sua infraestrutura.
Não defina valores arbitrários! Monitore o uso real dos pods com kubectl top pod e ajuste requests e limits conforme necessário.
Você pode acessar a documentação oficial aqui: Resource Management for Pods and Containers
É isso, galera! Se você gostou do artigo, comenta ou mande pra galera que também quer aprender Kubernetes!
Se você tiver alguma dúvida ou comentário, sinta-se à vontade para compartilhá-los conosco na seção de comentários abaixo!
Forte Abraço!