Как собирать логи с определенных приложений в Kubernetes кластере?

«Как собирать логи с определенных приложений в Kubernetes кластере?» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я использую архитектуру на основе 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