Les Yeux sur le Cluster : Observabilité à 0€ (Prometheus, Loki, Grafana)
Les Yeux sur le Cluster : Observabilité à 0€ (Prometheus, Loki, Grafana)
Le code sans visibilité, c'est de la conduite de nuit sans phares. Vous pouvez avoir le meilleur cluster K3s du monde (voir l'article 01), si vous ne savez pas ce qui s'y passe, vous êtes en danger.
Dans l'écosystème Cloud, il y a un ogre : Datadog. C'est un outil magnifique, complet, et incroyablement cher. Pour une startup ou un projet perso, la facture d'observabilité peut vite dépasser celle de l'infrastructure elle-même.
Chez Momentum, on refuse de payer pour voir. On veut le contrôle total, la rétention illimitée, et un coût de licence de 0€.
Voici comment on a déployé la stack PLG (Prometheus, Loki, Grafana) pour surveiller notre infrastructure comme des pros.
Pourquoi pas Datadog ? (Le coût de la paresse)
Datadog facture par hôte (~15), et par métrique custom. Imaginez notre cluster de 3 nœuds.
- 3 hosts : 45$
- Logs (Verbeux) : 50$
- APM/Traces : 30$
- Total : 125$/mois.
C'est plus du double du prix de notre cluster (50€) ! C'est inacceptable. L'alternative Open Source demande un peu d'huile de coude, mais le ROI est infini.
La Stack PLG : Le Trio Gagnant
Oubliez la stack ELK (Elasticsearch, Logstash, Kibana). C'est lourd (Java), gourmand en RAM, et complexe à gérer. En 2026, la norme pour Kubernetes, c'est PLG :
- Prometheus (Metrics) : Le standard absolu. Il "scrape" (aspire) les métriques exposées par vos applications et vos nœuds. CPU, RAM, Latence HTTP, tout y passe.
- Loki (Logs) : Le "Prometheus pour les logs". Contrairement à Elasticsearch qui indexe tout le texte (lourd), Loki n'indexe que les métadonnées (labels). C'est ultra-léger et rapide.
- Grafana (Visualisation) : Le tableau de bord unique pour tout voir.
Partie 1 : L'Installation (Helm is King)
On ne réinvente pas la roue. On utilise le chart Helm communautaire kube-prometheus-stack. C'est un package tout-en-un qui installe Prometheus, AlertManager, Grafana, et les "Exporters" (Node Exporter pour le hardware, Kube State Metrics pour K8s).
Voici notre values.yaml épuré pour la production :
# prometheus-values.yaml
grafana:
adminPassword: "CHANGE_ME_PLEASE"
persistence:
enabled: true
size: 10Gi
ingress:
enabled: true
hosts:
- grafana.momentum-coach.com
prometheus:
prometheusSpec:
retention: 15d
storageSpec:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 50Gi
alertmanager:
enabled: true
Une commande et tout est là :
helm install monitoring prometheus-community/kube-prometheus-stack -f prometheus-values.yaml -n monitoring
Partie 2 : Les Logs avec Loki et S3 (L'astuce stockage)
Stocker des logs sur le disque local de vos serveurs (NVMe), c'est du gâchis. Ça coûte cher et c'est difficile à scaler. L'architecture moderne de Loki permet de stocker les "chunks" de logs directement dans un Object Storage S3 (AWS S3, Scaleway Object Storage, MinIO).
Le coût ? Dérisoire. Quelques centimes par mois pour des gigaoctets de logs.
Voici la configuration Loki pour utiliser S3 :
# loki-values.yaml
loki:
auth_enabled: false
storage:
bucketNames:
chunks: momentum-loki-chunks
ruler: momentum-loki-ruler
admin: momentum-loki-admin
type: s3
s3:
endpoint: s3.fr-par.scw.cloud # Exemple Scaleway
region: fr-par
secretAccessKey: "${S3_SECRET_KEY}"
accessKeyId: "${S3_ACCESS_KEY}"
Côté application, on déploie Promtail (un agent léger) sur chaque nœud via un DaemonSet. Il lit /var/log/containers/*.log, attache les labels Kubernetes (pod name, namespace) et envoie tout à Loki.
Partie 3 : Alerting (Dormir tranquille)
Avoir des graphiques, c'est joli. Être réveillé quand ça brûle, c'est mieux. Prometheus utilise AlertManager.
Nous avons défini des règles critiques. Si un nœud est sous pression ou qu'un Pod redémarre en boucle, on veut le savoir immédiatement.
Exemple de PrometheusRule :
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: momentum-critical-alerts
namespace: monitoring
labels:
release: monitoring
spec:
groups:
- name: kubernetes-apps
rules:
- alert: PodCrashLooping
expr: rate(kube_pod_container_status_restarts_total[15m]) * 60 * 5 > 0
for: 5m
labels:
severity: critical
annotations:
summary: "Pod {{ $labels.namespace }}/{{ $labels.pod }} is crash looping."
- alert: HighNodeCPU
expr: instance:node_cpu:rate:sum > 0.9
for: 10m
labels:
severity: warning
annotations:
summary: "Node {{ $labels.node }} CPU usage is above 90%"
La Destination : Discord
Pas besoin de PagerDuty (payant). Nous sommes une équipe agile, nous vivons sur Discord. AlertManager peut envoyer les alertes directement via un Webhook Discord.
# alertmanager-config.yaml
global:
resolve_timeout: 5m
route:
receiver: 'discord-notifications'
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: 'discord-notifications'
discord_configs:
- webhook_url: 'https://discord.com/api/webhooks/...'
send_resolved: true
Résultat : Une notification propre dans notre channel #devops-alerts dès qu'un problème survient (et une autre quand il est résolu ✅).
Conclusion : La Maîtrise
Avec cette stack, nous avons :
- Visibilité totale : Metrics système et applicatives.
- Rétention longue : Logs stockés sur S3 pour une bouchée de pain.
- Réactivité : Alertes en temps réel sur Discord.
- Coût : 0€ de licence. Juste un peu de CPU/RAM (optimisé) et du stockage S3.
C'est ça, l'esprit Momentum. On ne loue pas la compétence, on la construit.
Dans le prochain article, on parlera de CI/CD : Comment passer du code sur mon laptop à la production en un git push, sans interruption de service.