Ответ
На последнем проекте мы построили централизованную систему логирования на основе стека EFK (Elasticsearch, Fluentd, Kibana) в Kubernetes.
Архитектура и поток данных:
- Приложения: Логировали в stdout/stderr в структурированном JSON-формате.
- Fluentd (DaemonSet): Собирал логи с нод Kubernetes, парсил JSON, обогащал метаданными (pod name, namespace, labels) и отправлял в Elasticsearch.
- Elasticsearch: Кластер из 3 мастер-нод и 5 данных-нод для хранения и индексации.
- Kibana: Для визуализации, поиска и создания дашбордов.
Пример конфигурации Fluentd для парсинга JSON:
<source>
@type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
<parse>
@type json
time_key time
time_format %Y-%m-%dT%H:%M:%S.%NZ
</parse>
</source>
Дополнительные практики, которые мы внедрили:
- Структурированные логи: Использовали единый формат для всех сервисов.
{"level":"ERROR","time":"2023-10-05T12:00:00Z","service":"auth-api","trace_id":"abc123","message":"Authentication failed","user_id":"456"} - Сбор логов инфраструктуры: Через отдельные конфигурации Fluentd собирали логи системных компонентов (kubelet, Docker, системные сервисы).
- Алертинг: Настраивали правила в Kibana Alerting для отслеживания частоты ошибок (например, >5 ошибок в минуту) и отправки уведомлений в Slack.
- Ретеншн и индексы: В Elasticsearch настраивали ILM (Index Lifecycle Management) для автоматического ротирования индексов (удаление логов старше 30 дней).
Для продакшена критически важных сервисов дополнительно подключали Sentry для трекинга ошибок на уровне приложения с полным стектрейсом.