Введение

Grafana Loki — это горизонтально масштабируемая, высокодоступная система агрегации логов с поддержкой мультиарендности, вдохновленная Prometheus. Она разработана, чтобы быть очень экономичной и простой в эксплуатации. В отличие от других систем логирования, Loki не индексирует содержимое логов, а индексирует набор меток (labels) для каждого потока логов (log stream).

В этой лабораторной работе вы выполните базовую установку Grafana Loki с использованием официального образа Docker. Вы узнаете, как создать минимальный конфигурационный файл и запустить сервис Loki в виде контейнера. Это первый фундаментальный шаг в построении полного стека логирования с использованием Loki.

Загрузка образа Loki Docker

На этом шаге вы загрузите официальный образ Grafana Loki из Docker Hub. Команда docker pull извлекает образ или репозиторий из реестра. В вашей лабораторной среде Docker уже установлен и настроен.

Выполните следующую команду в терминале для загрузки последнего образа Loki:

docker pull grafana/loki

Вы увидите вывод, указывающий на прогресс загрузки. Docker по умолчанию загрузит образ с тегом latest.

Ожидаемый вывод (номера версий могут отличаться):

latest: Pulling from grafana/loki
a48641c1b8a9: Pull complete
...
Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Downloaded newer image for grafana/loki
docker.io/grafana/loki

Создание базового файла loki-config.yaml

На этом шаге вы создадите минимальный конфигурационный файл для Loki. Этот файл, loki-config.yaml, указывает Loki, как запускаться, где хранить данные и какую схему использовать. Для этой лабораторной работы мы настроим Loki на использование локальной файловой системы для хранения данных.

Мы будем использовать текстовый редактор nano для создания файла. Выполните следующую команду, чтобы открыть новый файл с именем loki-config.yaml:

nano loki-config.yaml

Теперь скопируйте и вставьте следующее содержимое YAML в редактор nano:

auth_enabled: false

server:
  http_listen_port: 3100

common:
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  ring:
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /tmp/loki/index
    cache_location: /tmp/loki/cache
  filesystem:
    directory: /tmp/loki/chunks

ruler:
  alertmanager_url: http://localhost:9093

limits_config:
  allow_structured_metadata: false

Эта конфигурация сохраняет все необходимое для Loki в папке /tmp/loki внутри контейнера, что позволяет избежать проблем с правами доступа и упрощает понимание настройки. Она отключает аутентификацию, включает кольцо (ring) в оперативной памяти для использования в одном узле и хранит блоки (chunks) и индексы в локальной файловой системе.

Вот что делает каждый раздел в файле:

  • auth_enabled: false: Отключает аутентификацию, чтобы вы могли взаимодействовать с Loki без дополнительных учетных данных. Это упрощает локальное тестирование; в производственной среде вы бы включили аутентификацию.
  • server.http_listen_port: 3100: Указывает Loki прослушивать HTTP-запросы на порту 3100. Когда вы обращаетесь к localhost:3100 через curl, вы попадаете на этот порт.
  • common.path_prefix: Устанавливает базовую папку, где Loki хранит временные данные внутри контейнера. Каждый другой путь в этом файле строится от /tmp/loki, поэтому все остается в одном месте.
  • common.storage.filesystem: Указывает Loki на две папки для хранения блоков логов (chunks) и файлов правил (rules). Поскольку мы не монтируем ничего специального в контейнер, использование /tmp/loki позволяет избежать проблем с правами доступа.
  • common.ring.kvstore.store: inmemory: Хранит информацию о членстве в кластере в оперативной памяти. Для лабораторной работы с одним узлом это идеально; реальный кластер использовал бы общее хранилище, такое как Consul или etcd.
  • schema_config: Определяет, как Loki должен организовывать индекс для данных логов. Мы устанавливаем начальную дату, выбираем хранилище boltdb-shipper и сохраняем индекс в файловой системе. prefix и period управляют именованием файлов и частотой создания нового файла индекса (каждые 24 часа).
  • storage_config: Предоставляет точные папки для индекса boltdb-shipper (active_index_directory и cache_location) и для хранения необработанных блоков. Все пути снова находятся в /tmp/loki, чтобы сохранить порядок.
  • ruler.alertmanager_url: Подготавливает компонент ruler Loki для отправки оповещений в Alertmanager по адресу http://localhost:9093. Ничего не сломается, если Alertmanager не запущен; Loki просто зарегистрирует предупреждение, когда попытается отправить оповещение.
  • limits_config.allow_structured_metadata: false: Отключает продвинутую функцию, чтобы Loki использовал более простой, текстовый метаданные логов, которые ожидают новички.

