Как посмотреть логи контейнера в 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"