TL;DR: Pod не работает → kubectl describe pod + kubectl logs.
Pending = scheduling. CrashLoopBackOff = приложение падает. ImagePullBackOff = образ.
Всегда проверяйте Events.
Алгоритм отладки
Pod не работает
│
├─ Status: Pending
│ └─ kubectl describe pod → Events
│ ├─ Insufficient cpu/memory → увеличить ноду или уменьшить requests
│ ├─ No nodes match selector → проверить nodeSelector/affinity/taints
│ └─ PVC Pending → проверить StorageClass и PV
│
├─ Status: ImagePullBackOff
│ └─ kubectl describe pod → Events
│ ├─ 404 Not Found → проверить имя образа и тег
│ ├─ Unauthorized → создать imagePullSecrets
│ └─ Timeout → проверить сеть ноды
│
├─ Status: CrashLoopBackOff
│ └─ kubectl logs pod (--previous)
│ ├─ Ошибка приложения → исправить код или конфигурацию
│ ├─ OOMKilled → увеличить memory limits
│ └─ Permission denied → проверить securityContext
│
└─ Status: Running, но не отвечает
├─ kubectl logs pod → ошибки?
├─ kubectl exec -it pod -- curl localhost:PORT → приложение работает?
├─ kubectl get endpoints svc → Service видит поды?
└─ kubectl describe ingress → правила маршрутизации?
Ключевые команды
# 1. Статус подовkubectl get pods -o widekubectl get pods --field-selector status.phase!=Running# 2. Events — САМЫЙ ПОЛЕЗНЫЙ источник информацииkubectl get events --sort-by=.metadata.creationTimestampkubectl get events --field-selector involvedObject.name=my-pod# 3. Описание (events + конфигурация)kubectl describe pod my-podkubectl describe svc my-servicekubectl describe node my-node# 4. Логиkubectl logs my-podkubectl logs my-pod -c sidecar # конкретный контейнерkubectl logs my-pod --previous # предыдущий (упавший) контейнерkubectl logs my-pod -f # streamkubectl logs -l app=web --all-containers # все поды по label# 5. Exec (зайти в контейнер)kubectl exec -it my-pod -- /bin/shkubectl exec -it my-pod -- curl localhost:8080/healthkubectl exec -it my-pod -- env # проверить env varskubectl exec -it my-pod -- cat /etc/resolv.conf # DNS# 6. Ресурсыkubectl top pods --sort-by=memorykubectl top nodes# 7. Сетьkubectl get endpoints my-service # IP подов за Servicekubectl run debug --image=busybox -it --rm -- wget -qO- http://my-service
Проблемы по статусам
Pending
kubectl describe pod my-pod# Events:# Warning FailedScheduling Insufficient cpu# Warning FailedScheduling 0/3 nodes are available: 3 node(s) had taint
Причина
Решение
Insufficient cpu/memory
Уменьшить requests или добавить ноды
node(s) had taint
Добавить toleration или убрать taint с ноды
no persistent volumes available
Проверить StorageClass, создать PV
Unschedulable
kubectl uncordon <node>
ImagePullBackOff
kubectl describe pod my-pod# Events:# Warning Failed Failed to pull image "myapp:v99": not found
# 1. Приложение работает внутри?kubectl exec -it my-pod -- curl localhost:8080# 2. Service находит поды?kubectl get endpoints my-service# Если пусто — labels не совпадают# 3. DNS работает?kubectl run debug --image=busybox -it --rm -- nslookup my-service# 4. Проверить readinessProbekubectl describe pod my-pod | grep -A10 "Readiness"
Debug Pod (временный отладочный контейнер)
# Запустить отладочный под в том же namespacekubectl run debug --image=nicolaka/netshoot -it --rm -- /bin/bash# Внутри:curl http://my-service:80nslookup my-servicedig my-service.default.svc.cluster.localtcpdump -i any port 80# Ephemeral debug container (K8s 1.23+)kubectl debug my-pod -it --image=busybox --target=my-container
Типичные ошибки
Ошибка
Симптом
Решение
Смотрят только kubectl get pods
Не видят причину проблемы
kubectl describe pod + kubectl get events
--previous не используют
«Логов нет» для CrashLoop
kubectl logs --previous показывает логи упавшего контейнера
Отладка сети из-за пределов кластера
curl: connection refused
Запустить debug pod внутри кластера
Не проверяют endpoints
«Service не работает»
kubectl get ep svc-name — если пусто, labels не совпадают