kubectl logs команды: полное руководство по анализу логов контейнеров в Kubernetes | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

kubectl logs команды: полное руководство по анализу логов контейнеров в Kubernetes

05 апреля 2026 8 мин. чтения

Работа с логами подов — фундаментальный навык для любого DevOps-инженера или администратора Kubernetes. Когда приложение ведет себя некорректно, именно логи становятся первым источником истины. Это практическое руководство предоставит вам полный набор команд kubectl logs, проверенных в реальных production-средах. Вы научитесь не только просматривать вывод, но и целенаправленно анализировать его для решения конкретных проблем: от падения пода (CrashLoopBackOff) до ошибок бизнес-логики (5xx) и сбоев проб готовности. Мы разберем как базовые сценарии, так и работу с логами завершенных подов и init-контейнеров, что сэкономит вам часы на отладке.

Базовые команды kubectl logs: быстрый старт для ежедневной отладки

Этот раздел содержит минимальный, но достаточный набор команд для немедленного применения. Акцент на копипаст и решение самых частых задач: просмотр, потоковый мониторинг и работа с мультиконтейнерными подами.

Просмотр логов активного пода: основа основ

Самая первая и часто используемая команда. Когда возникает проблема, вам нужно сразу увидеть вывод приложения. Базовая команда выглядит так:

kubectl logs <pod-name>

Если под находится не в неймспейсе default, обязательно укажите его с помощью флага -n или --namespace:

kubectl logs my-app-pod-xyz123 -n production

На выходе вы получите стандартный вывод (stdout) и ошибки (stderr) основного контейнера в поде. Часто подов с одним лейблом бывает несколько (например, реплики Deployment). В этом случае используйте селектор лейбла -l для просмотра логов первого найденного пода:

kubectl logs -l app=my-backend

Потоковый вывод логов в реальном времени (follow)

Для мониторинга поведения приложения «здесь и сейчас» — во время деплоя, нагрузочного тестирования или воспроизведения ошибки — используется потоковый вывод. Это аналог команды tail -f в мире Kubernetes.

kubectl logs -f <pod-name>

Команда будет непрерывно выводить новые записи логов в терминал до тех пор, пока вы не прервете выполнение комбинацией клавиш Ctrl+C. Этот метод незаменим для отслеживания процесса старта приложения, когда нужно убедиться, что все зависимости загружены и сервис успешно биндится на порт.

Выбор контейнера в поде с несколькими контейнерами

В современных микросервисных архитектурах распространены поды с несколькими контейнерами: основное приложение, sidecar-адаптер для логирования (например, Fluent Bit), синхронизатор секретов или init-контейнеры. Если выполнить команду kubectl logs <pod-name> для такого пода, вы получите ошибку: error: a container name must be specified for pod....

Решение — указать имя целевого контейнера с помощью флага -c или --container:

kubectl logs my-pod -c application-container
kubectl logs my-pod -c fluent-bit-sidecar

Чтобы узнать имена всех контейнеров в конкретном поде, используйте команду описания:

kubectl describe pod <pod-name>

В секции «Containers» вы найдете список. Этот подход критически важен для отладки взаимодействия между контейнерами в одном поде, например, когда sidecar не может отправить логи во внешнюю систему.

Анализ логов для отладки приложений: от симптома к причине

Переход от простого просмотра к целенаправленному анализу. Здесь мы разберем пошаговые алгоритмы действий для трех типичных проблемных сценариев, с которыми сталкивается каждый инженер.

Кейс: Под постоянно перезапускается (CrashLoopBackOff)

Состояние CrashLoopBackOff — одна из самых тревожных проблем, указывающая, что контейнер запускается, сразу завершается с ошибкой, и Kubernetes пытается перезапустить его с экспоненциальной задержкой. Алгоритм анализа:

  1. Просмотр логов последнего запуска: Так как текущий контейнер может быть уже завершен, используйте флаг --previous для доступа к логам предыдущего инстанса.
    kubectl logs <pod-name> --previous
  2. Анализ последних строк: Ищите ошибки инициализации: отсутствие файлов конфигурации или переменных окружения, ошибки прав доступа (permission denied), проблемы с подключением к зависимостям (базе данных, брокеру сообщений). Часто причина кроется в последних 5-10 строках вывода.
  3. Проверка init-контейнеров: Если в поде определены init-контейнеры, их сбой также приводит к CrashLoopBackOff основного контейнера. Проверьте их логи:
    kubectl logs <pod-name> -c <init-container-name>

Кейс: Приложение работает, но возвращает ошибки (5xx, 4xx)

Когда под жив и здоров, но бизнес-логика дает сбои, нужно искать ошибки в самом коде приложения. Методика:

  1. Мониторинг в реальном времени в момент запроса: Запустите потоковый вывод логов и воспроизведите проблемный пользовательский сценарий.
    kubectl logs -f <pod-name> -c <app-container>
  2. Фильтрация по ключевым словам: Используйте grep (если ваша оболочка поддерживает пайпинг) для отсечения информационных сообщений.
    kubectl logs <pod-name> | grep -i "error\|exception\|failed"
  3. Поиск по контексту: Ищите стек-трейсы (stack trace), уникальные идентификаторы запросов (correlation/request ID), которые обычно логируются вместе с ошибкой, и временные метки, совпадающие со временем инцидента.

Кейс: Под завис или не отвечает (Liveness/Readiness probe failures)

