Ответ
Я использую архитектуру на основе Fluent Bit DaemonSet для сбора логов со всех приложений в кластере. Вот как это работает на практике:
1. Основная архитектура (рекомендуемый подход):
# DaemonSet для Fluent Bit на каждой ноде
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluent-bit
namespace: logging
spec:
selector:
matchLabels:
app: fluent-bit
template:
metadata:
labels:
app: fluent-bit
spec:
containers:
- name: fluent-bit
image: fluent/fluent-bit:2.2
volumeMounts:
- name: varlog
mountPath: /var/log
- name: dockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: fluent-bit-config
mountPath: /fluent-bit/etc/
volumes:
- name: varlog
hostPath:
path: /var/log
- name: dockercontainers
hostPath:
path: /var/lib/docker/containers
- name: fluent-bit-config
configMap:
name: fluent-bit-config
2. Конфигурация для фильтрации определенных приложений:
# fluent-bit.conf (часть configMap)
[INPUT]
Name tail
Path /var/log/containers/*my-app*.log
Parser docker
Tag kube.*
Mem_Buf_Limit 5MB
Skip_Long_Lines On
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc.cluster.local:443
Merge_Log On
K8S-Logging.Parser On
[OUTPUT]
Name loki
Match kube.*
Host loki.logging.svc
Port 3100
Labels job=fluent-bit, app=$kubernetes['labels']['app']
3. Альтернативные подходы для специфичных случаев:
- Sidecar контейнеры: Для приложений со сложным форматом логов или когда нужна предобработка
- Прямая отправка из приложения: Использую для критически важных логов через структурированное логирование (JSON) напрямую в Elasticsearch/Loki
4. Best practices из моего опыта:
- Ротация логов: Настраиваю
sizeLimitв Pod spec и logrotate на нодах - Структурированные логи: Принуждаю разработчиков использовать JSON формат для логов
- Метки и аннотации: Использую Kubernetes labels для фильтрации логов в Loki/Grafana
- Хранение: Настраиваю retention policies (7 дней для debug, 30 дней для production)
- Мониторинг логирования: Отслеживаю volume логов и алерчу при аномалиях
5. Стек, который я предпочитаю:
- Сбор: Fluent Bit (легковесный) как DaemonSet
- Хранение: Loki (дешевле Elasticsearch) или Elasticsearch для сложных поисков
- Визуализация: Grafana с Loki/Elasticsearch datasource
- Алертинг: Alertmanager на основе log patterns или Grafana alerts