Настройка централизованного логирования в Kubernetes кластере Rancher
Практическое руководство по настройке стека логирования с Go-сервисами на slog и отправкой логов в Loki
Введение
Эффективное логирование в распределенных системах — критически важная задача для мониторинга и отладки
В современных Kubernetes-кластерах, особенно при использовании Rancher для управления, централизованное логирование становится необходимостью. В этой статье я расскажу о своем опыте настройки стека логирования для Go-сервисов, использующих slog, с отправкой логов в Loki через Rancher Logging.
Мы рассмотрим конфигурацию ClusterOutput, настройку фильтров парсинга JSON и интеграцию с существующей инфраструктурой мониторинга.
Архитектура решения
Go-сервисы с slog
Современные Go-приложения используют структурированное логирование через пакет slog, который появился в Go 1.21.
- JSON-форматированные логи по умолчанию
- Поддержка уровней логирования (DEBUG, INFO, WARN, ERROR)
- Контекстные атрибуты для трассировки
- Высокая производительность
Rancher Logging Stack
Rancher предоставляет встроенное решение для логирования на основе Fluent Bit/Fluentd.
- Сбор логов со всех нод кластера
- Гибкая конфигурация через CRD
- Поддержка множества output-плагинов
- Интеграция с экосистемой Grafana
Реализация логирования в Go
package main
import (
"context"
"log/slog"
"net/http"
"os"
"time"
)
func main() {
// Настройка JSON-логгера
handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
})
logger := slog.New(handler)
slog.SetDefault(logger)
// Пример логирования с контекстом
ctx := context.WithValue(context.Background(), "request_id", "req-12345")
logger.Info("Сервис запущен",
"port", 8080,
"environment", "production",
)
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
logger.Info("http",
"method", r.Method,
"path", r.URL.Path,
)
// Бизнес-логика...
time.Sleep(50 * time.Millisecond)
logger.Info("Запрос обработан",
"duration_ms", time.Since(start).Milliseconds(),
"status", 200,
)
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"status": "ok"}`))
})
logger.Info("HTTP-сервер запущен", "addr", ":8080")
http.ListenAndServe(":8080", nil)
}Конфигурация Rancher Logging
Важная настройка
ClusterOutput для Loki
Определение вывода логов в систему Loki
apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterOutput
metadata:
name: loki-output
namespace: cattle-logging-system
spec:
loki:
url: http://loki.monitoring.svc.cluster.local:3100
labels:
app: kubernetes
buffer:
timekey: 1m
timekey_wait: 10s
timekey_use_utc: trueПояснение ключевых параметров:
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? Свяжитесь с нами.
Связаться с нами