Grafana Loki: обзор архитектуры и запуск в Kubernetes

Grafana Loki: обзор архитектуры и запуск в Kubernetes

15 марта 2023 г.

В последний раз я работал с Loki, когда он был еще в бета-версии, и тогда он выглядел гораздо проще, чем сейчас. В этом новом проекте вообще нет системы логирования, а так как мы все любим стек Grafana, то для логирования тоже решили использовать Loki.

Хотя, если честно, я думал, что его настройка будет намного проще. Ну, это не так. Многое изменилось, и, собственно, мне пришлось знакомиться с этим практически с нуля.

Остается, как и прежде, некая документация. Как по мне, описание архитектуры и компонентов еще более-менее нормально описано, но когда дело доходит до настройки, то сталкиваешься с массой проблем, особенно связанных с хранилищем и конфигурацией AWS S3 (хотя пока я писал этот пост , выкатили релиз 2.7, а также обновили документацию — может быть, теперь она лучше). Тем не менее, мне пришлось собирать его по частям, но в итоге все заработало.

Итак, в этом посте давайте рассмотрим общую архитектуру и компоненты, а затем установим Loki в Kubernetes на AWS из диаграммы Helm.

Архитектура Графана Локи

Loki построен на архитектуре микросервисов, где все микросервисы собраны в один двоичный файл.

Для запуска компонентов используется параметр --target, где вы можете указать, какую часть Loki запускать.

Входные данные делятся на потоки, то есть поток данных, т. е. журналов, которые имеют общий tenant_id ("отправитель") и общий набор тегов/меток. Подробнее о потоках мы поговорим в части Хранилище этого поста.

Компоненты Локи

Работа системы разделена на два основных потока: Путь чтения чтение (обработка запросов на выборку данных) и Путь записи. > — запись этих данных в хранилище.

Общая схема всех компонентов:

Здесь:

  • дистрибьютор (путь записи): сделки с обработкой входных данных от клиентов — получает от них данные, проверяет их, делит данные на блоки (chunks) и отправляет их в приемник. Перед раздатчиками желательно иметь LoadBalancer, чтобы входящие потоки распределялись между экземплярами раздатчиков. Это компонент без состояния — он не хранит никаких данных. Также отвечает за ограничение скорости и предварительную обработку тегов.
  • глотать (путь записи, чтения) : отвечает за запись данных в долговременное хранилище и за передачу данных для обработки запросов на их чтение от клиентов. Чтобы предотвратить потерю данных в случае перезапуска принимающего экземпляра, они обычно запускаются как несколько экземпляров (см. replication_factor)
  • querier (путь чтения): процессы Запросы LogQL, загрузка данных из приемников и/или долговременного хранилища для ответа — сначала он запрашивает приемщик. Если данных в памяти ингестора нет — то запросчик переходит в хранилище данных
  • интерфейс запроса (путь чтения ): дополнительная служба, предоставляющая доступ к API запросов для ускорения операций чтения. При его использовании он сохраняет входящие запросы, и запросчик вызывает его, чтобы исключить запрос из очереди для обработки

Кроме того, у Loki есть дополнительные компоненты:

  • линейка: управление оповещениями
  • уплотнитель: уменьшение размера индексов и управление временем хранения журналов в хранилище данных (retention)

Поток данных

Кратко о самом процессе обработки данных — запросы на чтение и запись.

  • Loki получает данные от promtail (или других агентов, таких как fluentd)
  • создает блоки данных (фрагменты), индекс и загружает их в долговременное хранилище
  • пользователь использует LogQL для извлечения журналов из Grafana
  • ruler проверяет данные и при необходимости отправляет оповещение в Prometheus Alertmanager

Чтение пути

При получении запроса на выборку данных:

  1. querier получает HTTP-запрос
  2. перенаправляет запрос принимающим на поиск данных в памяти
  3. если пользователи находят данные сами, запрашивающий возвращает их
  4. если в приемщиках данных нет, запрашивающий обращается в хранилище данных и получает их оттуда
  5. querier также возвращает ответ через HTTP-соединение.

Написать путь

При получении новых данных:

  1. дистрибьютор получает запрос HTTP/1 на добавление данных в определенный поток
  2. дистрибьютор передает каждый поток принимающему
  3. введение создает новый фрагмент («блок данных», см. Loki Storage ) или дополняет существующее
  4. дистрибьютор отвечает OK на запрос HTTP/1

