Gymterview
senior

Как организовать мониторинг и логирование в Kubernetes?

Мониторинг и логирование в Kubernetes строятся на стеке Prometheus + Grafana (метрики) и ELK/EFK (логи). Для Spring Boot приложений интеграция осуществляется через Actuator и Micrometer.

Мониторинг: Prometheus + Grafana

Prometheus — система мониторинга, собирающая метрики по pull-модели (опрашивает /metrics эндпоинты). Grafana — платформа визуализации дашбордов.

Для Spring Boot приложений:

  1. Подключить зависимости:
Пример
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
  1. Настроить application.yml:
Пример
management:
  endpoints:
    web:
      exposure:
        include: health,info,prometheus
  metrics:
    export:
      prometheus:
        enabled: true
    tags:
      application: my-spring-app
  1. Добавить аннотации для автоматического обнаружения Prometheus:
Пример
metadata:
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/port: "8080"
    prometheus.io/path: "/actuator/prometheus"

Доступные метрики

Категория Примеры
JVM Heap memory, GC, threads, class loading
HTTP Количество запросов, время ответа, коды ошибок
Connection pool Активные соединения HikariCP, ожидающие запросы
Кастомные Бизнес-метрики через Micrometer API

Логирование: ELK Stack

ELK Stack (Elasticsearch + Logstash + Kibana) — стандарт для централизованного логирования:

  1. Приложения пишут логи в stdout/stderr
  2. Container Runtime сохраняет логи на ноде
  3. DaemonSet с Fluent Bit / Fluentd на каждой ноде собирает логи и отправляет в Elasticsearch
  4. Разработчики ищут и анализируют логи через Kibana

Рекомендации для Java-приложений

  • Писать логи в stdout/stderr, а не в файлы
  • Использовать JSON-формат для структурированного логирования:
Пример
<!-- logback-spring.xml -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
  • Добавлять в логи идентификаторы: traceId, spanId, podName, namespace
  • Настроить уровни логирования через ConfigMap, чтобы менять их без пересборки

Общая архитектура

Пример
Spring Boot App ──metrics──> Prometheus ──> Grafana (дашборды)
      │                          │
      │                    Alertmanager (оповещения)
      │
      └──logs (stdout)──> Fluent Bit ──> Elasticsearch ──> Kibana

Команды для логов

Пример
# Логи Pod'а
kubectl logs my-pod -n production

# Стримить логи нескольких Pod'ов (с помощью label selector)
kubectl logs -l app=my-spring-app -f -n production

# Использовать stern (удобная утилита для мультиподовых логов)
stern my-spring-app -n production

На собеседовании: нужно знать стек Prometheus + Grafana для метрик и ELK для логов. Для Spring Boot — Actuator + Micrometer. Частая ошибка — не знать, что логи должны идти в stdout, а не в файлы, и забыть про JSON-формат логов.