Введение / Зачем это нужно
Логи (logs) в Kubernetes — это основной источник информации о работе контейнеров и подов. Они помогают диагностировать ошибки, отслеживать состояние приложений и понимать, что происходит внутри кластера. В этом гайде вы узнаете, как эффективно просматривать, фильтровать и анализировать логи с помощью стандартного инструмента kubectl на Linux. После выполнения вы сможете быстро находить нужную информацию в логах и отлаживать приложения в Kubernetes.
Требования / Подготовка
Перед началом убедитесь, что:
- У вас есть доступ к кластеру Kubernetes (файл kubeconfig настроен).
- Установлен
kubectl(версия, совместимая с вашим кластером). Проверить:kubectl version --client. - У вас есть права на просмотр подов и логов в нужных namespace.
- Вы знакомы с базовыми командами
kubectl(get, describe).
Если kubectl не установлен, установите его согласно официальной документации для вашего дистрибутива Linux.
💡 Совет: Если вы только начинаете работать с Kubernetes, сначала освоите базовые команды
kubectl get podsиkubectl describe pod, чтобы понимать структуру кластера.
Основные команды для работы с логами
Просмотр логов пода
Самый простой способ получить логи пода — команда:
kubectl logs <имя_пода>
Например:
kubectl logs nginx-7cdbd8cd56-abcde
Эта команда выведет логи первого контейнера в поде. Если в поде несколько контейнеров, нужно указать имя контейнера.
Указание контейнера в поде с несколькими контейнерами
Если под содержит несколько контейнеров, используйте флаг -c:
kubectl logs <имя_пода> -c <имя_контейнера>
Пример:
kubectl logs my-app-pod -c sidecar-container
Отслеживание логов в реальном времени
Чтобы видеть логи по мере их появления, добавьте флаг -f (follow):
kubectl logs -f <имя_пода>
Это особенно полезно для отладки запускающихся приложений или мониторинга.
Получение логов предыдущего экземпляра контейнера
Если контейнер перезапускался, можно получить логи предыдущего экземпляра с помощью флага --previous:
kubectl logs <имя_пода> --previous
Фильтрация логов по времени
Чтобы получить логи за определенный период, используйте:
--since— относительное время (например,5m,1h).--since-time— абсолютное время в формате RFC3339 (например,2026-02-16T10:00:00Z).
Примеры:
kubectl logs <имя_пода> --since=5m
kubectl logs <имя_пода> --since-time=2026-02-16T09:00:00Z
Ограничение количества строк
По умолчанию kubectl logs выводит все доступные логи. Чтобы ограничить вывод последними N строками, используйте --tail:
kubectl logs <имя_пода> --tail=100
Работа с namespace
Если под находится в нестандартном namespace, укажите его флагом -n:
kubectl logs <имя_пода> -n <namespace>
Экспорт логов в файл
Чтобы сохранить логи в файл на локальной машине, перенаправьте вывод:
kubectl logs <имя_пода> > pod-logs.txt
Для многоконтейнерного пода:
kubectl logs <имя_пода> -c <контейнер> > container-logs.txt
Просмотр логов нескольких подов одновременно (расширенный способ)
Стандартный kubectl logs не поддерживает одновременный просмотр логов нескольких подов. Для этого можно использовать сторонние инструменты, например:
- stern — логирование по селектору лейблов.
- kubetail — скрипт на bash для мульти-подового просмотра.
Установка stern:
# Для Linux (пример для Ubuntu)
sudo wget https://github.com/wercker/stern/releases/download/1.24.0/stern_linux_amd64 -O /usr/local/bin/stern
sudo chmod +x /usr/local/bin/stern
Пример использования stern:
stern . --namespace default
Эта команда будет выводить логи всех подов в namespace default, соответствующих селектору (в данном случае все).
Проверка результата
После выполнения команд вы должны увидеть текстовые логи в терминале или в сохраненном файле. Убедитесь, что:
- Логи содержат ожидаемые записи (например, сообщения приложения, ошибки).
- Время логов соответствует заданным фильтрам (если использовались).
- Для многоконтейнерных подов вы просматриваете логи нужного контейнера.
Если логи пустые, проверьте, что контейнер действительно пишет в stdout/stderr. Некоторые приложения пишут логи в файлы внутри контейнера; в таком случае нужно использовать kubectl exec для доступа к файлу.
Возможные проблемы
⚠️ Важно: Некоторые проблемы могут возникать из-за ограничений Kubernetes (например, объем хранимых логов) или настроек RBAC. В этом разделе рассмотрены частые случаи.
Ошибка "Error from server (NotFound): pods ... not found"
Убедитесь, что имя пода указано правильно и он существует в указанном namespace. Проверьте список подов: kubectl get pods -n <namespace>.
Пустые логи
Контейнер может не выводить логи в stdout/stderr. Проверьте конфигурацию приложения. Также возможно, что под только что запущен и логи еще не появились. Подождите немного или проверьте логи предыдущего экземпляра (--previous).
Ошибка доступа (Forbidden)
Ваш пользователь может не иметь прав на просмотр логов. Проверьте RBAC-роли. Нужны права get, list на ресурсы pods/log.
Логи обрезаются или неполные
По умолчанию Kubernetes хранит ограниченный объем логов (зависит от конфигурации kubelet). Если логи слишком старые, они могут быть удалены. Используйте внешний сбор логов (например, Elasticsearch, Fluentd) для долгосрочного хранения.
Медленная передача логов при использовании -f
При большом объеме логов или высокой задержке сети потоковая передача может быть медленной. В таком случае можно сначала получить лог файлом, а затем анализировать локально.
Логи не загружаются после перезапуска пода
Если под перезапускается, логи предыдущего экземпляра доступны только если контейнер сохранил их (флаг --previous). Однако если под был удален и создан заново (новый UID), логи предыдущего пода недоступны. В этом случае нужно настроить централизованное логирование.