Stack de monitoring HA pour Kubernetes : de Prometheus à Thanos
Sous le capot du cloud #4
Dans les premiers volets de Sous le capot du cloud, nous avons posé les fondations de notre cloud interne :
Kubernetes comme socle d’hébergement.
Une architecture de cluster HA pour tenir nos objectifs de disponibilité.
Un hyperviseur Proxmox pour industrialiser la couche infra.
Une fois cette base en place, une autre question est vite devenue centrale :
Comment voir ce qui se passe réellement dans nos clusters, sur la durée, sans exploser les ressources ni perdre l’équipe dans la complexité ?
Comme beaucoup, nous avons commencé “simple” : un Prometheus et un Loki dans le cluster, quelques dashboards Grafana, et l’impression rassurante d’avoir “de l’observabilité”. La réalité nous a vite rattrapés : 20 GiB de RAM pour Prometheus, 20 GiB pour Loki, une rétention de 30 jours à peine tenable, aucun point central pour plusieurs clusters, et un monitoring qui devenait lui-même un risque.
Dans cet article, on raconte comment nous sommes passés :
d’un Prometheus “monolithique” dans un seul cluster,
à une stack de monitoring HA basée sur Prometheus, Loki, Grafana… et surtout Thanos comme point central multi-clusters, avec stockage long terme sur S3.
I. Pourquoi l’observabilité mérite un article à part
Tant que l’on déploie quelques workloads sur un cluster unique, un Prometheus “par défaut” et deux dashboards paraissent suffisants. Mais dans notre cas, le contexte a changé très vite :
Un cluster Kubernetes HA,
Un cloud interne qui héberge plusieurs environnements
Des SLA à tenir et des incidents à expliquer à des clients.
À ce stade, l’observabilité ne se résume plus à “avoir des graphiques” : c’est la capacité à comprendre ce qui se passe, à corréler un incident à un comportement, à prouver un SLA, et à détecter en amont ce qui va casser.
Pour nous, cela voulait dire :
Des métriques fiables (Prometheus),
Des logs exploitables (Loki),
Une visualisation accessible (Grafana),
Et, surtout, une stack capable de tenir dans le temps : montée en charge, ajout de nouveaux clusters, rétention plus longue… sans transformer le monitoring en “monolithe incontrôlable”.
II. Notre premier setup : un Prometheus “simple” dans le cluster
Le schéma classique d’un prometheus server monolithique (provenance de DevOpsCube)Comme beaucoup d’équipes, nous avons commencé avec un schéma très classique :
Un Prometheus déployé dans le même cluster que nos workloads, sur un namespace dédié.
Environ 400 pods monitorés.
Une rétention de 30 jours configurée pour ne pas perdre trop vite l’historique.
Grafana branché sur ce Prometheus pour les dashboards.
Loki déjà présent, également dans le cluster, pour collecter les logs.
Sur le papier, tout était là : des métriques, des logs, des beaux graphs et une stack “standard” supportée par le chart Prometheus Operator.
Et dans les premiers temps, ça faisait le job. Mais à mesure que la plateforme montait en puissance, le setup a montré ses limites.
III. Les limites rencontrées : RAM, rétention et vision globale
Les symptômes sont apparus assez vite, et ils sont parlants.
**Prometheus qui dévore la RAM.**Pour environ 400 pods monitorés, avec 30 jours de rétention, notre Prometheus consommait déjà 20 GiB de RAM. En soi, ce n’est pas choquant pour de gros environnements, mais à notre échelle (et avec la croissance prévue), c’était un signal faible important : si nous continuions sur ce modèle, chaque nouveau cluster ou chaque montée de volumétrie se paierait immédiatement en RAM.
**Loki dans le même cas.**Le Loki in-cluster tournait lui aussi autour de 20 GiB de RAM, pour gérer les logs applicatifs et cluster. Là encore, acceptable au début… mais difficilement tenable dans un modèle où l’on veut : davantage de pods, davantage d’environnements et à terme plusieurs clusters.
**Un seul cluster, une seule vision.**Autre limite structurelle : toute cette observabilité était liée à un seul cluster. Tout allait bien tant que nous n’avions qu’un cluster principal. Mais très vite, notre trajectoire nous a amenés à :
multiplier les clusters Kubernetes,
vouloir corréler des comportements entre eux,
et disposer d’un point central pour tout voir et alerter.
**Un monitoring qui devient lui-même un point de fragilité.**Dernier constat : lorsque Prometheus et Loki se trouvent dans le même cluster que les workloads, on se retrouve avec un paradoxe : si le cluster a un problème sévère, il devient justement plus dur d’accéder aux métriques et aux logs, alors que c’est à ce moment-là qu’on en a le plus besoin.
Bref, notre setup initial nous a permis de démarrer — mais il ne passait pas à l’échelle de notre cloud interne multi-clusters et de nos exigences d’hébergeur.
IV. Passer à une stack dédiée : un cluster de monitoring
À partir du moment où Prometheus et Loki ont commencé à consommer chacun ~20 GiB de RAM pour un seul cluster (~400 pods, 30 jours de rétention), la conclusion était assez évidente :
Si on continue comme ça, le monitoring va devenir plus lourd que ce qu’il observe.
Plutôt que d’optimiser à la marge, nous avons fait un choix structurant : sortir la brique d’observabilité critique dans un cluster Kubernetes dédié au monitoring.
Le cluster de monitoring host Thanos (en haut) qui gères les infos de plusieurs PrometheusAujourd’hui, notre architecture ressemble à ceci :
Nous avons 4 clusters Kubernetes “métiers”.
Dans chaque cluster, un Prometheus local scrute les workloads (metrics kube, nodes, applicatifs).
Dans chaque cluster, un Loki distribué (via Helm) collecte les logs — ce qui permet de bien distinguer les journaux cluster par cluster, tout en restant scalable.
Un cluster de monitoring dédié agrège tout cela, avec Thanos comme brique centrale pour les métriques et Grafana en HA comme couche de visualisation.
Concrètement :
Prometheus reste proche des workloads, ce qui simplifie le scrape et limite les problèmes réseau.
Thanos vient se greffer dessus (sidecar/remote-write) pour récupérer les données et les rendre disponibles dans un plan de contrôle metrics global.
Les blocs Thanos sont stockés sur un bucket S3 compatible, ce qui assure la rétention long terme sans saturer la RAM des Prometheus.
Ce changement a deux effets immédiats :
On arrête de se battre avec la RAM : la charge mémoire de chaque Prometheus reste raisonnable, Thanos et l’object storage prennent le relais pour l’historique.
On gagne un vrai point central : un seul endroit pour interroger les métriques de tous les clusters et croiser les comportements.
Et surtout, le monitoring ne vit plus dans l’ombre du cluster qu’il est censé aider à diagnostiquer : il devient une plateforme à part entière, avec ses propres garanties de disponibilité.
V. Thanos : le point central HA et multi-clusters
Thanos est souvent présenté comme “un Prometheus pour plusieurs Prometheus”. Ce n’est pas totalement faux… mais c’est un peu réducteur.
Dans notre cas, Thanos joue trois rôles clés :
Vue globale multi-clusters
Chaque Prometheus expose ses données à un sidecar Thanos.
Les composants Thanos (en particulier le Querier et le Store Gateway) permettent de requêter l’ensemble des clusters comme si c’était une seule source.
Grafana se branche sur cette couche, ce qui donne une vision unifiée des métriques, avec possibilité de filtrer par cluster, environnement, application…
2. Rétention long terme
Thanos archive les séries temporelles en blocs dans un object storage S3.
Cela permet de conserver des données sur des périodes beaucoup plus longues qu’un simple Prometheus in-cluster, sans exploser la RAM ni le stockage local.
Schéma qui résume chaque composants de Thanos (issue de la doc AWS)3. Haute disponibilité de la couche métriques
Avec plusieurs Prometheus (un par cluster) et Thanos par-dessus, on tolère la perte d’une instance tant que les sidecars et le stockage restent accessibles.
Le Thanos Querier dé-duplique les séries lorsqu’il y a des Prometheus redondants, ce qui évite les doublons dans les dashboards.
Au final, Prometheus se concentre sur ce qu’il fait de mieux : scraper et stocker localement sur une période raisonnable. Thanos prend le relais pour la vue globale, la rétention, et la robustesse d’ensemble. C’est cette combinaison qui nous donne une stack de metrics à la fois scalable, résiliente et exploitable dans le temps.
VI. Logs, dashboards et alertes
Les métriques ne suffisent pas : dès qu’un incident devient sérieux, tout le monde finit par dire “OK, maintenant montre-moi les logs”.
Côté logs, nous utilisons Loki en mode distribué, un déploiement par cluster. Cela nous permet :
de garder une séparation naturelle des journaux (un Loki par cluster),
de bénéficier d’une architecture conçue pour être horizontale et distribuée, adaptée aux environnements Kubernetes modernes.
À terme, une évolution naturelle sera de centraliser l’ingestion (un point d’entrée commun pour tous les logs), mais aujourd’hui ce découpage par cluster colle bien à notre organisation.
Côté visualisation, Grafana est déployé en HA sur le cluster de monitoring :
Plusieurs réplicas, stockage persistant, backup régulier.
Un câblage direct vers Thanos pour les métriques et vers Loki pour les logs, ce qui nous donne une console unique d’observabilité multi-clusters.
Sur les dashboards, nous adoptons une approche pragmatique :
Dashboards officiels (issus notamment du stack Prometheus / kube-prometheus) pour tout ce qui est santé cluster, nodes, workloads — on ne réinvente pas la roue.
Dashboards custom pour les sujets qui nous concernent directement : visualisation fine des logs (filtrés par app/namespace/cluster), trafic Traefik (routes, codes retour, erreurs 4xx/5xx, latence), vues orientées “hébergeur” (environnements de démo, clusters clients, etc.).
Je vous conseille ce lien si vous souahitez mettre en place des dashboards professionnelle et bien détaillé sans perdre du temps pour monitorer vos cluster Kubernetes: https://grafana.com/orgs/imrtfm
Enfin, toute cette observabilité ne servirait pas à grand-chose sans alerting :
Les Prometheus Rules permettent de détecter automatiquement les dégradations (latence qui monte, erreurs, saturation CPU/RAM/storage…).
Les alertes sont forward vers Alertmanager, qui se charge du routing (bon canal, bonne équipe, bon niveau de criticité).
Pareil que pour les dashboards Grafana, je vous donne ce site vous permettant de récupérer un grand nombre de rules pour des tout types d’exporters: https://samber.github.io/awesome-prometheus-alerts/rules.html
VII. Conclusion & suite
Passer d’un Prometheus “simple” dans un cluster à une stack de monitoring HA basée sur Prometheus + Loki + Grafana + Thanos nous a permis de changer d’échelle :
nous avons une vue centralisée sur 4 clusters (et plus demain),
une rétention long terme des métriques grâce à Thanos et au stockage S3,
des logs distribués mais lisibles,
des dashboards qui parlent autant aux ops qu’aux développeurs,
et une chaîne d’alerting qui détecte les problèmes avant nos utilisateurs.
Comme pour le reste de notre cloud interne, l’objectif n’était pas d’avoir “les bons logos” mais une plateforme observable, qui nous aide à tenir nos engagements d’hébergeur.
Dans la suite de Sous le capot du cloud, nous continuerons à descendre dans les couches :
Stockage avancé : SAN + Longhorn, classes de stockage, snapshots et backups.
Bref, l’observabilité n’est pas un “plus” autour de Kubernetes : c’est ce qui permet de prouver que l’infra fait ce qu’on lui demande. On garde le cap… et on continue d’ouvrir le capot.
Stack de monitoring HA pour Kubernetes : de Prometheus à Thanos was originally published in STEAMULO Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.