Введение
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: Подготавливает компонентrulerLoki для отправки оповещений в 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 для их запроса и визуализации.