Сбои проб (probe failures) указывают, что приложение не проходит проверки жизнеспособности или готовности со стороны Kubernetes. Анализ:

  1. Проверка успешного старта: В логах ищите подтверждение, что приложение биндится на ожидаемый порт (Started on port 8080, Listening on 0.0.0.0:8080).
  2. Поиск ошибок зависимостей: После старта приложение может пытаться подключиться к базе данных, кешу или другому микросервису. Ошибки подключения (Connection refused, Timeout) часто приводят к fail пробы готовности. Ищите их в логике инициализации приложения.
  3. Анализ потребления ресурсов: Иногда под «зависает» из-за нехватки памяти (OOM) или 100% утилизации CPU. Хотя это не всегда прямо видно в логах приложения, косвенным признаком может быть полное отсутствие новых записей в логе после определенного момента. Для глубокой диагностики таких проблем стоит обратиться к нашему руководству по полной диагностике ресурсов в Kubernetes, где разбираются инструменты проактивного мониторинга.

Работа с логами завершенных и удаленных подов

Стандартная команда logs работает только с работающими подами. Однако для анализа редких сбоев часто нужны логи уже «умершего» контейнера. Важно понимать, что по умолчанию Kubernetes хранит логи завершенных подов на ноде ограниченное время (зависит от настроек драйвера логирования и ротации).

Команда --previous: доступ к логам предыдущего инстанса

Самый простой способ получить логи только что упавшего контейнера — флаг --previous. Он работает, если под был перезапущен в рамках того же объекта управления (например, Pod, созданный Deployment).

kubectl logs <pod-name> --previous

Ограничение: Эта команда не сработает, если под был удален полностью (например, kubectl delete pod), а не пересоздан контроллером. В этом случае логи будут безвозвратно утеряны, если не используется система централизованного сбора логов (Loki, Elasticsearch с Fluentd).

Инициация сбора логов: как получить логи init-контейнеров

Init-контейнеры выполняются и завершаются до старта основных контейнеров. Их логи недоступны через стандартный вызов kubectl logs <pod-name>, даже если они уже завершили работу. Для доступа к ним необходимо явно указать имя init-контейнера.

kubectl logs <pod-name> -c <init-container-name>

Это работает, пока основной под существует. Например, init-контейнер мог выполнить миграцию базы данных и завершиться с ошибкой, что привело к остановке всего пода. Просмотр его лога — ключ к пониманию причины.

Для управления жизненным циклом таких приложений, где init-контейнеры играют критическую роль, глубокое понимание объекта Deployment и его стратегий обновления становится особенно важным.

Продвинутые приемы и шпаргалка DevOps-инженера

Этот раздел содержит инструменты для эффективной работы, позволяющие отсекать шум и быстро получать релевантную информацию. Команды совместимы с актуальными версиями Kubernetes 1.28+.

Фильтрация и форматирование вывода

Управление объемом выводимых данных — залог скорости анализа.

  • Ограничение по количеству строк: Флаг --tail выводит только N последних записей.
    kubectl logs <pod-name> --tail=50
  • Фильтрация по времени: Флаги --since и --since-time.
    kubectl logs <pod-name> --since=1h  # Логи за последний час
    kubectl logs <pod-name> --since-time="2026-04-05T10:00:00Z" # С конкретного времени
  • Пайпинг для обработки: Комбинируйте с стандартными утилитами Unix.
    kubectl logs <pod-name> | grep "ERROR" | head -20  # Первые 20 ошибок
    kubectl logs <pod-name> --tail=1000 | jq '. | select(.level == "error")' # Для JSON-логов

Сбор логов с группы подов по лейблу

Для анализа поведения всего Deployment или Service, когда проблема проявляется на части реплик.

kubectl logs -l app=my-frontend

Важно: Вывод от всех подов, попадающих под селектор, будет перемешан в хронологическом порядке (если включены временные метки). Для четкого разделения можно использовать цикл в оболочке:

for pod in $(kubectl get pods -l app=my-frontend -o name); do
  echo "\n=== Logs from $pod ==="
  kubectl logs $pod --tail=10
done

Шпаргалка: все команды в одной таблице

Готовый справочник для сохранения в заметки. Экономит время в критических ситуациях.

Сценарий Команда Пояснение
Базовый просмотр логов kubectl logs <pod-name> Вывод логов основного контейнера.
Потоковый мониторинг kubectl logs -f <pod-name> Непрерывный вывод новых записей (аналог tail -f).
Выбор контейнера kubectl logs <pod-name> -c <container-name> Для подов с несколькими контейнерами.
Логи предыдущего инстанса kubectl logs <pod-name> --previous Если контейнер перезапустился (CrashLoopBackOff).
Логи init-контейнера kubectl logs <pod-name> -c <init-container-name> Даже если init-контейнер завершен.
Последние N строк kubectl logs <pod-name> --tail=100 Ограничить объем вывода.
Логи за период kubectl logs <pod-name> --since=30m Фильтрация по времени (минуты, часы).
Логи по лейблу kubectl logs -l app=myapp Сбор логов со всех подов, отмеченных лейблом.

Освоив эти команды, вы сможете эффективно диагностировать большинство проблем в кластере. Для комплексного управления развертываниями, частью которого является и анализ логов, также полезно иметь под рукой шпаргалку по командам Helm — стандартного инструмента управления пакетами в Kubernetes. А если ваше приложение работает в Docker, методы анализа логов контейнеров, описанные в нашем руководстве по управлению Docker-контейнерами в 2026, станут логичным дополнением к вашему инструментарию.

Поделиться:
Сохранить гайд? В закладки браузера