Режимы запуска

Loki можно запустить в трех режимах, каждый из которых определяет способ запуска компонентов — в виде одного или нескольких модулей Kubernetes.

Монолитный режим

Тип по умолчанию при использовании локального хранилища данных filesystem.

Подходит для быстрого запуска и небольших объемов данных, до 100 ГБ в день

Балансировка запросов выполняется циклически.

Распараллеливание запросов ограничено количеством экземпляров и конфигурацией каждого экземпляра.

Основное ограничение заключается в том, что вы не можете использовать хранилища объектов, такие как AWS S3.

Простой масштабируемый режим развертывания

Тип по умолчанию при использовании хранилища объектов.

Если ваши журналы занимают больше нескольких сотен гигабайт, но меньше нескольких терабайт в день или вы хотите изолировать пути чтения и записи, вы можете развернуть Loki в простом, масштабируемом режиме развертывания:

В этом режиме Loki запускается с двумя целями — read & написать.

Требуется балансировщик нагрузки, который будет направлять запросы к экземплярам с компонентами Loki.

Режим микросервисов

А для самых сложных случаев, когда у вас терабайты логов в день, есть смысл развернуть каждый сервис отдельно:

  • проглотить
  • дистрибьютор
  • интерфейс запроса
  • планировщик запросов
  • запрос
  • индекс-шлюз
  • линейка
  • уплотнитель

Позволяет независимо отслеживать и масштабировать каждый компонент.

Хранилище Grafana Loki

См. документацию Grafana Loki Storage.

Loki использует два типа данных для хранения журналов: фрагменты и индексы.

Loki получает данные из нескольких потоков, каждый из которых представляет собой tenant_id и набор тегов. При получении новых записей из потока они упаковываются в фрагменты и отправляются в долгосрочное хранилище, которым может быть AWS S3, локальная файловая система или базы данных, такие как AWS DynamoDB или Apache Cassandra.

Индексы хранят информацию о наборе тегов каждого потока и имеют ссылки на фрагменты, связанные с этим потоком.

Ранее Loki использовала два отдельных хранилища — одно для индексов (например, таблицы DynamoDB), а второе — непосредственно для самих данных (например, AWS S3).

Где-то с версии 2.0 в Loki появилась возможность хранить индексы в виде файлов BotlDB и использовать Single Store — единое хранилище как для блоков данных, так и для индексов. См. раздел Single Store Loki (тип индекса boltdb-shipper).

Мы будем использовать boltdb-shipper — он создаст индексы локально, а затем отправит их в общее хранилище объектов. Фрагменты также будут храниться там.

Также в Loki 2.7 появился новый способ хранения индексов — в виде файлов TSDB, см. Выпуск Grafana Loki 2.7: индекс TSDB, улучшения Promtail и многое другое.

Потоки Loki, метки и хранение данных

Важным моментом, который следует учитывать при работе с тегами в Loki, является то, как формируются индексы и блоки данных: каждый отдельный набор тегов формирует отдельный поток, а каждый отдельный поток имеет свои собственные индексы и блоки данных.

То есть, если вы будете динамически создавать теги/метки, например client_ip, то у вас будет отдельный набор файлов для каждого IP клиента, что приведет к тому, что отдельные GET/POST Запросы /DELETE будут выполняться для каждого такого файла, поэтому, во-первых, это повлияет на стоимость хранилища (как в случае с AWS S3, где каждый вызов платный), а во-вторых, могут возникнуть проблемы со скоростью обработки запросы.

См. Ярлыки и отличный пост — Grafana Loki и что может пойти не так с кардинальностью меток.

Таблицы Локи Хелма

Помимо проблем с документацией, у Loki также есть некоторые трудности с чартами, так как они были перенесены между репозиториями и объединены, а теперь некоторые из них устарели (хотя ссылки на них в документации есть).

Ниже речь пойдет не о настройке, а лишь о некоторых деталях графиков Loki Helm.

Итак, есть Helm-репозиторий Grafana — https://grafana.github.io/helm-charts; добавить это:

репозиторий helm добавить графана https://grafana.github.io/helm-charts

Если открыть в браузере, то будет ссылка на документацию:

<цитата>

Документация по диаграммам доступна в каталоге grafana.

Перейдите по ссылке, и вы попадете в репозиторий git, который содержит список графиков:

