Requests, limits e PodDisruptionBudget: como ler um manifest de Kubernetes sem se enganar
Quase todo incidente de upgrade e boa parte do desperdício de custo em Kubernetes passam por poucos campos do manifest: requests, limits, readinessProbe, replicas e o PodDisruptionBudget. Eles parecem simples, e é por isso que os erros ficam.
Requests: o campo que define o custo
O request é o que o scheduler reserva para o pod no nó. O nó é cobrado inteiro, então o custo do cluster segue os requests, e não o uso. Um pod que pede 2 CPUs e usa 200m ocupa o mesmo espaço de um que usa as 2.
Isso tem três efeitos:
- Requests inflados criam nós que parecem cheios e estão ociosos, e nenhum autoscaler resolve isso sozinho.
- Requests ausentes deixam o pod sem reserva. Ele cai na classe de QoS
BestEffortouBurstablee é um dos primeiros a ser removido quando o nó fica sem memória. - Autoscalers, consolidação e o planejamento de Savings Plans dependem de requests corretos.
Para definir valores, parta do uso observado, por exemplo o percentil 95 mais uma folga, e não de um palpite. O rightsizing-check compara requests com o uso (arquivos ou Prometheus) e diz o que definir.
Limits: CPU e memória se comportam diferente
- Memória. Passou do limite, o container é encerrado por OOM. Sem limite, um vazamento pode consumir o nó inteiro. Por isso o ideal é ter um limite de memória, perto do request.
- CPU. Passou do limite, o container é limitado (throttling), não encerrado. Limites de CPU apertados podem aumentar a latência sem aparecer como erro. Muitos times usam request de CPU sem limite de CPU, e isso é uma decisão válida, desde que seja uma decisão.
Quando requests e limits são iguais em todos os containers, o pod é Guaranteed, a classe mais protegida. É um bom padrão para cargas críticas, ao custo de menos aproveitamento do nó.
readinessProbe: o que decide quem recebe tráfego
Sem readinessProbe, o pod é considerado pronto assim que o container sobe. Durante um deploy ou uma consolidação, o Service pode enviar tráfego para um pod que ainda está iniciando. A probe também importa para o PDB, porque ele conta pods prontos.
PodDisruptionBudget: o que ele protege e o que não protege
Um PDB limita quantos pods de um serviço podem ficar indisponíveis ao mesmo tempo durante disrupções voluntárias: drenagem de nós, upgrades e consolidação do Karpenter ou do Cluster Autoscaler.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: checkout
spec:
minAvailable: 1
selector:
matchLabels:
app: checkoutOs erros mais comuns:
- Seletor que não casa. Se
matchLabelsnão corresponde aos labels do pod, o PDB não protege nada e nenhum erro aparece. Confira comkubectl get pdbe veja seALLOWED DISRUPTIONSfaz sentido. - `minAvailable` igual ao número de réplicas (ou
maxUnavailable: 0). Nenhum pod pode ser removido, e o upgrade de nós trava. Deixe sempre uma folga. - Uma única réplica com `minAvailable: 1`. Mesmo problema: o pod nunca pode sair.
- Achar que o PDB cobre falha de nó. Ele não cobre. Em Spot, por exemplo, o aviso de dois minutos limita o que uma drenagem consegue fazer, e é por isso que réplicas e spread importam mais que o PDB.
Como checar tudo isso de uma vez
O checker de manifests lê seus YAMLs no navegador, sem enviar nada, e aponta requests ausentes, falta de limite de memória, falta de readiness, tag latest, réplica única, ausência de PDB e de spread, cruzando o seletor do PDB com os labels do pod. Para o cluster em si, o spot-readiness aplica regras parecidas e gera um plano do que pode ir para Spot.
Um roteiro curto
- Rode o checker nos manifests do serviço mais crítico.
- Corrija requests e memória primeiro: têm o maior efeito em custo e estabilidade.
- Adicione readiness e, nos serviços com 2 ou mais réplicas, um PDB e
topologySpreadConstraints. - Teste uma drenagem de nó em homologação e veja se o PDB deixa passar o que deve.
Para entender o efeito financeiro de corrigir requests, use a calculadora de economia. Se quiser uma revisão do seu cluster, o assessment de eficiência é o ponto de partida.
Artigos relacionados
Quer aplicar isso no seu ambiente?
Agende uma conversa de 30 minutos sem compromisso. Eu olho o seu cenário e digo por onde começar.
Agendar uma conversaReceba os novos artigos por e-mail
Um e-mail quando sair artigo novo sobre infraestrutura, backend e IA. Sem spam, cancele quando quiser.