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.ymlErreur 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 #
# 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 | tail3. 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 == 0Bonne 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.
