Как посмотреть логи контейнера в pod?
Как посмотреть логи контейнера в Pod
kubectl logs — основная команда для получения stdout/stderr контейнера в Pod. По умолчанию она читает потоки вывода, которые контейнер отправляет в stdout/stderr (если приложение пишет логи в файлы внутри контейнера — их командой kubectl logs не увидите).
Синтаксис и часто используемые флаги
kubectl logs <pod> \[-c <container>\] \[--follow|-f\] \[--tail=N\] \[--since=1h\] \[--since-time=TIMESTAMP\]
kubectl logs -l <selector> # по селектору меток (несколько Pod)
kubectl logs <resource>/<name> # можно указать ресурс (например deployment/name)
kubectl logs <pod> --previous | -p # логи предыдущего (упавшего) контейнера
kubectl logs <pod> --all-containers=true # вывести логи всех контейнеров в pod
kubectl logs <pod> --timestamps # добавить метки времени в начала строк
kubectl logs <pod> --limit-bytes=BYTES # лимит по байтам
Примеры команд
# Один контейнер в pod
kubectl logs my-pod
# В namespace production
kubectl logs -n production my-pod
# Поток (как tail -f)
kubectl logs -f my-pod
# Показать последние 200 строк и затем следить
kubectl logs -f --tail=200 my-pod
# Логи за последний час
kubectl logs my-pod --since=1h
# Логи с метками времени
kubectl logs my-pod --timestamps
# Если в pod несколько контейнеров — указываем имя контейнера
kubectl logs my-pod -c worker
# Показать логи предыдущей (упавшей) инстанции контейнера
kubectl logs my-pod -c worker --previous
Логи для набора Pod (Deployment, селектор меток)
# По селектору меток — получим логи всех Pod, соответствующих селектору
kubectl logs -n staging -l app=myapp --all-containers=true --tail=100
# Можно указать ресурс (deployment) — команда автоматически выберет pod(ы) у ресурса
kubectl logs deployment/my-deploy --all-containers=true
Для одновременного стриминга логов из множества Pod удобнее использовать утилиты типа stern, kubetail или kail, которые агрегируют и префиксируют поток по имени pod.
Когда kubectl logs не показывает нужное
- Приложение пишет лог в локальный файл внутри контейнера — kubectl logs этого не увидит. В этом случае можно открыть файл через kubectl exec или скопировать его:
kubectl exec -it my-pod -- tail -n 200 /var/log/myapp.log
kubectl cp my-pod:/var/log/myapp.log ./myapp.log
-
Контейнер очень быстро стартует и сразу падает — используйте --previous (-p) для чтения логов предыдущей инстанции.
-
Логи могли быть удалены/прокручены на уровне kubelet или ноды (ротация логов, ограничение хранения).
Права доступа и ограничения
Просмотр логов зависит от привилегий в кластере — RBAC может запрещать доступ к pods/log. Если при попытке получить логи вы видите ошибку доступа, проверьте текущий контекст (kubectl config current-context) и права пользователя по ресурсной подсубресурсе pods/log.
Полезные советы для отладки
-
Сначала kubectl get pods -n <ns> -l <label> чтобы узнать точные имена pod и контейнеров.
-
Используйте kubectl describe pod <pod> для событий и причин перезапуска.
-
Если нужно читать внутренние файлы приложения — используйте kubectl exec.
-
Для продакшна заводите централизованный сбор логов (EFK/ELK, Loki и т.п.), чтобы не терять логи при ротации и легко фильтровать/поискать по времени.
Команды для быстрой диагностики:
kubectl get pods -n production -l app=api -o wide
kubectl describe pod -n production my-pod
kubectl logs -n production my-pod -c worker --tail=200 --since=2h --timestamps
kubectl logs -n production -l app=api --all-containers=true --tail=50
kubectl exec -n production -it my-pod -- sh -c "tail -n 200 /var/log/myapp.log"