kb.erickguedes.com
Kubernetes: Orquestração em Produção

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.