Перейти к содержанию

0002. Loki вместо ELK

Дата: август 2026. Состояние: принято.

Контекст

Логи нужны для разбора инцидентов, и они должны быть связаны с метриками и трейсами. В вакансии перечислен ELK, поэтому первым вариантом был он.

Elasticsearch на одном узле требует не меньше 1 ГБ памяти под кучу и столько же под системный кеш файлов; плюс Logstash или Filebeat, плюс Kibana. Итого около 2 ГБ — больше половины памяти узла на один сигнал из трёх.

Решение

Собирать логи агентом Grafana Alloy и хранить в Loki в одноблочном режиме на файловой системе узла. Loki с агентом занимает около 180 МБ.

Метка ставится только на то, по чему действительно отбирают: пространство имён, под, контейнер, приложение и уровень записи. Остальное остаётся в теле записи и разбирается на месте, при запросе.

Последствия

Что получили. Три сигнала в одном интерфейсе: Grafana показывает метрику, рядом лог, из лога по полю traceId — переход в трейс. В ELK для такой связки понадобился бы ещё и APM-сервер.

Место на диске: Loki хранит сжатые фрагменты и не строит обратный индекс по всему содержимому. Неделя логов стенда — около 300 МБ вместо нескольких гигабайтов.

Чем заплатили. Полнотекстового поиска по произвольному полю нет. Loki отбирает записи по меткам и затем просматривает их содержимое; запрос без метки по большому интервалу времени будет медленным. Для разбора инцидента, где всегда известны пространство имён и промежуток времени, это не мешает. Для аналитики по всему массиву за месяц — помешало бы.

Число серий нужно держать в узде: метка с высокой изменчивостью — например идентификатор запроса — разнесла бы хранилище на тысячи мелких потоков. Это дисциплина, которую в Elasticsearch соблюдать не требуется.

Что рассматривалось

Полный ELK — отклонён по памяти. Разговор был бы другим на узле с 8 ГБ.

OpenSearch — тот же порядок потребления, что у Elasticsearch, с теми же последствиями.

Только логи в стандартный вывод и kubectl logs — работает до первого перезапуска пода, после которого улики исчезают. Для стенда, где поды падают по нажатию кнопки, это заведомо негодно.