Convoyeurs de loges : ELK et Loki
1) Pourquoi et quand : objectifs de loging
Observabilité et RCA : accélération de la débâcle, post mortem, contrôle SLO/SLA.
Sécurité et audit : traces d'accès, anomalies, enquêtes.
Mesures commerciales : conversion, flow de paiement, erreurs PSP, comportement des utilisateurs.
Conformité : stockage, masquage des IPI, politiques de rétention, Legal Hold.
Types de logs : applications, infrastructures (kubelet, kube-proxy, CNI, ingress), réseau, audit, paiement, événements Web, Nginx/Envoy, OBD.
2) architectures de haut niveau
Option A : ELK
Producers → Logshipper (Filebeat/Fluent Bit/Vector) → Logstash/Beats input → Elasticsearch → Kibana/Алертинг
Option B : Loki
Producers → Promtail/Fluent Bit → Loki distributor/ingester/querier → Grafana/Алертинг
Hybride
ELK pour la recherche par texte intégral/facettes, Loki pour le stockage évolutif bon marché et les requêtes de type grep rapide ; corelation avec métriques/pistes à Grafana.
3) Flux de données et niveaux de traitement
1. Collecte : Fichiers tail, journald, syslog, conteneurs stdout, HTTP.
2. Enrichissement : timestamp normalisation, host/pod/namespace, bou (prod/stage), release, commit SHA, trace/span id.
3. Parsing : JSON → flat fields ; grok/regex; Formats Nginx/Envoy ; les circuits de paiement (codes d'erreur PSP).
4. Filtrage/révision : couper PII (PAN, CVV, e-mail, adresses), secrets, jetons.
5. Itinérance : par tenant/service/niveau log ; hot/warm/cold; dans le stockage S3/objet.
6. Stockage et rétention : Politique TTL par classe de données.
7. Accès/Analyse/Alerte.
4) ELK : solutions clés
4. 1 Logstash/Beats
Utilisez Beats/Fluent Bit sur les noeuds pour un assembleur léger, Logstash comme ETL central (grok, dissect, mutate, geoip, translate).
Pools Logstash : ingest-ETL, security-ETL, payments-ETL - pour isoler les charges.
4. 2 Elasticsearch
Chardonnages : orientez-vous vers un ~ de 20-50 Go par shard ; évitez l'explosion du shard.
Stratégie d'index : 'logs- <tenant> - <service> -YYYY. MM. DD'ou strimes de données ; rollover par taille/temps.
- hot : SSD, 1-7 jours ; warm : HDD, 7-30 jours ; cold : volumineux ; frozen : coût minimum avec accès plus lent.
- Mappings : Typez rigidement les champs, limitez 'fielddata' et créez des champs dynamiques.
- Cache et requêtes : filtres par champ keyword, agrégats - soigneusement ; pin-to-hot pour la recherche haute fréquence.
4. 3 Kibana
Espaces (Spaces) pour la multitenance.
Searches, Lens/TSVB, threshold/métriques-alertes.
RBAC par index-patterns (« logs-tenant- »).
5) Loki : des solutions clés
5. 1 Modèle de label
Les labels sont un « index » de Loki. Utilisez une faible cardinalité : 'cluster', 'namespace', 'app', 'level', 'bou', 'tenant'.
Les champs à haute cardinalité (uid, request_id) sont dans la ligne ; Extraire lors de la requête via LogQL '| =', '| json', '| regexp'.
5. 2 Composants
Promtail: сбор stdout, files, journald; parser (JSON, regex, cri).
Distributor/Ingester/Querier/Query-frontend : mise à l'échelle par rôle ; mise en cache des requêtes.
Objet de stockage (S3/GCS/MinIO) pour le stockage à long terme des logs de chunk.
5. 3 réceptions LogQL
Grep rapide : '{app = « payments », level = » error »} | = « declined »'
Парсинг JSON: `{app="api"} | json | code="5xx" | unwrap duration | avg()`
Corrélation avec les métriques : 'rate ({app = « nginx »} | = « 200 » [5m])'
6) Comparaison ELK vs Loki (en résumé)
Recherche/agrégation : ELK est plus fort pour les requêtes complexes en texte intégral et facettes ; Loki - grep-like, rapide et bon marché.
Coût : Loki est souvent moins cher sur de gros volumes (stockage objet + indice plus petit).
Complexité de l'exploitation : ELK exige une discipline par index/ILM, Javu-hipam ; Loki est une discipline par label.
Corrélation métrique/trace : Loki s'intègre naturellement à la pile Grafana/OTel ; ELK sait aussi, mais plus souvent par l'intégration.
7) Sécurité et conformité
Édition PII au bord (shipper) : masquer PAN, e-mail, téléphone, adresses, jetons.
TLS en transit, mTLS entre les agents et les pneumatiques.
RBAC : index/labels per-tenant ; isolation des espaces/neimspaces.
Secrets hygiene : variables d'environnement sans secrets, gestionnaires de secrets individuels.
Legal Hold : mécanisme de gel des segments/indices ; write-once pour les périodes controversées.
Suppression/rétention : politiques TTL par classe de données (prod/stateful/paiements/audit).
Audits-trails d'accès aux logs.
8) Fiabilité et bande passante
Tamponnage et backpressure : fichiers/disques locaux des agents ; Retrai avec backoff exponentiel.
Idempotency : champs 'ingest _ id '/' log _ id' pour éviter les prises lors des répétitions.
HA : minimum de 3 noeuds pour les maîtres/ingénieurs ES Loki ; antiaffinity по AZ.
Quotas et limites de taux par tenant/service ; protection contre les « tempêtes » de logage.
Schéma de niveau des logs : 'ERROR' limité, 'DEBUG' uniquement temporairement via les drapeaux dynamiques.
9) Performance et tuning
ELK:- JVM heap 50 % RAM (mais ≤ ~ 30-32 Go par noeud), page cache est important.
- Rollover intelligent (20-50 Go/shard), 'refresh _ interval' ↑ pour les index ingest.
- Dans Logstash, éviter le grok « lourd » ; si possible, logigation JSON à la source.
- Le bon label est la clé de la vitesse.
- Les grandes cuves → moins chères à stocker, mais la mémoire est plus chère chez ingester ; équilibrer.
- Query-frontend + cache (mem/Redis) pour les requêtes répétées.
10) FinOps pour les loges (coût)
Baisse de la cardinalité des champs/labels.
Sampling DEBUG et les « logs-swichs » dynamiques.
Rotation : court hot, long cold en objet.
Déduplication et messages consolidés (batch).
Archivez les logs rarement utilisés dans des classes de stockage bon marché.
Дашборд du coût : объем/дата-стримы/лейблы/индексы/тенанты.
11) Corrélation avec les métriques et les pistes (Observability 3-in-1)
Trace-ID/Span-ID dans chaque journal (middleware sur les API passerelles et dans les services).
OpenTelemetry : un contexte unique ; exportateurs en Tempo/Jaeger, métriques en Prometheus/Mimir, loges en Loki/ELK.
Scénarios rapides : « alerte métrique → sauter dans les loges correspondantes → sauter dans la piste ».
12) Multi-ténacité et isolation
Isolation à base de namespace (K8s labels), modèles d'index/labels distincts « tenant ».
Diviser les alerts/dashboards/rétentions par tenant.
Facturation par consommation : volume ingest, stockage, demandes.
13) Surveillance et SLO pour le convoyeur lui-même
SLO ingest: «99. 9 % des logs ont été livrés <X secondes".
SLO de recherche : « p95 requêtes <Y sec ».
Métriques techniques : queue depth, dropped logs, taux de reprise, error rate parser, défaut d'ingester/ES nod.
14) Schémas types de déploiement
Managed: Elasticsearch Service/Opensearch, Grafana Cloud Loki.
Self-hosted K8s : StatefulSets pour ES/Loki, anti-affinité par AZ, PersistentVolumes, stockage d'objets.
Agents Edge (applications dans les régions) : tampon local + canal TLS sur l'ingest central.
15) Exemples de configurations
15. 1 Promtail (K8s, CRI JSON)
yaml scrape_configs:
- job_name: kubernetes-pods kubernetes_sd_configs:
- role: pod pipeline_stages:
- cri: {}
- json:
expressions:
level: level msg: message trace: trace_id
- labels:
level:
app:
namespace:
- match:
selector: '{namespace="prod"}'
stages:
- regex:
expression: '(?P<pan>\b[0-9]{12,19}\b)'
- replace:
expression: '(?P<pan>\b[0-9]{12,19}\b)'
replace: '[REDACTED_PAN]'
relabel_configs:
- action: replace source_labels: [__meta_kubernetes_pod_label_app]
target_label: app
- action: replace source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- action: replace source_labels: [__meta_kubernetes_pod_node_name]
target_label: node
15. 2 Logstash (ingest et masquage)
ruby input {
beats { port => 5044 }
}
filter {
json { source => "message" skip_on_invalid_json => true }
mutate { add_field => { "env" => "%{[kubernetes][labels][env]}" } }
PII mutate {
gsub => [
"message", "\b[0-9]{12,19}\b", "[REDACTED_PAN]",
"message", "(?i)(authorization: Bearer)([A-Za-z0-9\.\-_]+)", "\1[REDACTED_TOKEN]"
]
}
}
output {
elasticsearch {
hosts => ["https://es-hot-1:9200","https://es-hot-2:9200"]
index => "logs-%{[fields][tenant]}-%{[app]}-%{+YYYY. MM. dd}"
ilm_enabled => true ssl => true cacert => "/etc/ssl/certs/ca. crt"
user => "${ES_USER}"
password => "${ES_PASS}"
}
}
16) Alerting et dashboards (modèles)
Ошибки API: `rate({app="api",level="error"}[5m]) > threshold` → PagerDuty/Telegram.
Sursaut de 5xx dans Nginx/Envoy ; drop ingest chez les agents ; croissance de la recherche de latitude.
- Volume de logs par service/tenants.
- Top patterns d'erreur (code/exception/endpoint).
- Coût par classe/classe de stockage.
17) Contrôles de qualité (log-QA)
Contrats logiques : format JSON, champs obligatoires ('t',' level ',' service ',' bou ',' trace _ id ',' msg ').
Linter des loges à CI : interdiction de nouveaux champs à haute cardinalité sans accord.
Services Canaries : génération de logs de référence pour la détection précoce des régressions.
18) Erreurs fréquentes et anti-modèles
Les labels Loki à haute cardinalité ('user _ id', 'request _ id') → une explosion de mémoire.
Les champs dynamiques dans ES sans mapping → « explosion d'index ».
DEBUG dans la vente « pour toujours ». Allumez par drapeau et avec TTL.
Absence d'édition PII.
Un convoyeur commun « monolithique » pour tout - les meilleurs segments par domaine.
19) Plan de mise en œuvre (itérations)
1. MVP : agents + one pipline (applications), dashboards de base, édition PII.
2. Extension : réseaux/infra-logs, alertes SLO, corelation avec pistes.
3. FinOps : matrice de rétention, rapport coût, optimisation des labels/indices.
4. Multi-tenant : espaces, RBAC, facturation par consommation.
5. Fiabilité : HA, disaster-drills, Legal Hold.
20) Chèque de démarrage en prod
- Format JSON et champs obligatoires dans tous les services.
- Masque PII sur agent/ingest.
- Politiques de rétention/ILM ou bucket-lifecycle.
- RBAC/espaces/tenants.
- SLO ingest/search et alerte.
- Logs canaris et essai de charge.
- Dashboards de valeur et rapport sur les propriétaires de services.
- Runbooks : « Que faire si l'ingest tombe/recherche lente/chardes rouges ».
21) Mini-FAQ
Que choisir - ELK ou Loki ?