À la fin de ce tutoriel, vous prolongerez Prometheus avec Thanos : object storage S3 en
ca-central-1, sidecar (ou receive), Store Gateway, Querier et Compactor — pour interroger des mois de métriques sans exploser le disque local du TSDB.Niveau : Intermédiaire · Temps estimé : 70–90 min · Versions cibles : Kubernetes 1.29+ · Helm 3.x · kube-prometheus-stack / Prometheus Operator · Thanos 0.36+ · AWS CLI v2 · Dernière vérification : 2026-09-11 · Region :
ca-central-1Slug :
wow-prometheus-thanos· Série : WOW Observability / SRE · Mot-clé SEO : Prometheus Thanos rétention← Connexe : Prometheus Grafana Kubernetes Helm · OpenTelemetry stack · Grafana Loki Tempo · Hub : Kubernetes / DevOps
Prérequis
- Cluster Kubernetes lab (kind, k3d, minikube ou EKS jetable) avec
kubectladmin et Helm 3 - Notions Prometheus : scrape, TSDB, ServiceMonitor (lab Helm kube-prometheus-stack)
- Compte AWS lab, profil
lab, région forcéeca-central-1; droits S3 (CreateBucket, Put/Get/List/DeleteObject) - Budget d’alerte AWS activé — object storage + cluster : suppression obligatoire en fin de session
- Aucun secret réel dans Git : placeholders uniquement
export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
aws sts get-caller-identity
kubectl cluster-info
helm version
Vérifiez l’identité lab — jamais un compte de production. Sur un kind mononœud, allégez la rétention locale Prometheus (ex. 6–12 h) : Thanos portera l’historique long.
Ce que nous allons construire
Lab Prometheus + Thanos (ca-central-1)
├── Bucket S3 lab (BPA, encryption, région Canada)
├── Secret object-store (thanos.yaml) hors Git
├── Prometheus Operator + sidecar Thanos
├── Thanos Querier (vue fédérée)
├── Store Gateway (blocks S3)
├── Compactor (downsample + retention)
├── Grafana → datasource Querier
└── Nettoyage : stack → objets S3 → bucket
(Schéma — alt : « Prometheus scrapes localement ; Thanos shippe les blocks vers S3 et Querier unifie le passé ».)
Objectif : garder 15 minutes de scrape « chaud » sur le disque du Pod, et des semaines/mois de métriques dans S3, interrogeables comme une seule Prometheus API.
Étape 1 — Pourquoi Thanos (vs TSDB local seul)
Prometheus stocke des time series sur disque local. C’est excellent pour le court terme (alertes, dashboards live), fragile pour l’historique long : PVC qui grossit, Pod qui ne scale pas horizontalement pour la rétention, perte de données si le volume disparaît.
| Approche | Forces | Limites |
|---|---|---|
| TSDB local seul | Simple, latence basse | Rétention limitée ; HA = federation/complexe |
| Remote write vers autre TSDB | Découplé | Autre stack à opérer |
| Thanos + object storage | Rétention longue cheap (S3), query unifiée, HA naturelle | Plus de composants ; compaction à dimensionner |
Thanos ne remplace pas Prometheus : il complète le cycle de vie des blocks (upload, query, compact, downsample). En 2026, c’est le pattern standard quand kube-prometheus-stack doit sortir du lab « 15 jours max ».
Étape 2 — Bucket S3 lab en ca-central-1
Créez un bucket unique (suffixe aléatoire) dans la région Canada, privé, Block Public Access, chiffrement SSE-S3 :
SUFFIX=$(openssl rand -hex 4)
BUCKET="lab-thanos-metrics-${SUFFIX}"
echo "BUCKET=${BUCKET}"
aws s3api create-bucket
--bucket "$BUCKET"
--region ca-central-1
--create-bucket-configuration LocationConstraint=ca-central-1
aws s3api put-public-access-block --bucket "$BUCKET"
--public-access-block-configuration
BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
aws s3api put-bucket-encryption --bucket "$BUCKET"
--server-side-encryption-configuration
'{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]}'
aws s3api put-bucket-tagging --bucket "$BUCKET"
--tagging 'TagSet=[{Key=Project,Value=lab-thanos},{Key=Env,Value=lab}]'
Optionnel : lifecycle pour expirer les préfixes après N jours côté S3 (défense en profondeur si le Compactor rate).
Étape 3 — Config object-store (Secret Kubernetes)
Fichier local (jamais commit) :
# thanos-objstore.yaml — NE PAS COMMITTER
type: s3
config:
bucket: lab-thanos-metrics-REPLACE
endpoint: s3.ca-central-1.amazonaws.com
region: ca-central-1
access_key: REPLACE_ME
secret_key: REPLACE_ME
signature_version2: false
kubectl create namespace monitoring --dry-run=client -o yaml | kubectl apply -f -
kubectl -n monitoring create secret generic thanos-objstore
--from-file=objstore.yml=./thanos-objstore.yaml
--dry-run=client -o yaml | kubectl apply -f -
En prod EKS, préférez IRSA / Pod Identity et omettez access_key/secret_key (role IAM scoped s3:ListBucket, s3:GetObject, s3:PutObject, s3:DeleteObject sur ce bucket).
Étape 4 — Prometheus Operator + sidecar Thanos
Si kube-prometheus-stack n’est pas encore là, installez-le (values allégées lab). Activez ensuite le thanos sidecar sur le Prometheus CR :
# excerpt values / Prometheus CR
prometheus:
prometheusSpec:
retention: 12h
retentionSize: 8GB
thanos:
objectStorageConfig:
key: objstore.yml
name: thanos-objstore
# resources / storage adaptés au lab
helm repo add prometheus-community https://prometheus-community.github.io/charts
helm repo update
# upgrade --install selon votre release existante ; pinnez une version chart
kubectl -n monitoring get pods -l app.kubernetes.io/name=prometheus
kubectl -n monitoring get secret thanos-objstore
Attendu : conteneur thanos-sidecar à côté de prometheus ; logs sans erreur d’upload ; premiers blocks visibles après le prochain compact local (patience 2–3h en lab, ou forcez une rétention courte pour accélérer les tests).
Vérification S3 :
aws s3 ls "s3://${BUCKET}/" --recursive | head
Étape 5 — Querier, Store Gateway, Compactor
Déployez les composants Thanos (chart bitnami/thanos, chart officiel, ou manifests). Minimal lab :
- Store Gateway — lit les blocks dans S3 (même Secret
objstore.yml) - Querier — fan-out vers sidecar(s) + store ; expose l’API Prometheus compatible
- Compactor — compacte, downsample (5m / 1h), applique la retention globale
Exemple d’idée de flags Compactor (à adapter à votre chart) :
--objstore.config-file=/etc/thanos/objstore.yml
--retention.resolution-raw=30d
--retention.resolution-5m=90d
--retention.resolution-1h=1y
--consistency-delay=30m
kubectl -n monitoring get deploy,sts | grep -i thanos || true
kubectl -n monitoring port-forward svc/thanos-query 9090:9090
# Ouvrir http://127.0.0.1:9090 — Stores : sidecar + store-gateway Ready
Dans Grafana, créez (ou éditez) la datasource Prometheus : URL = service Querier (http://thanos-query.monitoring.svc:9090). Les dashboards Kubernetes existants continuent de fonctionner ; l’historique long apparaît dès que les blocks sont queryables.
Étape 6 — HA, déduplication et notes prod
Plusieurs replicas Prometheus + sidecars : le Querier déduplique via les labels externes (replica, prometheus_replica). Alignez externalLabels pour éviter les doubles séries.
Checklist prod courte :
- Object storage versionné + MFA delete désactivés en lab ; en prod, policies IAM least-privilege + encryption KMS
- Compactor unique (un seul writer) ; Querier/Store en HA
- Alerting reste sur Prometheus « chaud » (low latency) ; queries longues / reporting via Thanos
- Coût S3 : PUT fréquents + LIST ; downsample pour contenir les GET analytiques
- Observez aussi les traces/logs : enchaînez OpenTelemetry et Loki/Tempo pour un trio metrics/logs/traces
Nettoyage (obligatoire)
Ordre : Thanos Deploy/STS → Prometheus/sidecar → Secret → objets S3 → bucket.
# Exemple — adaptez aux noms de release Helm
helm uninstall thanos -n monitoring 2>/dev/null || true
# Ou delete manifests Querier / Store / Compactor
kubectl -n monitoring delete secret thanos-objstore --ignore-not-found
# Vider puis supprimer le bucket lab
aws s3 rm "s3://${BUCKET}" --recursive
aws s3api delete-bucket --bucket "$BUCKET" --region ca-central-1
Sur kind, détruire le cluster ne supprime pas le bucket : vérifiez toujours S3 en ca-central-1.
Coûts du lab
| Ressource | Ordre de grandeur |
|---|---|
| S3 blocks lab (Go) | Cents / mois si petit |
| Requêtes S3 PUT/GET | Surveiller en lab bruyant |
| Nœuds K8s / EKS | Dominante — delete vite un EKS oublié |
| Grafana + Prometheus | Coût compute local au cluster |
Activez une alerte budget ; taguez Project=lab-thanos.
Erreurs fréquentes
| Symptôme | Cause | Correction |
|---|---|---|
| Sidecar upload fail | Creds / région / endpoint | Relire Secret ; ca-central-1 ; clock skew |
| Querier Stores=0 | Service DNS / labels | port-forward ; endpoints sidecar --grpc-address |
| Pas de blocks S3 | Rétention locale trop longue | Baisser retention ; attendre compact |
| Compactor crash loop | Deux compactors | Un seul replica ; lock dans le bucket |
| Doublons Grafana | Pas de dedup labels | externalLabels + querier dedup |
| AccessDenied S3 | IAM trop strict | ListBucket sur bucket ARN + objets /* |
FAQ
Thanos remplace-t-il Prometheus ?
Non. Prometheus scrape et alerte ; Thanos gère rétention longue, query globale et HA storage.
Sidecar ou Receive ?
Sidecar : Prometheus Operator classique, blocks uploadés. Receive (remote write) : agents légers / multi-tenant. Ce lab privilégie le sidecar.
Combien de rétention locale garder ?
Assez pour survivre à une panne S3 courte et pour l’alerting (souvent 6–24 h en lab, 2–15 j en prod selon PVC).
Grafana doit-il pointer vers Prometheus ou Thanos ?
Pour l’historique long : Querier Thanos. Pour debug ultra-local du scrape : Prometheus reste utile.
Pourquoi ca-central-1 ?
Data residency Canada, latence lab alignée sur le reste des tutoriels DevOps Elastic Hayway.
Et Mimir / Cortex ?
Alternatives remote-write natives. Thanos reste le chemin le plus direct depuis un Prometheus Operator existant.
Quiz (3 questions)
1. Quel composant lit les blocks historiques dans S3 ?
– A. Alertmanager uniquement
– B. Store Gateway
– C. node-exporter
2. Pourquoi un seul Compactor ?
– A. Licence
– B. Éviter les races d’écriture / compaction concurrente sur l’object store
– C. Grafana l’impose
3. Où configurer le bucket S3 côté sidecar ?
– A. Dans etcd à la main
– B. Secret objectStorageConfig (objstore.yml) référencé par le Prometheus CR / values
– C. Uniquement dans Grafana
Réponses : 1‑B · 2‑B · 3‑B
Pour aller plus loin
- Durcir le lab : IRSA/Pod Identity, NetworkPolicy egress S3, pin versions chart
- Enchaîner observabilité : OpenTelemetry, Loki Tempo
- SRE : error budgets / SLOs branchés sur des queries Thanos longue durée
- Revenir aux bases scrape : Prometheus + Grafana Helm
Maillage WOW / Observability
| Série | WOW ×50 — Observability & SRE |
| Voisins | wow-opentelemetry-stack · wow-grafana-loki-tempo · wow-sre-error-budgets · wow-incident-io-runbooks |
| Hubs live | Kubernetes · DevOps (menus du site) |
Meta publication (SEO) — Publish GO
- Title SEO : Prometheus + Thanos : rétention longue S3 (lab 2026)
- Meta description (≤ 160) : Prolongez Prometheus avec Thanos : sidecar, Store Gateway, Querier et Compactor sur S3 en ca-central-1. Lab rétention longue et Grafana unifié.
- Image mise en avant :
assets/web/devopelastichayway/cover-wow-prometheus-thanos-1200x630.webp - Cover alt : Thanos stocke les métriques Prometheus sur S3 pour une rétention longue
- Catégorie : DevOps / Observability · Niveau : Intermédiaire
- KW principal : Prometheus Thanos rétention · Secondaires : Thanos S3, Store Gateway, Querier Compactor, kube-prometheus-stack Thanos
- Schema : HowTo + FAQPage + Article
- URL cible : https://devopelastichayway.com/tutoriels/wow-prometheus-thanos/
- Statut : Publish GO — feu vert Maître / Haythem, WP-CLI parent 5463
- Region lab :
ca-central-1
Pour aller plus loin — hubs live
Retour parcours Catalogue Tutoriels — hub de la série et leçons sœurs.