Ответ
Диагностика в Kubernetes строится по принципу "от общего к частному". Вот мой стандартный алгоритм действий:
1. Быстрый обзор состояния кластера и workloads:
# Смотрю общее состояние подов в нужном namespace
$ kubectl get pods -n <namespace> -o wide
# Если под в состоянии CrashLoopBackOff, Pending или Error, смотрю события
$ kubectl describe pod <pod-name> -n <namespace>
# В секции 'Events' часто сразу видна причина (нехватка ресурсов, ошибка образа, провал проб)
2. Анализ логов приложения:
# Логи последнего запуска контейнера
$ kubectl logs <pod-name> -n <namespace>
# Логи с предыдущего запуска (если контейнер падал)
$ kubectl logs <pod-name> -n <namespace> --previous
# Логи конкретного контейнера в multi-контейнерном поде
$ kubectl logs <pod-name> -c <container-name> -n <namespace>
# Логи в реальном времени (tail -f)
$ kubectl logs -f <pod-name> -n <namespace>
3. Проверка конфигурации и ресурсов:
# Для проблем с развертыванием
$ kubectl describe deployment <deployment-name> -n <namespace>
$ kubectl get events --sort-by='.metadata.creationTimestamp' -n <namespace> | tail -20
# Проверка ресурсов (лимиты/запросы)
$ kubectl top pod -n <namespace>
$ kubectl describe node <node-name> | grep -A 10 "Allocated resources"
# Диагностика сети: проверка эндпоинтов сервиса и DNS
$ kubectl get endpoints <service-name> -n <namespace>
$ kubectl exec -it <pod-name> -n <namespace> -- nslookup <service-name>.<namespace>.svc.cluster.local
4. Использование отладочных подов (debug pods):
# Запуск временного пода с сетевыми утилитами для тестирования подключений
$ kubectl run debug-pod --image=nicolaka/netshoot -it --rm --restart=Never -- /bin/bash
# Внутри пода можно использовать curl, dig, traceroute и т.д.
5. Инструменты мониторинга: В продакшене всегда настраиваю сбор логов (Loki, ELK) и метрик (Prometheus, Grafana) для proactive-диагностики.