* loki-canary – актуально * loki-distributed — актуально * loki-simple-scalableустарело, перемещено в https://github.com/grafana/loki/tree/main/production/helm/loki * loki-stack – актуально * lokiустарело, перемещено в https://github.com/grafana/loki/tree/main/production/helm/loki

Также их можно найти при поиске в Helm:

$ helm search repo grafana loki
NAME                            CHART VERSION   APP VERSION     DESCRIPTION
bitnami/grafana-loki            2.5.0           2.7.0           Grafana Loki is a horizontally scalable, highly...
grafana/loki                    3.3.4           2.6.1           Helm chart for Grafana Loki in simple, scalable...
grafana/loki-canary             0.10.0          2.6.1           Helm chart for Grafana Loki Canary
grafana/loki-distributed        0.65.0          2.6.1           Helm chart for Grafana Loki in microservices mode
grafana/loki-simple-scalable    1.8.11          2.6.1           Helm chart for Grafana Loki in simple, scalable...

Возможно оставили для совместимости, ладно, но это добавляет сложностей с установкой.

Вы можете скачать и разархивировать локально, чтобы посмотреть, что там:

helm pull grafana/loki --untar

Значения по умолчанию — здесь>>>.

График Helm и режим развертывания

Еще один момент, который был немного головокружительным: хорошо, мы видели, что Loki можно запускать с разными режимами развертывания, но как мы определяем это на диаграмме? В таких значениях, как -target, нет опции.

Ниже приведены некоторые сведения о диаграмме, которые можно пропустить, если вас устраивают настройки по умолчанию.

Итак, при установке со значениями по умолчанию мы получаем следующие компоненты:

$ helm install loki grafana/loki
...
Installed components:
* grafana-agent-operator
* gateway
* read
* write

И модули:

$ kk get pod
NAME                                           READY   STATUS              RESTARTS   AGE
loki-canary-7vrj2                              0/1     ContainerCreating   0          12s
loki-gateway-5868b68c68-lwtfj                  0/1     ContainerCreating   0          12s
loki-grafana-agent-operator-684b478b77-zmw5t   1/1     Running             0          12s
loki-logs-kwxcx                                0/2     ContainerCreating   0          3s
loki-read-0                                    0/1     ContainerCreating   0          12s
loki-read-1                                    0/1     Pending             0          12s
loki-read-2                                    0/1     Pending             0          12s
loki-write-0                                   0/1     ContainerCreating   0          12s
loki-write-1                                   0/1     Pending             0          12s
loki-write-2                                   0/1     Pending             0          12s

То есть по умолчанию установлен режим simple-scalable, при этом в документации самих чартов об этом ничего не сказано, даже ни слова о том, как вообще задавать режим развертывания.

Но что, если мне нужен один двоичный файл?

Удалить установку:

$ helm uninstall loki
release "loki" uninstalled

Давайте поверим документации и создадим наши ценности:

loki: 
  commonConfig: 
    replication_factor: 1 
  storage: 
    type: 'filesystem'

Установить:

$ helm upgrade --install --values values-local.yaml loki grafana/loki
...
Installed components:
* grafana-agent-operator
* loki

Что?

То есть просто переопределив хранилище — мы изменили режим развертывания?!?

Хорошо… Как это работает?

Откройте файл templates/_helpers.tpl, содержащий два шаблона — loki.deployment.isScalable и loki.deployment.isSingleBinary, которые содержат одно и то же условие, только с разными значениями:

... {{- eq (include "loki.isUsingObjectStorage" . ) "false" }} ...

Если true — тогда isScalable, если false — то isSingleBinary.

Хорошо, что такое isUsingObjectStorage?

Найти в том же помощнике:

... 
{{/* Determine if deployment is using object storage */}} 
{{- define "loki.isUsingObjectStorage" -}} 
{{- or (eq .Values.loki.storage.type "gcs") (eq .Values.loki.storage.type "s3") (eq .Values.loki.storage.type "azure") -}} 
{{- end -}} 
...

То есть, если мы используем .Values.loki.storage.type со значением gcs, s3 или azure loki.isUsingObjectStorage примет значение true, а Loki будет установлен в режим Simple Scale.

Это далеко не очевидно и не описано в документации к диаграмме.

Запуск Grafana Loki

Теперь, наконец, давайте перейдем к запуску и настройке Loki.

