Ответ
В продакшене я никогда не полагаюсь только на kubectl logs. Для сбора, хранения и анализа логов со всех подов и нод кластера используется централизованное логирование.
Стек, который я чаще всего настраиваю и использую — EFK (Elasticsearch, Fluentd, Kibana):
-
Fluentd как DaemonSet: На каждой ноде кластера запускается pod Fluentd, который:
- Собирает логи контейнеров из
/var/log/containers/. - Парсит их, обогащает метаданными (namespace, pod name, container name).
- Отправляет в Elasticsearch.
# Упрощённый пример конфигурации Fluentd для парсинга логов Docker <source> @type tail path /var/log/containers/*.log pos_file /var/log/fluentd-containers.log.pos tag kubernetes.* <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </source>
- Собирает логи контейнеров из
-
Elasticsearch как StatefulSet: Хранит индексированные логи, обеспечивает быстрый поиск.
-
Kibana как Deployment: Веб-интерфейс для визуализации и анализа логов через дашборды и запросы (например, найти все ошибки 5xx за последний час).
Альтернативный легковесный стек — Loki: Для меньших кластеров или когда не нужен полнотекстовый поиск по всем полям, я выбираю Grafana Loki. Он похож на Prometheus, но для логов.
- Promtail (аналог Fluentd) собирает логи и отправляет в Loki.
- Loki хранит лог-потоки, индексируя только метки (labels).
- Grafana используется для запросов через LogQL.
Для отладки и быстрых проверок использую:
# Логи конкретного пода
kubectl logs -f deployment/my-app -n production
# Логи пода с несколькими контейнерами
kubectl logs -f pod/my-pod-xyz -c my-container
# Логи за последний час
kubectl logs --since=1h deployment/my-app
# Предыдущие логи упавшего пода
kubectl logs -p deployment/my-app
Но это лишь вспомогательные инструменты. Все инциденты расследуются через Kibana или Grafana, где есть полная картина по всему кластеру.