O Kubernetes classifica automaticamente cada Pod em uma QoS Class baseada em seus resource requests e limits. Isso determina quem morre primeiro quando o node fica sem memória.
$ kubectl get pod <nome> -o jsonpath='{.status.qosClass}'# Retorna: Guaranteed, Burstable ou BestEffort$ kubectl describe pod <nome> | grep QoS# QoS Class: Burstable
Todos os containers têm requests E limits definidos, E requests == limits (para CPU e memória).
O Kubernetes garante que esses pods recebem exatamente os recursos solicitados. São os últimos a serem evictados quando o node tem pressão de memória.
resources:
requests:
memory: "256Mi"
cpu: "500m"
limits:
memory: "256Mi" # igual ao request
cpu: "500m" # igual ao requestAPIs críticas de produção, bancos de dados, qualquer workload onde latência e disponibilidade são prioridade máxima.
Pelo menos um container tem requests ou limits definidos, mas não é Guaranteed (requests ≠ limits ou algum container sem definição).
Pode usar mais recursos do que solicitou (burst) quando disponível. É evictado quando o node tem pressão, priorizando pods com maior uso relativo ao request.
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "512Mi" # diferente do request
cpu: "1000m" # diferente do requestMaioria dos workloads: serviços com carga variável que podem ter picos mas não são ultra-críticos.
Nenhum container tem requests ou limits definidos.
Usa recursos disponíveis sem garantia alguma. São os primeiros evictados quando o node fica com pressão de memória, independente do uso atual.
# Sem resources definidos = BestEffort
spec:
containers:
- name: app
image: nginx
# sem resources: ← BestEffortApenas para tarefas não-críticas: jobs de desenvolvimento local, scratchpads, experimentos.
Quando o node fica sem memória, o kubelet remove pods nessa ordem:
CPU é throttled (limitada) quando um pod excede o limit, mas o pod não é morto. A aplicação fica mais lenta, não morre. Por isso CPU limit alto é menos arriscado que memory limit baixo.
Memória não pode ser throttled. Quando um processo excede o memory limit, o kernel mata o processo com OOMKill (exit code 137). Por isso memory limit baixo causa CrashLoopBackOff.