Como resolver pod Pending no Kubernetes
Um pod em Pending foi aceito pelo cluster mas ainda não começou a rodar. Quase sempre é o scheduler que não acha um nó onde ele caiba, e ele diz o porquê no evento FailedScheduling.
1. Leia o evento FailedScheduling
kubectl describe pod <pod> -n <namespace>
kubectl get events -n <namespace> --field-selector reason=FailedScheduling O que a mensagem quer dizer
- Insufficient cpu ou Insufficient memory: nenhum nó tem request livre suficiente. O que conta é a soma dos requests, não o uso real. Reduza o request, adicione nós ou deixe o autoscaler do cluster subir um nó.
- untolerated taint: os nós têm um taint que o pod não tolera (nós de sistema, GPU, spot). Adicione a toleration ou mande o pod para outro pool.
- didn't match Pod's node affinity/selector: nenhum nó tem os labels pedidos no nodeSelector ou na afinidade.
- unbound immediate PersistentVolumeClaims: o PVC não conseguiu um volume. Veja com kubectl describe pvc: StorageClass errada, sem provisionador ou cota de disco da nuvem.
- volume node affinity conflict: o disco está numa zona e os nós com espaço estão em outra.
- Too many pods: o nó chegou ao máximo de pods, que no AKS e no EKS depende da configuração de rede do nó.
2. Veja quanto ainda cabe em cada nó
kubectl describe nodes | grep -A 8 "Allocated resources"
kubectl top nodes Pending já com nó
Se o pod já tem nó (coluna NODE no kubectl get pod -o wide) e continua Pending, o problema é depois do scheduler: imagem sendo baixada (veja ImagePullBackOff), volume montando ou init container rodando. O describe mostra em qual etapa ele parou.
Sem terminal, no Kubepier
No Kubepier, os pods em Pending entram na contagem de pods com problema e eventos de aviso como o FailedScheduling sobem para o topo, com o consumo por nó ao lado, de qualquer cluster, no navegador ou no celular.