Как смотреть логи приложений в Kubernetes
Что проверяют
Практический навык отладки в кластере, а не заученную команду. Интервьюеру важно, знает ли кандидат про упавший контейнер, про поды с несколькими контейнерами, про ротацию и про то, что логи исчезают вместе с подом.
Как отвечать
База:
kubectl get pods -n <ns> # найти под
kubectl logs <pod> -n <ns> # логи
kubectl logs <pod> -c <container> # если контейнеров в поде несколько
kubectl logs -f <pod> --tail=100 # следить в реальном времени
kubectl logs <pod> --previous # логи предыдущего, упавшего контейнера
kubectl logs <pod> --since=15m
kubectl logs -l app=checkout --all-containers --max-log-requests=10
kubectl logs deploy/checkout # один под из деплоймента--previous это главный ключ при CrashLoopBackOff: текущий контейнер только что стартовал и причину падения не покажет.
Рядом с логами всегда смотрят состояние: kubectl describe pod <pod> даёт события, причину рестарта и код выхода (OOMKilled, ImagePullBackOff, проваленный readiness-пробник), kubectl get events --sort-by=.lastTimestamp показывает общую картину по неймспейсу. Если под вообще не стартовал, логов может не быть, ответ будет только в событиях.
Ограничения, которые стоит назвать:
kubectl logsотдаёт только stdout и stderr контейнера. Если приложение пишет в файл внутри контейнера, вывод будет пустым: нуженkubectl exec <pod> -- cat /var/log/app.logили перенастройка приложения на stdout;- логи лежат на ноде и ротируются kubelet по размеру, старые части теряются;
- удалили под, отскейлили деплоймент, нода уехала: логов больше нет.
Поэтому в проде ставят централизованный сбор: агент DaemonSet (Fluent Bit, Vector, Promtail) читает /var/log/containers/*.log на каждой ноде и шлёт в Loki, OpenSearch или ELK, а смотрят через Grafana или Kibana. Для QA это принципиально: можно искать по времени прогона, по идентификатору запроса и по трассировке через несколько сервисов, а не по одному поду.
Полезные мелочи: stern app -n ns показывает логи всех подов по маске сразу с подсветкой, а если приложение пишет структурированный JSON, вывод удобно фильтровать через jq. Для отчёта о баге прикладывают не скриншот, а выгрузку с --since-time и точным именем пода.
Где спотыкаются
При CrashLoopBackOff смотрят kubectl logs без --previous, видят пустой вывод и делают вывод, что приложение ничего не логирует.