Для хранения данных будем использовать AWS S3, для работы с индексами — bottledb-shipper, для настройки срока хранения логов — compactor.

Для аутентификации Loki в AWS мы будем использовать ServiceAccount с ролью AWS IAM, но я также покажу пример с обычными ключами ACCESS/SECRET.

Создание корзины AWS S3

Начнем с создания корзины. Это возможно через AWS CLI и create-bucket или через Terraform:

resource "aws_s3_bucket" "loki_object_store" {
  bucket = "${var.client}-${var.environment}-loki-object-store"
  tags = {
    Name        = "Grafana Loki Object Store"
    environment = var.environment
    service     = var.service
  }
}

Теперь для простоты создадим через Консоль AWS:

n Grafana Loki Storage есть пример политика для AWS S3, которая… не проходит проверку в AWS IAM

Вообще у меня часто возникали ассоциации с Microsoft Azure — документации верить нельзя там тоже все надо проверять и собирать по частям.

Использование ServiceAccount

Я подробно описал конфигурацию ServiceAccount и IAM в другом сообщении, Kubernetes: ServiceAccount из роли AWS IAM для модуля Kubernetes, так что в этом давайте сделаем это быстро.

Перейдите в Консоль AWS > ИАМ > Политики, создайте Политику:

{
  "Version": "2012-10-17", 
  "Statement": [
    { 
      "Effect": "Allow", 
      "Action": [
        "s3:ListBucket", 
        "s3:PutObject", 
        "s3:GetObject", 
        "s3:DeleteObject" 
      ], 
     "Resource": [ "arn:aws:s3:::test-loki-0", "arn:aws:s3:::test-loki-0/*" ] 
    }
  ]
}

Перейдите в EKS и найдите URL-адрес поставщика OpenID Connect:

Перейдите к IAM > Поставщики удостоверений и найдите OIDC ARN по идентификатору 537***A10:

Перейдите в раздел Роли, создайте роль: выберите тип Веб-удостоверения, выберите из списка нашего поставщика удостоверений и укажите sts.amazon.com< /em> в аудитории:

Подключить ранее созданную политику:

Проверьте доверенную политику и сохраните новую роль:

Сохраните ARN роли — мы будем использовать его позже в параметрах Loki:

Использование AWS Access и секретных ключей

Еще один вариант — использовать параметры access_key_id, secret_access_key вместо роли IAM и ServiceAccount, см. s3-expanded-config.yaml :

...
storage_config: 
  aws: 
    bucketnames: bucket_name1, bucket_name2
    endpoint: s3.endpoint.com 
    region: s3_region 
    access_key_id: s3_access_key_id 
    secret_access_key: s3_secret_access_key 
    insecure: false
...

Это немного проще, чем ServiceAccount. Вопрос только в том, как хранить и передавать секреты с ключом.

В этом примере мы создадим обычного пользователя через консоль AWS, к которому мы подключим политику.

Перейдите к IAM > Роли, создайте политику:

{
  "Version": "2012-10-17", 
  "Statement": [
    {
      "Effect": "Allow", 
      "Action": [
       "s3:ListBucket", 
       "s3:PutObject", 
       "s3:GetObject", 
       "s3:DeleteObject"
    ],
    "Resource": [ "arn:aws:s3:::test-loki-0", "arn:aws:s3:::test-loki-0/*" ] 
    }
  ]
}

Создайте пользователя с программным доступом:

Подключите эту политику к пользователю:

Сохраните ключи:

Перейдем к конфигурации Loki — тоже достаточно мучений с документацией и диаграммой.

Запуск Grafana Loki в Kubernetes

Ну, теперь, когда стало понятно — и с диаграммами, и с тем, как установить режим развертывания через диаграмму Loki Helm, и вообще — какую диаграмму использовать, давайте попробуем запустить ее.

Подготовим минимальный конфиг, в котором сначала отключим весь его внутренний мониторинг, чтобы уменьшить количество подов — так будет проще понять, как он работает, и для начала воспользуемся хранилищем файловой системы для локального хранения данных и индексов в модулях:

loki:
  auth_enabled: false
  commonConfig:
    path_prefix: "/var/loki"
    replication_factor: 1
  storage:
    type: "filesystem"
  schema_config:
    configs:
    - from: 2022-12-12
    store: boltdb
    object_store: filesystem
    schema: v12
    index:
      prefix: index_
      period: 168h
