senior
Как организовать мониторинг и логирование в Kubernetes?
Мониторинг и логирование в Kubernetes строятся на стеке Prometheus + Grafana (метрики) и ELK/EFK (логи). Для Spring Boot приложений интеграция осуществляется через Actuator и Micrometer.
Мониторинг: Prometheus + Grafana
Prometheus — система мониторинга, собирающая метрики по pull-модели (опрашивает /metrics эндпоинты). Grafana — платформа визуализации дашбордов.
Для Spring Boot приложений:
- Подключить зависимости:
Пример
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
- Настроить
application.yml:
Пример
management:
endpoints:
web:
exposure:
include: health,info,prometheus
metrics:
export:
prometheus:
enabled: true
tags:
application: my-spring-app
- Добавить аннотации для автоматического обнаружения 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) — стандарт для централизованного логирования:
- Приложения пишут логи в stdout/stderr
- Container Runtime сохраняет логи на ноде
- DaemonSet с Fluent Bit / Fluentd на каждой ноде собирает логи и отправляет в Elasticsearch
- Разработчики ищут и анализируют логи через 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-формат логов.