Короткий ответ
Команда kubectl logs <pod> [-c <container>] показывает логи текущего работающего контейнера; для логов контейнера, который уже упал и был перезапущен, нужно добавить флаг --previous, чтобы получить вывод предыдущего завершившегося экземпляра.
Как это работает подробнее
kubelet собирает stdout/stderr контейнера в локальный лог-файл на узле, а kubectl logs читает его через API сервер. Когда контейнер перезапускается (например, из-за CrashLoopBackOff), новый процесс стартует "с нуля" и его логи не содержат информации о причине предыдущего падения — для этого нужен именно --previous.
Пример кода
Команды и вывод
kubectl logs app-7d9f -c worker --previous --tail=100Что использовать на практике
- Практика. для Pod с несколькими контейнерами обязательно указывать
-c <container-name>, иначе kubectl либо запросит уточнение, либо покажет логи первого контейнера. Для потокового просмотра в реальном времени используют флаг-f, а для агрегации логов со всех реплик — внешние системы логирования (не встроенная функция kubectl).
Подводные камни
- Риски. пытаться смотреть логи только текущего запуска после
CrashLoopBackOff, не находя причину падения, хотя она была в предыдущем запуске; не указывать-cв multi-container Pod и анализировать логи не того контейнера; путатьkubectl logs(логи приложения) сkubectl describe pod(события Kubernetes, включая причины рестартов).