Grafana Loki — это система сбора и просмотра логов, созданная командой Grafana Labs. Она используется совместно с Grafana для удобной визуализации логов.
В отличие от ELK-стека, Loki не индексирует содержимое логов, а хранит их вместе с метаданными (например, имя пода или namespace). Это делает систему более быстрой и менее требовательной к ресурсам.
Чаще всего Loki используется в связке с Promtail — агентом, который собирает логи с нод и отправляет их в Loki. Затем вы можете просматривать эти логи прямо в Grafana с помощью запросов на языке LogQL.
Установка
Для установки перейдите в раздел «Дополнения» в панели управления кластера.

После выбора дополнения «Grafana Loki» в панели управления вы увидите YAML-конфигурацию с параметрами по умолчанию.

Кратко опишем, за что отвечает каждый блок.
test_pod:
  enabled: true
  image: bats/bats:1.8.2
Запускает тестовый под с утилитой bats, которая проверяет, что Loki доступен и принимает логи. Используется только для автоматической валидации после установки.
loki:
  enabled: true
  isDefault: true
Основной компонент — Loki, который принимает и хранит логи.
Здесь можно настроить:
- 
url— внутренний адрес сервиса Loki (используется другими компонентами). - 
readinessProbeиlivenessProbe— проверки состояния сервиса. - 
datasource— настройки подключения к Loki как к источнику данных в Grafana. 
Если вы используете Grafana, datasource.uid может быть задан для явного подключения источника.
promtail:
  enabled: true
  config:
    clients:
      - url: http://<release-name>:3100/loki/api/v1/push
Promtail — агент, который собирает логи с узлов кластера (из /var/log/containers/*.log) и отправляет их в Loki.
Используется по умолчанию. Если вы планируете использовать альтернативные сборщики логов, например, Filebeat или Fluent Bit — можно отключить.
fluent-bit:
  enabled: false
filebeat:
  enabled: false
  filebeatConfig: ...
logstash:
  enabled: false
  filters: ...
  outputs: ...
Альтернативные агенты для сбора логов. Их можно включить, если Promtail не подходит для вашего случая (например, вы уже используете Fluent Operator).
По умолчанию они отключены.
grafana:
  enabled: false
Отвечает за установку Grafana. Если вы хотите просматривать логи через веб-интерфейс — укажите значение enabled: true.
Если в кластере уже установлена Grafana, можно оставить выключенным и подключить Loki вручную как источник данных.
prometheus:
  enabled: false
  isDefault: false
  url: ...
Позволяет подключить Prometheus как источник метрик в Grafana. Сам Prometheus при этом не устанавливается — этот блок лишь добавляет его как datasource.
Можно включить, если у вас уже настроен Prometheus в кластере и вы хотите использовать его в Grafana вместе с Loki.
proxy:
  http_proxy: ""
  https_proxy: ""
  no_proxy: ""
Настройки прокси, которые могут быть нужны при подключении к внешним сервисам.
Пример использования
В качестве примера рассмотрим работу дополнения в связке с Promtail. В роли источника логов запустим под, который будет писать сообщения в стандартный вывод. Kubelet сохраняет эти сообщения в файл в директории /var/log/containers/. Promtail, установленный как DaemonSet, считывает эти файлы и отправляет содержимое в Loki. Loki сохраняет логи, а Grafana позволяет их просматривать через веб-интерфейс.
Установите дополнение в панели управления. В окне конфигурации оставьте все параметры по умолчанию, изменив только:
grafana: 
  enabled: false
на:
grafana: 
  enabled: true
Это позволит развернуть Grafana, через которую потом будем смотреть логи.
Также установите дополнение Nginx Ingress — оно нужно для доступа к интерфейсу Grafana по доменному имени.
Проверьте, что все поды запущены:
kubectl get pods -n loki
Вы должны увидеть примерно следующее:
NAME                                 READY   STATUS    RESTARTS   AGE
loki-stack-0                         1/1     Running   0          3h5m
loki-stack-grafana-878d56dc6-s28sq   2/2     Running   0          3h5m
loki-stack-promtail-5wtlr            1/1     Running   0          3h5m
loki-stack-promtail-hl6pl            1/1     Running   0          3h5m
Проверьте, что ingress-контроллер работает:
kubectl get pods -n ingress-nginx
Также проверьте сервисы Grafana Loki:
kubectl get svc -n loki
Пример вывода:
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
loki-stack              ClusterIP   10.111.63.222    <none>        3100/TCP   3h7m
loki-stack-grafana      ClusterIP   10.104.154.158   <none>        80/TCP     3h7m
loki-stack-headless     ClusterIP   None             <none>        3100/TCP   3h7m
loki-stack-memberlist   ClusterIP   None             <none>        7946/TCP   3h7m
После этого настроим nginx ingress для работы с Grafana по домену. Для этого создадим балансировщик. Создайте манифест loadbalancer.yaml:
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  selector:
    app.kubernetes.io/name: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: 80
    - name: https
      port: 443
      targetPort: 443
  type: LoadBalancer
Примените манифест:
kubectl apply -f loadbalancer.yaml
Создайте правило Ingress в файле grafana-ingress.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: grafana
  namespace: loki
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: grafana.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: loki-stack-grafana
                port:
                  number: 80
Измените host: grafana.example.com, указав домен, по которому вы хотите, чтобы открывался веб-интерфейс Grafana. В качестве A-записи для этого домена укажите IP созданного балансировщика.
Примените манифест:
kubectl apply -f loadbalancer.yaml
Теперь создадим под logger, который будет записывать сообщения, эмулируя логи:
kubectl run logger --image=busybox --restart=Never -- sh -c 'while true; do echo "hello from logger"; sleep 5; done'
Проверьте, что под запустился:
kubectl get pods
У пода logger должен быть статус Running.
Теперь обратимся к веб-интерфейсу графаны. Откройте домен, указанный ранее в Ingress. При переходе вас встретит окно авторизации Grafana.
В качестве логина укажите:
admin
Пароль для авторизации хранится в секрете. Получите его командой:
kubectl get secret -n loki loki-stack-grafana -o jsonpath="{.data.admin-password}" | base64 --decode
В интерфейсе Grafana перейдите в раздел «Explore».

Выберите источник данных «Loki». В поле «Label filters» укажите pod=logger и запустите запрос, нажав на кнопку «Run query»

После этого пролистайте страницу вниз. Вы увидите записи в логе «hello from logger»