storage_config:
  boltdb:
    directory: /var/loki/index
  filesystem:
    directory: /var/loki/chunks

test:
  enabled: false
monitoring:
  dashboards:
    enabled: false
  rules:
    enabled: false
  alerts:
    enabled: false
  serviceMonitor:
    enabled: false
  selfMonitoring:
    enabled: false
    lokiCanary:
      enabled: false
    grafanaAgent:
      installOperator: false

Развертывание в пространстве имен test-loki-0:

$ helm upgrade --install --namespace test-loki-0 --create-namespace --values loki-minimal-values.yaml loki grafana/loki
...
Installed components:
* loki

Проверьте модуль

$ kk -n test-loki-0 get pod
NAME     READY   STATUS    RESTARTS   AGE
loki-0   1/1     Running   0          118s

Ладно — есть один, ничего лишнего.

На диаграмме создается StatefulSet, который описывает создание этого модуля и настраивает различные тома:

$ kk -n test-loki-0 get sts
NAME   READY   AGE
loki   1/1     3m

И ConfigMap с сохраненной конфигурацией, дополненной нашим loki-minimal-values.yaml:

$ kk -n test-loki-0 get cm loki -o yaml
apiVersion: v1
data:
config.yaml: |
auth_enabled: false]
common:
path_prefix: /var/loki
replication_factor: 1
storage:
filesystem:
chunks_directory: /var/loki/chunks
rules_directory: /var/loki/rules
...

Конфигурация Grafana Loki S3

Я бы многое отдал, чтобы найти где-нибудь полный конфиг для Grafana Loki с AWS S3, как в примере ниже, с авторизацией через ServiceAccount и AWS IAM — я потратил много времени, пытаясь заставить все это работать.

Собственно, сам конфиг, далее немного о вариантах и ​​подводных камнях, с которыми я столкнулся:

loki:

  auth_enabled: false
  commonConfig:
    path_prefix: /var/loki
    replication_factor: 1

  storage:
    bucketNames:
      chunks: test-loki-0
    type: s3

  schema_config:
    configs:
    - from: "2022-01-11"
      index:
        period: 24h
        prefix: loki_index_
      store: boltdb-shipper
      object_store: s3
      schema: v12

  storage_config:
    aws:
      s3: s3://us-west-2/test-loki-0
      insecure: false
      s3forcepathstyle: true
    boltdb_shipper:
      active_index_directory: /var/loki/index
      shared_store: s3
  rulerConfig:
    storage:
      type: local
      local:
        directory: /var/loki/rules

serviceAccount:
 create: true
  annotations:
   eks.amazonaws.com/role-arn: "arn:aws:iam::638***021:role/test-loki-0-role"

write:
  replicas: 2
read:
  replicas: 1

test:
  enabled: false
monitoring:
  dashboards:
    enabled: false
  rules:
    enabled: false
  alerts:
    enabled: false
  serviceMonitor:
    enabled: false
  selfMonitoring:
    enabled: false
  lokiCanary:
    enabled: false
  grafanaAgent:
    installOperator: false

Итак, здесь:

  • auth_enabled:false — отключаем авторизацию в самой Локи (в итоге мы получим tenant_id с именем fake в корзине — это ок, хотя разработчики могли бы придумать что-то более «красивое», чем «фейк»)
  • storage.bucketNames.chunks — нужно указать имя корзины для чанков; в противном случае он попытается использовать локальное хранилище; не указано в документации;
  • schema_config.configs.store:
  • boltdb-shipper — задайте использование boltdb-shipper для индексов, так как он поддерживает Single Store, то есть оба блока данных, также известные как чанки, и их индексы будут в одной корзине
  • object_store:s3 — указываем тип хранилища, который настроен в storage_config.aws.s3 (но здесь мы указываем именно как schema_config.configs. store.s3, а не schema_config.configs.store.aws.s3)
  • storage_config — самая большая проблема:
  • aws.s3: указывать точно в виде s3://<S3_BUCKET_REGION>/<S3_BUCKET_NAME>, иначе при подключении ServiceAccount запускается Loki пытаюсь зайти на https://sts.dummy.amazonaws.com для авторизации – не могу понять почему, но при использовании ServiceAccount этот формат обязателен
  • boltdb_shipper — указать локальный путь, по которому он создает индексы — active_index_directory и shared_store — куда их отправить позже; Конфиг возьму из того же storage_config.aws.s3
  • rulerConfig.storage.type: local — пока указываем локальную директорию для компонента ruler, с алертами разберемся в другой раз; если не указать, будет постоянно писать в лог ошибку, что не может получить доступ к своей корзине, что где-то в дефолтах написано. не помню где именно
  • write.replicas: 2 — минимальное количество модулей записи, чтобы Promatil мог записывать данные

