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»