Kubernetes: debugging подов
Отладка подов в Kubernetes — одна из самых частых задач DevOps-инженера. Когда приложение падает или ведёт себя некорректно, важно быстро найти причину. Рассмотрим основные инструменты и техники.
Базовая диагностика
# Статус пода
kubectl get pod myapp -n production
kubectl describe pod myapp -n production
# Логи (текущие)
kubectl logs myapp -n production
# Логи (предыдущий контейнер при рестарте)
kubectl logs myapp -n production --previous
# Логи всех подов по лейблу
kubectl logs -l app=myapp -n production --all-containers
CrashLoopBackOff: анализ причин
CrashLoopBackOff — самая частая проблема. Под запускается, падает, перезапускается снова и снова. Алгоритм диагностики:
- Посмотрите
kubectl describe pod— раздел Events покажет причину - Проверьте логи текущего и предыдущего контейнера
- Убедитесь, что
commandиargsуказаны правильно - Проверьте переменные окружения
- Проверьте readiness/liveness probes
# Частые причины CrashLoopBackOff:
# 1. Ошибка в приложении (посмотрите логи)
# 2. Неправильный command/args
# 3. Отсутствует файл или переменная окружения
# 4. NPE или OOMKill
# Проверка OOMKill
kubectl describe pod myapp | grep -A 5 "Last State"
# Проверка exit code
kubectl get pod myapp -o jsonpath='{.status.containerStatuses[*].lastState.terminated.reason}'
Ephemeral containers
Ephemeral контейнеры позволяют добавить отладочный контейнер к уже запущенному поду, не пересоздавая его. Это критично, когда проблема воспроизводится только в production:
# Добавление ephemeral контейнера
kubectl debug myapp -n production -it --image=busybox --target=myapp
# С кастомным именем
kubectl debug myapp -n production -it \
--image=nicolaka/netshoot \
--container=debugger \
--target=myapp
Ephemeral контейнер наследует namespace, volumes и network основного контейнера. Это позволяет отлаживать сеть, проверять файловую систему и запускать утилиты.
kubectl debug: node-level
Для отладки проблем на ноде (не в поде):
# Отладочная нода
kubectl debug node/worker-1 -it --image=ubuntu
# Внутри отладочной нода можно:
# - Смотреть процессы
# - Проверять сетевые соединения
# - Анализировать файловую систему
# - Проверять диск и память
Ephemeral контейнеры требуют Kubernetes 1.23+ и включённую feature gate EphemeralContainers. В managed Kubernetes (EKS, GKE, AKS) они доступны по умолчанию.
Отладка сети
# Проверка DNS
kubectl exec myapp -it -- nslookup kubernetes.default
# Проверка сетевых соединений
kubectl exec myapp -it -- ss -tlnp
# Трафик между подами
kubectl exec myapp -it -- wget -qO- http://service-b.namespace:8080/health
# С помощью netshoot
kubectl debug myapp -it --image=nicolaka/netshoot -- tcpdump -i eth0 port 8080
Полезные команды
# Все поды с проблемами
kubectl get pods --field-selector=status.phase!=Running
# Поды с OOMKill
kubectl get pods -o json | jq '.items[] | select(.status.containerStatuses[]?.lastState.terminated.reason == "OOMKilled") | .metadata.name'
# Ресурсы пода
kubectl top pod myapp -n production
# Эвенты кластера (проблемы с scheduling)
kubectl get events --field-selector reason=FailedScheduling
Checklist при debugging
- Проверьте статус пода и Events
- Посмотрите логи текущего и предыдущего контейнера
- Проверьте resource limits и OOMKill
- Убедитесь, что probes настроены правильно
- Проверьте переменные окружения и ConfigMaps
- Используйте ephemeral container для глубокой отладки
- Проверьте сетевые policies и DNS
Заключение
Kubernetes предоставляет мощные инструменты для отладки: ephemeral containers, kubectl debug, детальные логи и эвенты. Ключ — последовательно исключать возможные причины и использовать правильные инструменты на каждом этапе.