O Grafana Loki é um sistema de agregação de logs desenvolvido pela equipe da Grafana Labs. Ele é usado em conjunto com o Grafana para oferecer visualização conveniente de logs.
Diferentemente da stack ELK, o Loki não indexa o conteúdo dos logs, mas os armazena junto com metadados (por exemplo, nome do pod ou namespace). Isso o torna mais rápido e menos exigente em termos de recursos.
O Loki é mais comumente utilizado com o Promtail — um agente que coleta logs dos nós e os envia para o Loki. Depois, você pode visualizar esses logs diretamente no Grafana usando consultas LogQL.
Para instalar o Loki:
Abaixo está uma explicação breve de cada bloco:
test_pod:
enabled: true
image: bats/bats:1.8.2
Inicia um pod de teste com o utilitário bats para verificar se o Loki está disponível e recebendo logs. Usado apenas para validação automática após a instalação.
loki:
enabled: true
isDefault: true
O componente principal é o Loki, responsável por receber e armazenar logs.
Opções configuráveis incluem:
url: endereço interno do serviço Loki (usado por outros componentes)readinessProbe e livenessProbe: verificações de saúdedatasource: configurações para conectar o Loki como fonte de dados no GrafanaVocê pode especificar datasource.uid se quiser vinculá-lo explicitamente.
promtail:
enabled: true
config:
clients:
- url: http://<release-name>:3100/loki/api/v1/push
O Promtail é o agente padrão que coleta logs dos nós do cluster (de /var/log/containers/*.log) e os envia para o Loki.
Se você estiver usando outros coletores de logs, como Filebeat ou Fluent Bit, pode desativar o Promtail:
fluent-bit:
enabled: false
filebeat:
enabled: false
filebeatConfig: ...
logstash:
enabled: false
filters: ...
outputs: ...
Essas são alternativas opcionais caso o Promtail não seja adequado — por exemplo, se você estiver usando o Fluent Operator. Elas ficam desativadas por padrão.
grafana:
enabled: false
Ativa a instalação do Grafana. Defina como true se quiser visualizar os logs por meio de uma interface web.
Se o Grafana já estiver implantado no cluster, você pode manter desativado e configurar o Loki manualmente como fonte de dados.
prometheus:
enabled: false
isDefault: false
url: ...
Permite adicionar o Prometheus como fonte de dados no Grafana. Isso não instala o Prometheus — apenas registra a conexão. Ative se o Prometheus já estiver rodando no cluster e você quiser usá-lo junto com o Loki.
proxy:
http_proxy: ""
https_proxy: ""
no_proxy: ""
Configurações de proxy, caso seja necessário conectar-se a serviços externos.
Vamos passar por um exemplo de configuração usando Loki e Promtail.
Vamos iniciar um pod que escreve logs na saída padrão. O kubelet salvará esses logs em /var/log/containers/. O Promtail (como DaemonSet) lê esses logs e os envia para o Loki. Em seguida, o Grafana pode ser usado para explorá-los pela interface web.
Instale o complemento Loki pelo painel de gerenciamento do cluster. Na janela de configuração, mantenha todos os parâmetros padrão, mas altere:
grafana:
enabled: false
para:
grafana:
enabled: true
Isso implantará o Grafana junto com o Loki.
Instale o complemento NGINX Ingress, necessário para acessar a interface do Grafana por um domínio.
Execute:
kubectl get pods -n loki
Saída esperada:
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
Verifique também se o controlador de Ingress está em execução:
kubectl get pods -n ingress-nginx
E confira os serviços do Grafana Loki:
kubectl get svc -n loki
Saída de exemplo:
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
Agora vamos configurar o NGINX Ingress para expor o Grafana por domínio. Para isso, criaremos um load balancer e o manifesto 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
Aplique:
kubectl apply -f loadbalancer.yaml
Crie uma regra de Ingress no arquivo 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
Substitua grafana.example.com pelo seu domínio real. Certifique-se de que o registro A do domínio aponte para o IP externo do LoadBalancer.
Aplique o manifesto:
kubectl apply -f grafana-ingress.yaml
Crie um pod que registre mensagens continuamente:
kubectl run logger --image=busybox --restart=Never -- sh -c 'while true; do echo "hello from logger"; sleep 5; done'
Verifique se está em execução:
kubectl get pods
O pod logger deve estar no estado Running.
Abra o domínio configurado no Ingress (por exemplo, https://grafana.example.com). Você verá a tela de login do Grafana.
Use o usuário admin. Para obter a senha:
kubectl get secret -n loki loki-stack-grafana -o jsonpath="{.data.admin-password}" | base64 --decode
Na interface do Grafana, vá para a seção Explore.

Interface do Grafana
Selecione Loki como fonte de dados. Em Label filters, informe pod=logger e clique em Run query.

Seção Explore na interface do Grafana
Role a página para baixo e você deverá ver entradas de log como:
hello from logger

Entradas de log na interface do Grafana
Assim, você pode monitorar e analisar facilmente os logs do cluster diretamente no Grafana.