Troubleshooting e Produção
Aula 8 de 8
Debugging de Pods
# Pod não inicia?
kubectl describe pod nome-pod
# Events: mostra erros de imagem, resource limits, volume mount
kubectl logs nome-pod
kubectl logs --previous nome-pod # último restart
kubectl logs -l app=api --tail=50 # todos pods com label
kubectl exec -it nome-pod -- sh
kubectl exec -it nome-pod -c container-name -- sh # multi-container
# Port forward para testar
kubectl port-forward pod/nome-pod 8080:80
Pod Stuck — Causas Comuns
Pending:
├── Resource Insufficient → falta CPU/memória no cluster
├── PersistentVolume not found → PVC não bound
├── Node selector não encontra nó compatível
└── Taints/Tolerations → pod não tolera nó
CrashLoopBackOff:
├── Application error → ver logs
├── Liveness probe failing → ajustar probe
├── Memory limit muito baixo → OOMKilled
└── ConfigMap/Secret não encontrado
ImagePullBackOff:
├── Nome da imagem errado
├── Credenciais do registry inválidas
└── Registry privado sem imagePullSecrets
Debug com Ephemeral Container
# Adicionar container debug em pod rodando (K8s 1.23+)
kubectl debug pod/nginx-pod -it \
--image=nicolaka/netshoot \
--target=nginx
# Dentro do container debug:
# curl, dig, tcpdump, nc, etc.
Troubleshooting de Rede
# Testar DNS
kubectl run test --image=busybox:1.28 --rm -it -- nslookup kubernetes.default
# Testar conectividade
kubectl run test --image=busybox:1.28 --rm -it -- wget -O- http://api-service
# Ver endpoints do service
kubectl get endpoints api-service
# Ver regras iptables (kube-proxy)
kubectl get configmap kube-proxy -n kube-system -o yaml
# tcpdump no pod
kubectl exec pod-name -- tcpdump -i eth0
Node Troubleshooting
# Estado dos nós
kubectl get nodes -o wide
kubectl describe node nome-node
# Condições
kubectl get node -o jsonpath='{.items[*].status.conditions}'
# Ready, DiskPressure, MemoryPressure, PIDPressure, NetworkUnavailable
# Drenar nó (manutenção)
kubectl drain nome-node --ignore-daemonsets --delete-emptydir-data
kubectl uncordon nome-node # reativar
# Executar debug no nó (se acesso SSH)
# systemctl status kubelet
# journalctl -u kubelet -f
# crictl ps (containerd CLI)
Metrics Server
# Instalar Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# Uso
kubectl top nodes
kubectl top pods
kubectl top pods -n prod
# Verificar recursos por pod
kubectl top pod --containers
Backup e DR
# Backup etcd (essencial!)
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/etcd-server.crt \
--key=/etc/kubernetes/pki/etcd/etcd-server.key
# Restaurar
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot.db \
--data-dir=/var/lib/etcd-restored
# Velero (backup de objetos + volumes)
velero install --provider aws --bucket k8s-backups \
--backup-location-config region=us-east-1
velero backup create daily --ttl 168h
velero restore create --from-backup daily
Certificação CKA Checklist
- ✅ kubectl apply/delete/get/describe/logs/exec
- ✅ Pods, Deployments, StatefulSets, DaemonSets
- ✅ Services (ClusterIP, NodePort, LoadBalancer)
- ✅ ConfigMaps e Secrets
- ✅ PersistentVolumeClaims
- ✅ NetworkPolicies
- ✅ RBAC (Roles, RoleBindings, ServiceAccounts)
- ✅ Ingress e Ingress Controller
- ✅ Helm charts (install, upgrade, rollback)
- ✅ kubectl drain/uncordon/cordon
- ✅ kubectl taint nodes
- ✅ kubectl top (metrics)
- ✅ kubectl rollout status/undo
- ✅ kubectl scale deployments
- ✅ Troubleshooting: describe, logs, events
Troubleshooting sistemático: check events → logs → describe → exec. Metrics Server é essencial para diagnóstico de recursos. Backup de etcd é obrigatório — sem ele, não há recovery.