Настройка централизованного логирования в Kubernetes кластере Rancher
Практическое руководство по настройке стека логирования с Go-сервисами на slog и отправкой логов в Loki
В современных Kubernetes-кластерах, особенно при использовании Rancher для управления, централизованное логирование становится необходимостью. В этой статье я расскажу о своем опыте настройки стека логирования для Go-сервисов, использующих slog, с отправкой логов в Loki через Rancher Logging.
Мы рассмотрим конфигурацию ClusterOutput, настройку фильтров парсинга JSON и интеграцию с существующей инфраструктурой мониторинга.
Архитектура решения
Современные Go-приложения используют структурированное логирование через пакет slog, который появился в Go 1.21.
- JSON-форматированные логи по умолчанию
- Поддержка уровней логирования (DEBUG, INFO, WARN, ERROR)
- Контекстные атрибуты для трассировки
- Высокая производительность
Rancher предоставляет встроенное решение для логирования на основе Fluent Bit/Fluentd.
- Сбор логов со всех нод кластера
- Гибкая конфигурация через CRD
- Поддержка множества output-плагинов
- Интеграция с экосистемой Grafana
Реализация логирования в Go
1package main
2
3import (
4 "context"
5 "log/slog"
6 "net/http"
7 "os"
8 "time"
9)
10
11func main() {
12 // Настройка JSON-логгера
13 handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
14 Level: slog.LevelDebug,
15 })
16 logger := slog.New(handler)
17 slog.SetDefault(logger)
18
19 // Пример логирования с контекстом
20 ctx := context.WithValue(context.Background(), "request_id", "req-12345")
21
22 logger.Info("Сервис запущен",
23 "port", 8080,
24 "environment", "production",
25 "timestamp", time.Now().UTC(),
26 )
27
28 // HTTP-обработчик с логированием
29 http.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) {
30 start := time.Now()
31
32 logger.Info("Обработка запроса",
33 "method", r.Method,
34 "path", r.URL.Path,
35 "user_agent", r.UserAgent(),
36 "request_id", r.Header.Get("X-Request-ID"),
37 )
38
39 // Бизнес-логика...
40 time.Sleep(50 * time.Millisecond)
41
42 logger.Info("Запрос обработан",
43 "duration_ms", time.Since(start).Milliseconds(),
44 "status", 200,
45 )
46
47 w.WriteHeader(http.StatusOK)
48 w.Write([]byte(`{"status": "ok"}`))
49 })
50
51 logger.Info("HTTP-сервер запущен", "addr", ":8080")
52 http.ListenAndServe(":8080", nil)
53}Конфигурация Rancher Logging
1apiVersion: logging.banzaicloud.io/v1beta1
2kind: ClusterOutput
3metadata:
4 name: loki-output
5 namespace: cattle-logging-system
6spec:
7 loki:
8 url: http://loki.monitoring.svc.cluster.local:3100
9 configure_kubernetes_labels: true
10 extra_labels:
11 cluster: "production"
12 buffer:
13 timekey: 1m
14 timekey_wait: 30s
15 timekey_use_utc: true1apiVersion: logging.banzaicloud.io/v1beta1
2kind: ClusterFlow
3metadata:
4 name: go-services-flow
5 namespace: cattle-logging-system
6spec:
7 match:
8 - select:
9 labels:
10 app.kubernetes.io/name: "go-service"
11 filters:
12 - parser:
13 key_name: message
14 parse:
15 type: json
16 remove_key_name_field: true
17 reserve_data: true
18 reserve_time: true
19 - record_transformer:
20 records:
21 - log_type: "application"
22 - language: "go"
23 - framework: "slog"
24 globalOutputRefs:
25 - loki-outputПояснение ключевых параметров:
key_name: message— указывает, что JSON находится в поле messageparse.type: json— активирует JSON-парсерremove_key_name_field: true— удаляет исходное поле message после парсингаreserve_data: true— сохраняет все остальные поля записиreserve_time: true— сохраняет временную метку из лога
Результаты и преимущества
Все логи доступны в едином интерфейсе Grafana с мощным языком запросов LogQL
JSON-парсинг позволяет фильтровать и агрегировать логи по любому полю: уровень, метод, длительность
Fluent Bit эффективно обрабатывает большие объемы данных с минимальным overhead
- Используйте структурированное логирование — всегда логируйте в JSON формате с четкой схемой полей
- Добавляйте контекстные поля — request_id, user_id, correlation_id для трассировки запросов
- Настройте уровни логирования — DEBUG для разработки, INFO для продакшена, ERROR для критических ситуаций
- Мониторьте объем логов — настройте retention policy в Loki и алерты на аномальный рост объема
- Тестируйте парсинг — убедитесь, что ваши JSON-логи корректно парсятся фильтрами Fluent Bit
Настройка централизованного логирования в Kubernetes кластере Rancher с использованием Go-сервисов на slog и Loki предоставляет мощное решение для мониторинга распределенных систем.
Ключевым преимуществом является возможность использовать структурированные логи для продвинутого анализа, создания дашбордов и настройки алертов на основе конкретных полей логов.
Представленная конфигурация с фильтром парсинга JSON позволяет эффективно извлекать структурированные данные из логов Go-приложений и использовать их в полной мере в экосистеме Grafana/Loki.
Нужна помощь?
Мы поможем настроить мониторинг и алертинг для ваших Kubernetes-приложений. Свяжитесь с нами для консультации.