RousselTMLEARNING

Observabilité

Déployer Thanos sur Kubernetes (kube-prometheus-stack, Helm et Operator)

Installer Thanos sur Kubernetes : sidecar via kube-prometheus-stack, secret objstore, Bitnami/kube-thanos, Query, Store, Compactor, ServiceMonitor et ressources.

1. Secret de stockage objet #

Partagé par sidecar, store et compactor.

Création #

cat > objstore.yml <<'EOF'
type: S3
config:
  bucket: thanos-prod
  endpoint: s3.eu-west-3.amazonaws.com
  region: eu-west-3
  access_key: AKIA...
  secret_key: ...
EOF
kubectl create namespace monitoring
kubectl -n monitoring create secret generic thanos-objstore --from-file=objstore.yml
Erreur Courante : Ne versionnez jamais ce fichier : utilisez External Secrets, Sealed Secrets ou des rôles IAM liés au ServiceAccount (IRSA) pour éviter les clés statiques.

2. Sidecar avec kube-prometheus-stack #

Quelques lignes de values.

values.yaml #

Thanos dans Kubernetes
Le sidecar est injecté dans le pod Prometheus par l'Operator.
# values-thanos.yaml
prometheus:
  thanosService:
    enabled: true
  thanosServiceMonitor:
    enabled: true
  prometheusSpec:
    replicas: 2
    replicaExternalLabelName: replica
    externalLabels: { cluster: prod-eu }
    retention: 2d
    disableCompaction: true
    thanos:
      objectStorageConfig:
        existingSecret: { name: thanos-objstore, key: objstore.yml }
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm upgrade --install monitoring prometheus-community/kube-prometheus-stack -n monitoring -f values-thanos.yaml
kubectl -n monitoring get pods -l app.kubernetes.io/name=prometheus
kubectl -n monitoring logs prometheus-monitoring-kube-prometheus-prometheus-0 -c thanos-sidecar | tail

3. Query, Store et Compactor avec Helm #

Chart Bitnami.

values-thanos-components.yaml #

# helm repo add bitnami https://charts.bitnami.com/bitnami
objstoreConfig: |-
  type: S3
  config:
    bucket: thanos-prod
    endpoint: s3.eu-west-3.amazonaws.com
    region: eu-west-3

query:
  enabled: true
  replicaLabel: [replica]
  dnsDiscovery:
    sidecarsService: monitoring-kube-prometheus-thanos-discovery
    sidecarsNamespace: monitoring
queryFrontend: { enabled: true }
storegateway:
  enabled: true
  persistence: { enabled: true, size: 20Gi }
compactor:
  enabled: true
  retentionResolutionRaw: 30d
  retentionResolution5m: 180d
  retentionResolution1h: 2y
  persistence: { enabled: true, size: 50Gi }
helm upgrade --install thanos bitnami/thanos -n monitoring -f values-thanos-components.yaml
kubectl -n monitoring get pods -l app.kubernetes.io/instance=thanos
kubectl -n monitoring port-forward svc/thanos-query-frontend 9090:9090      # http://localhost:9090
kubectl -n monitoring port-forward svc/thanos-query 10902:9090 && curl -s localhost:10902/api/v1/stores | jq '.data | keys'

4. Grafana et vérifications #

Brancher l'ensemble.

Datasource et contrôles #

# Source de données Grafana : type Prometheus, URL du Query Frontend
- name: Thanos
  type: prometheus
  url: http://thanos-query-frontend.monitoring.svc:9090
  jsonData: { timeInterval: 15s, prometheusType: Thanos }
# Les deux réplicas sont-ils vus et dédupliqués ?
count(up{job="kubelet"}) by (cluster)
# Le compactor est-il sain ?
thanos_compact_halted == 0
Bonne Pratique : Fixez des requests/limits mémoire sur le Store Gateway et le Compactor : ils consomment beaucoup lors des gros téléchargements de blocs.

Pour aller plus loin