Нажмите Ctrl+X для выхода, затем Y для подтверждения сохранения и, наконец, Enter, чтобы сохранить файл с именем loki-config.yaml.

Запуск контейнера Loki на порту 3100 с конфигурацией

Теперь, когда у вас есть образ Loki и конфигурационный файл, вы запустите Loki как Docker-контейнер. Вы будете использовать команду docker run для запуска контейнера, монтирования вашего конфигурационного файла и открытия необходимого порта.

Выполните следующую команду:

docker run -d --name loki -v $(pwd)/loki-config.yaml:/etc/loki/config.yml -p 3100:3100 grafana/loki -config.file=/etc/loki/config.yml

Разберем эту команду:

  • -d: Запускает контейнер в фоновом (detached) режиме.
  • --name loki: Присваивает контейнеру имя loki для удобства обращения.
  • -v $(pwd)/loki-config.yaml:/etc/loki/config.yml: Монтирует ваш локальный файл loki-config.yaml в контейнер по пути /etc/loki/config.yml. Loki будет считывать свою конфигурацию из этого файла.
  • -p 3100:3100: Сопоставляет порт 3100 хост-машины с портом 3100 внутри контейнера, что позволяет вам получить доступ к API Loki.
  • grafana/loki: Образ, используемый для контейнера.
  • -config.file=/etc/loki/config.yml: Аргумент командной строки, передаваемый процессу Loki, указывающий ему, где найти конфигурационный файл.

После выполнения команды Docker выведет уникальный идентификатор (ID) только что созданного контейнера.

e8a9f2b1c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0

Проверка конечной точки готовности Loki по адресу localhost:3100/ready

На этом шаге вы выполните проверку работоспособности (health check), чтобы убедиться, что сервер Loki запущен и работает корректно. Loki предоставляет HTTP-конечную точку /ready, которую можно использовать для этой цели. Успешный ответ указывает на то, что сервер готов принимать запросы.

Используйте команду curl для отправки запроса к этой конечной точке. Поскольку на предыдущем шаге мы сопоставили порт 3100, вы можете получить к ней доступ через localhost:3100.

curl http://localhost:3100/ready

Если Loki запустился успешно, он ответит текстом ready и кодом состояния HTTP 200 OK.

Ожидаемый вывод:

ready

Проверка логов Loki для подтверждения запуска

Другой способ убедиться, что Loki запустился успешно, — это просмотреть логи его контейнера. Это полезно для отладки проблем с конфигурацией или других проблем при запуске. Команда docker logs извлекает логи контейнера.

Используйте следующую команду для просмотра логов вашего контейнера loki:

docker logs loki

Вы должны увидеть вывод, подробно описывающий процесс запуска. Ищите строку, подтверждающую, что сервер ожидает подключений. Это подтверждает, что служба инициализировалась без каких-либо критических ошибок.

Ожидаемый фрагмент вывода (детали логов могут отличаться):

level=info ts=... caller=server.go:299 http=[::]:3100 grpc=[::]:9096 msg="server listening on addresses"
level=info ts=... caller=loki.go:372 msg="Loki started"

Резюме

Поздравляем! Вы успешно завершили эту лабораторную работу.

В этой лабораторной работе вы изучили основные шаги для запуска и работы экземпляра Grafana Loki. Вы:

  • Загрузили официальный образ Loki Docker с Docker Hub.
  • Создали базовый файл loki-config.yaml для определения настроек сервера и хранения данных.
  • Запустили Loki в контейнере Docker, смонтировав конфигурацию и открыв порт API.
  • Проверили, что экземпляр Loki запущен и работоспособен, используя его конечную точку /ready и проверяя логи контейнера.

Эта базовая настройка является основой для построения более сложной и надежной архитектуры логирования. Далее вы можете перейти к настройке агента сбора логов, такого как Promtail, для отправки логов в Loki и использования Grafana для их запроса и визуализации.