Index
Централизованная система сбора и хранения логов Kubernetes-кластера с использованием Loki и Fluent Bit.
Оглавление
- Описание
- Архитектура
- Быстрый старт
- Команды
- Конфигурация
- Использование
- Troubleshooting
- Best Practices
Описание
Loki - система агрегации логов от Grafana, оптимизированная для хранения и запросов логов Kubernetes.
Fluent Bit - легковесный и производительный сборщик логов, работающий как DaemonSet на каждой ноде кластера.
Возможности
- ✅ Централизованный сбор логов (opt-in: только с подов с annotation
logging: "true") - ✅ Хранение логов в S3 (MinIO) с TSDB schema (v13)
- ✅ Автоматическая ротация и удаление старых логов (30 дней)
- ✅ Kubernetes metadata enrichment (namespace, pod, container, node)
- ✅ Низкая кардинальность labels для эффективных запросов
- ✅ Поддержка multiline логов (Java, Python, Go stacktraces)
- ✅ Compactor для очистки и оптимизации хранилища
- ✅ Single Binary режим Loki (простота развертывания)
Текущая конфигурация
- Namespace:
tech-logging - Loki mode: Single Binary (все компоненты в одном процессе)
- Storage: MinIO S3 (
s3-publictenant) - Schema: TSDB v13
- Retention: 30 дней
- Fluent Bit: DaemonSet на всех нодах (включая master)
- Placement: Может размещаться на любых нодах (masters + workers)
Архитектура
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | |
Поток данных
- Сбор логов: Fluent Bit читает логи из
/var/log/containers/*.logна каждой ноде - Обогащение: Fluent Bit добавляет Kubernetes metadata (namespace, pod, container, node)
- Фильтрация: Удаляются high-cardinality поля (pod_id, container_id, etc.)
- Отправка: Логи отправляются в Loki через HTTP API
- Индексация: Loki индексирует логи по labels с низкой кардинальностью
- Хранение: Chunks и индексы сохраняются в MinIO S3
- Compaction: Compactor периодически оптимизирует и удаляет старые данные
- Запросы: LogQL запросы через Loki Gateway
Быстрый старт
Предварительные требования
- Longhorn (для persistent storage)
- MinIO S3 (для хранения логов)
- Подготовленные ноды (labels и taints)
1. Подготовка инфраструктуры
1 2 3 4 5 6 7 8 9 | |
2. Создание S3 buckets
Создайте три bucket в MinIO для Loki:
Через MinIO Console (рекомендуется)
1 2 | |
Команда выведет пошаговую инструкцию. Или выполните вручную:
- Откройте MinIO Console: https://s3.internal.ai-ops.tech
- Войдите с MinIO credentials
- Перейдите в раздел "Buckets"
- Создайте три bucket:
loki-chunksloki-rulerloki-admin
Настройка квот (рекомендуется)
После создания buckets установите квоты для контроля использования хранилища:
Общий объем: 100 GB для всех buckets
- loki-chunks: 95 GB
- Основной storage для log chunks (сжатые данные)
-
Занимает ~95% от общего объема
-
loki-ruler: 4 GB
- Alerting rules (небольшие файлы)
-
Защита от случайного роста
-
loki-admin: 1 GB
- Admin data (минимальный объем)
- Защита от случайного роста
Как установить квоту в MinIO Console:
- Выберите bucket (например,
loki-chunks) - Перейдите на вкладку "Summary"
- Нажмите "Set Quota"
- Выберите тип "Size"
- Введите значение (например,
95GBдля loki-chunks) - Нажмите "Set"
- Повторите для остальных buckets
3. Создание S3 credentials secret
1 2 | |
Введите MinIO Access Key ID и Secret Access Key когда будет запрошено.
Или создайте секрет вручную:
1 2 3 | |
4. Установка Loki
1 | |
Это установит:
- Namespace tech-logging
- LimitRange и ResourceQuota
- NetworkPolicy
- StorageClass longhorn-logging
- Loki Single Binary через Helm
- Loki Gateway (nginx)
5. Установка Fluent Bit
1 | |
Это установит Fluent Bit DaemonSet на всех нодах кластера.
6. Проверка статуса
1 | |
Ожидаемый результат:
- Loki pod в состоянии Running
- Fluent Bit pods на каждой ноде в состоянии Running
- PVC для Loki в состоянии Bound
7. Тестирование
1 2 3 4 5 6 7 8 | |
8. Проверка сбора логов и записи в S3
Для полной проверки работы системы логирования используйте команду:
1 | |
Эта команда выполнит комплексную проверку:
- Статус компонентов - проверит, что Fluent Bit и Loki работают
- Метрики Fluent Bit - покажет, сколько логов собрано (
fluentbit_input_bytes_total,fluentbit_output_proc_records_total) - Метрики Loki - покажет, сколько логов получено (
loki_distributor_lines_received_total,loki_ingester_chunks_created_total) - Метрики S3 storage - покажет операции записи в S3 (
loki_compactor_compaction_operations_total) - Тестовый запрос - проверит доступность логов через Loki API
- Инструкции по проверке S3 - как проверить buckets в MinIO
Ручная проверка S3 buckets:
-
Откройте MinIO Console:
1make minio-console -
Перейдите в раздел "Buckets" → выберите
loki-chunks -
Проверьте наличие файлов:
- Должны быть папки с датами (например,
index/2025/12/22/) - Внутри должны быть файлы chunks (
.gzфайлы) -
Файлы должны появляться по мере сбора логов
-
Проверьте размер bucket:
- Размер должен расти по мере сбора логов
- Не должен превышать квоту (95 GB для
loki-chunks)
Что означают метрики:
fluentbit_input_bytes_total > 0- логи собираются с нодloki_distributor_lines_received_total > 0- логи попадают в Lokiloki_ingester_chunks_created_total > 0- Loki создает chunksloki_compactor_compaction_operations_total > 0- chunks записываются в S3 (может быть 0 сразу после установки, compactor работает периодически)
Если логи не собираются:
-
Проверьте, что у подов есть annotation
logging: "true":1kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{.metadata.annotations.logging}{"\n"}{end}' | grep -v "^$" -
Проверьте логи Fluent Bit:
1make logging-logs-fluent -
Проверьте логи Loki:
1make logging-logs-loki
Команды
Установка и обновление
1 2 3 4 5 | |
Управление секретами и buckets
1 2 | |
Мониторинг и отладка
1 2 3 4 5 6 | |
Удаление
1 | |
Справка
1 | |
Конфигурация
Loki
Конфигурация в charts/loki/values.yaml:
Storage (S3 + TSDB)
- Schema: TSDB v13 (оптимизирован для Kubernetes)
- Object Store: MinIO S3 (s3-public-hl.tech-minio-tenants.svc.cluster.local:9000)
- Buckets: loki-chunks, loki-ruler, loki-admin
- Credentials: Secret loki-s3-secret
- Recommended Quotas (total 100 GB):
- loki-chunks: 95 GB (main log storage)
- loki-ruler: 4 GB (alerting rules)
- loki-admin: 1 GB (admin data)
Retention - Period: 720 часов (30 дней) - Compaction: Каждые 10 минут - Delete delay: 2 часа после пометки на удаление
Limits - Ingestion rate: 50 MB/s - Ingestion burst: 100 MB - Max streams: 10000 глобально - Max query series: 10000 - Query parallelism: 32
Resources - Requests: 500m CPU, 1Gi RAM - Limits: 2000m CPU, 4Gi RAM - Storage: 18Gi (backend) + 10Gi (write) = 28Gi (Longhorn)
Fluent Bit
Конфигурация в charts/fluent-bit/values.yaml:
Input
- Source: /var/log/containers/*.log
- Parser: docker, cri (multiline support)
- Buffer: 5MB per file
- Storage: Filesystem buffering для надежности
Filters
- Kubernetes metadata: Автоматическое обогащение
- Opt-in collection: Собираются логи только с подов, у которых есть annotation logging: "true"
- Label extraction: Только low-cardinality labels
- Kept labels: namespace, pod, container, node
- Removed fields: pod_id, container_id, docker_id, container_hash
Output
- Target: loki-gateway.tech-logging.svc.cluster.local:80
- Format: JSON
- Labels: job=fluentbit, + Kubernetes labels
- Retry: 3 attempts
- Buffer limit: 10MB
Multiline Parsers
- Java: Stacktraces с at, Caused by
- Python: Stacktraces с Traceback, File, Error
- Go: Panic messages с goroutine, created by
Resources - Requests: 100m CPU, 128Mi RAM - Limits: 500m CPU, 512Mi RAM
Использование
Включение сбора логов для подов (Opt-in)
По умолчанию логи не собираются. Для включения сбора логов добавьте annotation на под:
Через Deployment:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Через Pod:
1 2 3 4 5 6 7 8 9 10 | |
Через kubectl:
1 2 | |
Примечание: После добавления annotation поды автоматически начнут логироваться. Fluent Bit проверяет annotation каждые 10 секунд (Refresh_Interval).
Доступ к Loki
Через port-forward
1 2 | |
Изнутри кластера (для Grafana и других сервисов)
1 | |
LogQL запросы
Базовые запросы
1 2 3 4 5 6 7 8 9 10 11 | |
Фильтрация по содержимому
1 2 3 4 5 6 7 8 | |
Агрегация
1 2 3 4 5 6 7 8 | |
Multiline логи
1 2 3 4 5 | |
Примеры использования
1. Поиск ошибок в конкретном namespace
1 2 3 | |
2. Экспорт логов в файл
1 2 3 4 5 | |
3. Мониторинг в реальном времени
1 2 3 4 5 6 7 | |
Troubleshooting
Loki не запускается
Проблема: Pod в состоянии CrashLoopBackOff
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Fluent Bit не отправляет логи
Проблема: Логи не появляются в Loki
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
Высокая кардинальность labels
Проблема: Loki медленно работает или падает с ошибкой "too many streams"
Решение:
1 2 3 4 5 6 7 8 9 10 | |
Проблемы с S3 storage
Проблема: Ошибки записи в S3
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Логи не удаляются (retention не работает)
Проблема: Старые логи не удаляются после 30 дней
Решение:
1 2 3 4 5 6 7 8 9 10 | |
Multiline логи разбиваются на отдельные строки
Проблема: Java/Python stacktraces разбиваются на несколько записей
Решение:
Fluent Bit уже настроен с multiline парсерами для Java, Python и Go.
Проверьте конфигурацию:
1 | |
Если проблема сохраняется, добавьте кастомный парсер в charts/fluent-bit/values.yaml:
1 2 3 4 5 6 7 | |
Best Practices
Opt-in подход
Система использует opt-in подход: логи собираются только с подов, у которых явно указана annotation logging: "true".
Преимущества: - ✅ Безопасность: не собираем лишние логи - ✅ Экономия ресурсов: меньше логов → меньше CPU/памяти/хранилища - ✅ Контроль: явно видно, что логируется - ✅ Низкая кардинальность: меньше streams в Loki
Рекомендации: - Добавляйте annotation на все важные production сервисы - Используйте для всех пользовательских приложений - Не добавляйте для системных подов (kube-system, etc.) - они обычно не нужны - Можно добавить через Helm values или Kustomize patches
Пример для Helm:
1 2 3 | |
Пример для Kustomize:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Labels
✅ DO: Используйте low-cardinality labels
1 | |
❌ DON'T: Не используйте high-cardinality labels
1 2 3 4 5 6 7 8 | |
Правило: Если значение label может иметь > 1000 уникальных значений, не используйте его как label.
Запросы
✅ DO: Фильтруйте по labels сначала
1 | |
❌ DON'T: Не сканируйте все логи
1 | |
✅ DO: Используйте разумные временные диапазоны
1 | |
❌ DON'T: Не запрашивайте слишком большие диапазоны
1 | |
Хранение
✅ DO: Установите квоты на S3 buckets
Рекомендуемые квоты (общий объем 100 GB):
- loki-chunks: 95 GB (основной storage для логов)
- loki-ruler: 4 GB (alerting rules)
- loki-admin: 1 GB (admin data)
Как установить квоту в MinIO Console:
1. Выберите bucket → "Summary" → "Set Quota"
2. Выберите тип "Size"
3. Введите значение (например, 95GB)
4. Нажмите "Set"
✅ DO: Регулярно проверяйте размер S3 buckets
1 2 3 4 5 | |
✅ DO: Мониторьте использование PVC
1 2 | |
✅ DO: Настройте retention в соответствии с требованиями
Текущий retention: 30 дней. Для изменения отредактируйте charts/loki/values.yaml:
1 2 | |
Примечание: При достижении квоты bucket Loki не сможет писать новые логи. Убедитесь, что retention настроен правильно для автоматической очистки старых данных.
Производительность
✅ DO: Используйте агрегацию для больших запросов
1 | |
✅ DO: Используйте limit для ограничения результатов
1 | |
✅ DO: Используйте кеширование результатов
Loki автоматически кеширует результаты запросов (настроено в query_range.cache_results).
Интеграция с Grafana
После установки Grafana, добавьте Loki как datasource:
- URL:
http://loki-gateway.tech-logging.svc.cluster.local - Type: Loki
- Access: Server (default)
Или через provisioning:
1 2 3 4 5 6 7 8 | |
Примечание: Доступ к Loki возможен только изнутри кластера. Для внешнего доступа используйте Grafana UI или port-forward.