Passer au contenu principal

Production (Kubernetes)

Gestion des logs avec Loki

Les logs de pods sont éphémères dans Kubernetes : quand un pod est supprimé, ses logs le sont aussi. En production, il faut une solution de centralisation des logs. Loki (Grafana Labs) est devenu le standard pour les clusters Kubernetes qui utilisent déjà Grafana : même interface, même langage de requête (LogQL proche de PromQL).

Architecture Loki + Promtail

  • Promtail : agent (DaemonSet) qui lit les logs des pods sur chaque noeud et les envoie à Loki
  • Loki : agrégateur et stockage de logs, indexe uniquement les labels (pas le contenu)
  • Grafana : interface de requête et visualisation

Installation avec Helm

helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

# Stack Loki + Promtail
helm install loki grafana/loki-stack   --namespace monitoring   -f loki-values.yaml
# loki-values.yaml
loki:
  enabled: true
  persistence:
    enabled: true
    size: 50Gi
    storageClassName: fast-ssd
  config:
    limits_config:
      retention_period: 720h   # 30 jours

promtail:
  enabled: true
  config:
    clients:
    - url: http://loki:3100/loki/api/v1/push

grafana:
  enabled: false   # Déjà installé via kube-prometheus-stack

Requêtes LogQL


# Logs d'un namespace
{namespace="production"}

# Logs d'une application
{namespace="production", app="myapp"}

# Filtrer sur le contenu
{app="myapp"} |= "ERROR"
{app="myapp"} |~ "timeout|connection refused"

# Parser les logs JSON et filtrer
{app="myapp"} | json | level="error" | duration > 1s

# Taux d'erreurs par application
sum by (app) (rate({namespace="production"} |= "ERROR" [5m]))

# Logs des conteneurs d'un pod spécifique
{pod="myapp-7d6b9c8f5-xkp2n"}

Configuration Promtail avancée

# Pipeline de parsing pour les logs applicatifs
scrape_configs:
- job_name: kubernetes-pods
  kubernetes_sd_configs:
  - role: pod
  pipeline_stages:
  - docker: {}              # Parser le format Docker JSON
  - match:
      selector: '{app="myapp"}'
      stages:
      - json:
          expressions:
            level: level
            msg: message
            ts: timestamp
      - labels:
          level:            # Ajouter le level comme label Loki

Alternatives

  • Fluent Bit + Elasticsearch (EFK) : plus puissant pour les transformations complexes, plus lourd à opérer. Kibana pour la visualisation.
  • Vector : agrégateur de logs moderne (Rust), très performant, supporte de nombreuses sources et destinations.
  • OpenTelemetry Collector : tend à devenir le standard pour unifier logs, métriques et traces.

Loki est le choix le plus naturel pour un cluster qui utilise déjà Prometheus et Grafana : on évite un Elasticsearch coûteux en ressources pour centraliser uniquement des logs.

Sources