Обновите выпуск Helm:

$ helm upgrade --install --namespace test-loki-0 --values loki-values.yaml loki grafana/loki
...
Installed components:
* gateway
* read
* write

Теперь у нас есть отдельные модули чтения и записи. Экземпляр Gateway просто имеет службу Nginx для маршрутизации запросов:

$ kk -n test-loki-0 get pod
NAME                            READY   STATUS    RESTARTS   AGE
loki-gateway-55b4798bdb-g9hkl   1/1     Running   0          48s
loki-read-0                     0/1     Pending   0          48s
loki-write-0                    0/1     Running   0          48s
loki-write-1                    0/1     Running   0          47s

Подождите минуту, пока модули перейдут в состояние Выполняется, проверьте журналы модуля loki-write-0 и после появления сообщения:

<цитата>

msg="присоединение к кластеру участников выполнено успешно"reached_nodes=2 elapsed_time=1m39.087106032s

проверьте корзину:

$ aws --profile development s3 ls test-loki-0
2022-12-25 11:53:13        251 loki_cluster_seed.json

И еще через несколько минут должны появиться каталоги fake и index :

$ aws --profile development s3 ls test-loki-0
PRE fake/
PRE index/
2022-12-25 11:53:13        251 loki_cluster_seed.json

В фейке — чанки, в индексе — индексы.

Хорошо, похоже, это работает.

Теперь, после добавления promatil, который будет записывать данные — компонент ingester будет записывать блоки данных, а bottledb-shipper — начните создавать индексы и отправляйте их в корзину.

Запуск рекламы

Найдите сервис Loki Gateway:

$ kk -n test-loki-0 get svc
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
loki-gateway          ClusterIP   10.109.225.168   <none>        80/TCP              22m
...

Разверните диаграмму Promtail с помощью --set и настройте значение loki.serviceName:

$ helm upgrade --install --namespace test-loki-0 --set loki.serviceName=loki-gateway promtail grafana/promtail

Проверьте модули:

kk -n test-loki-0 get pod
NAME                            READY   STATUS    RESTARTS   AGE
loki-gateway-55b4798bdb-7dzlf   1/1     Running   0          5m32s
loki-read-0                     1/1     Running   0          5m32s
loki-write-0                    1/1     Running   0          5m32s
loki-write-1                    1/1     Running   0          5m32s
promtail-6pw59                  0/1     Running   0          17s
promtail-8h78j                  0/1     Running   0          17s
promtail-jb6bz                  0/1     Pending   0          17s
...

promtail идут, отлично.

Проверьте журналы шлюза — там должны отображаться данные из promtail:

$ kk -n test-loki-0 logs -f loki-gateway-55b4798bdb-7dzlf
...
10.0.87.55 - - [25/Dec/2022:09:58:19 +0000]  204 "POST /loki/api/v1/push HTTP/1.1" 0 "-" "promtail/2.7.0" "-"
10.0.109.239 - - [25/Dec/2022:09:58:19 +0000]  204 "POST /loki/api/v1/push HTTP/1.1" 0 "-" "promtail/2.7.0" "-"

Теперь давайте установим Grafana и подключим к ней Loki.

Запуск Grafana

Установить из того же репозитория:

$ helm upgrade --install --namespace test-loki-0 grafana grafana/grafana

Получите пароль пользователя admin:

$ kubectl get secret --namespace test-loki-0 grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
ahUAdmUdpemotqICa6jGzvi9wiU01an5qZJx3WSb

Локально откройте порт Grafana:

$ kk -n test-loki-0 port-forward svc/grafana 8080:80

Откройте http://localhost:8080 в браузере, войдите в систему и перейдите в раздел Конфигурация — Источники данных. :

Нажмите Добавить источник данных, выберите Loki :

Добавьте Loki, укажите http://loki-gateway:80 в URL:

Сохранить, протестировать:

Перейдите в раздел Исследовать, выберите Loki вверху и проверьте журналы:

Готово.


Также опубликовано здесь.


Оригинал