Представляем loghouse — Open Source-систему для работы с логами в Kubernetes

clidd01--tt-hpmaz-el8hjvcpa.jpeg

Обслуживая множество инсталляций Kubernetes в проектах разного масштаба, мы столкнулись с проблемой сбора и просмотра логов со всех контейнеров кластера. Изучив имеющиеся решения, пришли к необходимости создания нового — разумного в потреблении ресурсов и дискового пространства, а также предлагающего удобный интерфейс для просмотра логов в реальном времени с возможностью их фильтрации по нужным критериям.

Так родился проект loghouse, и я рад представить его альфа-версию DevOps-инженерам и системным администраторам, которым знакомы обозначенные проблемы.

В основу loghouse была взята замечательная столбцовая СУБД с открытым кодом — ClickHouse, — за что отдельное спасибо коллегам из компании Яндекс. Как легко догадаться, это же обстоятельство стало причиной для названия нового проекта. Ориентированность ClickHouse на Big Data и соответствующие оптимизации в производительности и подходе к хранению данных — жизненно необходимое условие для сборщика логов Kubernetes, в котором мы нуждались.

Другим важным компонентом текущей реализации loghouse является fluentd — Open Source-проект при фонде CNCF, который, обеспечивая хорошую производительность (10 тысяч записей в секунду при занятых в памяти 300 Мб), помогает в сборе и обработке логов, а также их последующей отправке в ClickHouse.

Наконец, поскольку решение ориентировано на Kubernetes, в нём используются его базовые механизмы, позволяющие интегрировать различные компоненты loghouse в единую систему, которую легко и быстро разворачивать в кластере.

Возможности


  • Эффективный сбор и хранение логов в Kubernetes. Про fluentd уже написано, а вот примеры по месту, занимаемому логами в ClickHouse: 3,7 млн записей — 1,2 Гб, 300 млн — 13 Гб, 5,35 млрд — 54 Гб.
  • Поддержка логов в формате JSON.
  • Простой язык запросов для отбора записей с сопоставлением ключей с конкретными значениями и регулярными выражениями, поддержкой множества условий через AND/OR.
  • Возможность выбора записей по дополнительным данным о контейнерах из Kubernetes API (пространство имён, лейблы и т.п.).
  • Простой деплой в Kubernetes с помощью готовых Dockerfile и Helm-чартов.


Как это работает?


Русскоязычная документация проекта объясняет суть:

bbhnacpcss7rpzr-dzoykuddkps.png

На каждый узел кластера Kubernetes устанавливается под с fluentd для сбора логов. Технически для этого в Kubernetes создается DaemonSet, который имеет tolerations для всех возможных taints и попадает на все узлы кластера. Каталоги с логами со всех хост-систем монтируются в поды fluentd из этого DaemonSet, где за ними «наблюдает» служба fluentd. Для всех логов Docker-контейнеров применяется фильтр kubernetes_metadata, который собирает дополнительную информацию о контейнерах из Kubernetes API. После этого данные преобразуются с помощью фильтра record_modifier. После преобразования данных они попадают в fluentd output plugin, который вызывает расположенную в контейнере с fluentd консольную утилиту clickhouse-client для записи данных в ClickHouse.


Важное архитектурное замечание состоит в том, что на данный момент поддерживается запись в единственный экземпляр СУБД ClickHouse — Deployment, который по умолчанию попадает на случайный узел K8s. Выбрать конкретный узел для его размещения можно с помощью nodeSelector и tolerations. В дальнейшем мы планируем реализовать и другие варианты инсталляции (с экземплярами ClickHouse на каждом узле кластера и в виде кластера ClickHouse).

Веб-интерфейс


Пользовательская часть loghouse, которую мы называем loghouse-dashboard, состоит из двух компонентов:

  1. frontend — nginx с базовой авторизацией (используется для разграничения пользовательских прав);
  2. backend — приложение на Ruby, в котором можно просматривать логи из ClickHouse.


Интерфейс оформлен в стиле Papertrail:

ktr3hlge8zsb-vjb-5yj-0c88rq.png

Среди имеющихся фич — выбор периода (за указанные «от и до» или последний час, день и т.п.), бесконечная прокрутка записей, сохранение произвольных запросов, ограничение доступа пользователям по заданным пространствам имен Kubernetes, экспорт результатов текущего запроса в CSV.

Установка и использование


Официальный статус — альфа-версия, а сами мы используем loghouse в production второй месяц. Для установки loghouse потребуется наличие Helm и в простейшем случае:

# helm repo add loghouse https://flant.github.io/loghouse/charts/
# helm fetch loghouse/loghouse --untar
# vim loghouse/values.yaml
# helm install -n loghouse loghouse


(Подробнее см. в документации.)

После установки будет поднят веб-интерфейс, доступный по заданному в конфиге values.yaml адресу (loghouse_host) с базовой аутентификацией в соответствии с параметром auth из того же values.yaml.

План развития


Среди запланированных улучшений в loghouse:

  • дополнительные варианты инсталляции: экземпляры ClickHouse на каждом узле, кластер ClickHouse;
  • поддержка скобок в языке запросов;
  • выгрузка данных в другие форматы (JSON, TSV) и в сжатом виде;
  • выгрузка архивов с логами в S3;
  • миграция интерфейса на AngularJS;
  • миграция бэкенда на Go;
  • консольный интерфейс;


Более подробный план появится в ближайшее время в виде issues проекта на GitHub.

Заключение


Исходный код loghouse опубликован на GitHub под свободной лицензией Apache License 2.0. Как и в случае с dapp, мы приглашаем DevOps-инженеров и Open Source-энтузиастов к участию в проекте — тем более, что он ещё очень молод и посему вдвойне нуждается в «активном» взгляде со стороны. Задавайте вопросы (можно прямо здесь в комментариях), указывайте на проблемы, предлагайте улучшения. Спасибо за внимание!

P.S.


Читайте также в нашем блоге:

  1. «Официально представляем dapp — DevOps-утилиту для сопровождения CI/CD»;
  2. «Собираем Docker-образы для CI/CD быстро и удобно вместе с dapp (обзор и видео)»;
  3. «Наш опыт с Kubernetes в небольших проектах» (видео доклада, включающего в себя знакомство с техническим устройством Kubernetes).

© Habrahabr.ru