<!-- .slide: class="prez-slide-title-page" -->
# PF-2640<br/>Thanos Receiver<!-- .element: style="font-size: 2em" -->

#### 2ème démo Équipe Monitoring du 07/05/2024
---
<!-- .slide: class="prez-slide-just-smaller" -->
# Contenu de la présentation
## (Yves)<!-- .element: class="prez-slide-qui" -->
* Rappel de la présentation du 11/04/2024
* Rappel de l'architecture
* Principe de déploiement d'une zone
* Méthode pour scale-up/scale-down (démo)
* Difficultés de paramétrage à grande échelle
* Thanos-ruler : le stateful et le stateless. Impact sur Thanos-proxy
* Nombreux petits sujets
* Opérations : image sans shell (démo)
* Conclusion
---
<!-- .slide: class="prez-slide-just-smaller" -->
# Rappel de la présentation du 11/04/2024
## (Yves)<!-- .element: class="prez-slide-qui" -->
- exposé du problème amenant à un POC sur Thanos-Receiver
- architecture du POC et description des composants
- description détaillée des Receiver, Distributor, Ruler et Querier "proxy"
- méthode utilisée pour la topologie (et la HA)
- métrologie et dashboard Grafana pour le POC
- principaux tests effectués
- MVP : ce qui est déjà déployé sur la Prod
- reste à faire pour passer en prod (et en MCO)
- argumentaire pour/contre continuer le POC
---
# Rappel de l'architecture
## (Yves)<!-- .element: class="prez-slide-qui" -->
- [Schéma d'architecture](https://confluence.corp.caascad.com/pages/viewpage.action?pageId=32376603#ThanosReceive+Ruler-Sch%C3%A9maglobal)
- Principaux composants :
- Écriture : Receiver/Distributor -> Receiver -> S3
- Lecture : Store Gateway <- Querier *proxy* <- Querier+Grafana
- Rules : Ruler <- Querier dédié puis selon le cas :
- -> blocs sur un PV/PVC -> S3
- -> Alertmanager
- Compaction/Downsampling/Rétention : Compactor
---
# Principe de déploiement d'une zone (1/3)
## (Nolwenn)<!-- .element: class="prez-slide-qui" -->

---
# Principe de déploiement d'une zone (2/3)
## (Nolwenn)<!-- .element: class="prez-slide-qui" -->
- chart umbrella qui a pour dépendance [la chart Bitnami](https://github.com/bitnami/charts/tree/main/bitnami/thanos)
- cette chart est repackagée par nous pour supprimer une dépendance inutile à Minio
- la méthode de "repackaging" est documentée dans [l'étude](https://confluence.corp.caascad.com/pages/viewpage.action?pageId=32376603#ThanosReceive+Ruler-ChartThanos-v3etchartBitnami) (mais pas dans la doc opérationnelle *docs-internal*)
- déploiement de deux releases de cette chart :
- thanos-monitoring : pour tous les composants Thanos dont le Querier servant au Ruler
- thanos-monitoring-querier-proxy : pour le Thanos Querier Proxy servant au Grafana
- commandes de déploiement habituelles : `helm diff upgrade ...` et `helm upgrade --install ...`
---
<!-- .slide: class="prez-slide-deploiement-3" -->
# Principe de déploiement d'une zone (3/3)
## (Nolwenn)<!-- .element: class="prez-slide-qui" -->
- | Zones | avec Prometheus Central | avec Thanos Receive |
|-------|-------------------------|---------------------|
| nom | svc-monitoring-stack-central-corp-prd-replica-1,<br/>svc-monitoring-stack-central-corp-prd-replica-2 | svc-monitoring-stack-corp-prd-1,<br/>svc-monitoring-stack-corp-prd-2 |
| `svc_hint` | mon1, mon2 | mon3, mon4 |
| subtype | monitoring-stack | monitoring-stack-corp |
| namespace | monitoring-stack-obs-corp-prd | monitoring-stack-corp-obs-corp-prd |
- nouvelles zones dans [ngot-zones](https://git.corp.caascad.com/caascad/terraform/envs-ng/-/tree/master/zones/ngot_zones)
- liste des configurations pour le nouveau subtype dans [envs.cue](https://git.corp.caascad.com/caascad/terraform/envs-ng/-/blob/master/contexts/ngot/envs.cue)
- exemple de configurations modifiées : [alertmanager.cue](https://git.corp.caascad.com/caascad/terraform/envs-ng/-/blob/master/contexts/ngot/alertmanager.cue) et [fe_buckets_ngot](https://git.corp.caascad.com/caascad/terraform/envs-ng/-/blob/master/contexts/ngot/fe_buckets_ngot.cue)
---
# Méthode pour scale-up/scale-down
## (Nolwenn)<!-- .element: class="prez-slide-qui" -->
- Opérations :
- on modifie `replicaCount` dans les [values de la chart thanos-v3](https://git.corp.caascad.com/caascad/applications/caascad-thanos/-/tree/main/helm/thanos-v3)
- `./generate_creds_values.sh ...`
- `helm diff upgrade ...`
- `kubectl scale statefulset -n monitoring-stack-corp-obs-corp-stg thanos-receive --replicas=0`
- `helm upgrade ...`
- Notes :
- en production, il faut aussi redémarrer tous les Prometheus cluster (sapin de noël)
- si scale-down, il faut supprimer le PVC/PV associé à l'ancien réplica
---
<!-- .slide: class="prez-slide-grande-echelle" -->
# Difficultés de paramétrage à grande échelle
## (Yves)<!-- .element: class="prez-slide-qui" -->
- C'est une équation à plusieurs inconnues :
- quel flavor de noeud choisir ?
- combien de replicas de Receivers poser sur un noeud ?
- combien de Distributors déploie-t-on ?
- les ingress-controllers supportent-ils bien la charge ? Faut-il en ajouter ?
- quelles R/L définir ? Pour les Distributors ? Pour les Receivers ?
- quelle volumétrie PV/PVC choisir ?
- quand on atteind la limite, sont-ce les R/L qui sont trop petites ou faut-ils d'autres réplicas ?
- Avec des éléments perturbateurs :
- un simple scale-up est long et pose problème aux Prometheus sources
- un scale-down à 0 suivi d'un redéploiement est curieusement plus efficace
- quasi chaque modification (sur un pod Distributor ou Receiver) crée un incident "sapin de Noël"
- le rythme de croisière n'est atteint qu'au bout de 2 jours environ. La plupart des tests ont dû être observés pendant 48h avant d'en tirer des conclusions
- à petite échelle (staging) les résultats sont un peu différents d'à grande échelle (prod)
---
<!-- .slide: class="prez-slide-ruler" -->
# Thanos-ruler : le stateful et le stateless<br/>Impact sur Thanos-proxy
## (Nolwenn)<!-- .element: class="prez-slide-qui" -->
Ce qu'il faut savoir :
- on déploie en Stateful (parce qu'on ne pouvait pas le faire en Stateless lors du démarrage de l'étude) ;
- le Stateless est plus fiable (pas de PV/PVC) ;
- simplifie la configuration des Queriers _proxy_ ;
- permet la HA ;
- en pratique, on n'a pas de recording rules, le PV/PVC semble inutile.
Que faire ?
- actuellement, cela fonctionne ;
- ce serait mieux en Stateless.
Est-ce un détail ou devrions-nous envisager de redéployer en Stateless ?
---
<!-- .slide: class="prez-slide-pas-parle-de" -->
# Nombreux petits sujets
## (Nolwenn)<!-- .element: class="prez-slide-qui" -->
- l'option `partial_response_strategy` dans les PrometheusRules
- l'option`--tsdb.too-far-in-future.time-window` dans Thanos Receive pour refuser les métriques dans le futur
- nos choix de labels de déduplication et le semi-problème d'override des labels sur les prometheus centraux
- le replication factor pour dupliquer les métriques
- le [Thanos Receiver Controller](https://github.com/observatorium/thanos-receive-controller)
- l'algorithme "ketama" vs "hashmod" : celui par défaut est fortement déconseillé
- le multi-tenant avec Thanos
- l'UI dans Thanos-Store et les nombreux "streams"
- l'UI dans Thanos-Query et les nombreux composants auxquels il est connecté
---
<!-- .slide: class="prez-slide-just-smaller" -->
# Opérations : image sans shell
## (Yves)<!-- .element: class="prez-slide-qui" -->
- problème : les images Thanos bitnami n'ont pas de shell, cela peut-être un frein lors du debug ou lors d'une modification à faire sur un disque
- solution : utiliser les Ephemeral Containers
- documentation : [KB/Kubernetes/Déboguer avec les Ephemeral Containers](https://docs-internal.corp.caascad.com/KB/Kubernetes/debug_with_ephemeralContainers/)
- exemple avec un pod receive :
```
IMAGE=alpine:latest
NAMESPACE=monitoring-stack-corp-obs-corp-stg
POD=thanos-receive-0
TARGETCONTAINER=receive
kubectl -n "${NAMESPACE}" debug \
-it \
--image="${IMAGE}" \
--profile=general \
--target="${TARGETCONTAINER}" \
"${POD}" -- sh
```
- note : il existe une autre méthode basée sur un plugin de `kubectl` que nous n'avons pas documentée.
---
<!-- .slide: class="prez-slide-conclusion" -->
# Conclusion
## (Yves)<!-- .element: class="prez-slide-qui" -->
- Plus de 3 mois sur PF-2640 Thanos-Receiver
- Nous avons subi...
- Certains problèmes viennent de la source Prometheus (erreurs 409, out_of_order_samples...)
- Il a fallu upgrader Prometheus-Operator/Prometheus pour... `sample_age_limit` qui n'a pas tenu ses promesses
- Thanos Receiver/Ruler/Distributor est une solution très récente : il faut des charts Helm, Prometheus-Operator et Thanos très à jour.
- Thanos vs Prometheus : Prometheus n'a pas été conçu pour fonctionner à grande échelle mais il s'en sort très bien... Que faire ?
- Le paramétrage de Thanos à grande échelle est long et très difficile.
- Nous avons appris...
- Thanos est un bel outil qui va nous rassurer face à la montée en charge
- L'architecture de Thanos est bien conçue et celle de Mimir va lui ressembler (sauf le Compactor)
- Le dashboard conçu pour le POC a énormément servi à voir même ce qu'on n'avait pas prévu de voir.
- Le protocole Remote-Write évolue (une version 2.0 en préparation...)
- L'univers Bitnami a ses charmes (images sans shell, charts imbriquées à repackager...). Nous savons connecter un Ephemeral Container à un pod existant.
- Si on va un jour au Pérou, envisager une visite de la "montagne Arc-En-Ciel" !
- Merci à tous !
- La suite : [PF-2932](https://jira.corp.caascad.com/browse/PF-2932) et sa suite de PF !
---

<style type="text/css">
p {
font-size: 0.8em;
}
.reveal ul li {
font-size: 0.8em;
}
.reveal ul ul li {
font-size: 0.6em;
}
.reveal ol li {
font-size: 0.8em;
}
.reveal section {
text-align: left;
}
}
.reveal h3 {
color: orange;
text-align: center;
border-bottom: 1px solid orange;
font-size: 1em;
}
.reveal h1 {
color: orange;
text-align: center;
border-bottom: 1px solid orange;
margin-bottom: 0.4em;
font-size: 1.2em;
}
.reveal code {
color: aquamarine;
font-size: smaller;
}
.prez-slide-title-page div {
text-align: center;
}
.prez-slide-ruler {
font-size: smaller;
}
.prez-slide-deploiement-3 table {
margin: 0;
}
.prez-slide-deploiement-3 tr th {
font-size: 0.7em;
border: 1px solid white;
}
.prez-slide-deploiement-3 tr td {
font-size: 0.5em;
border: 1px solid white;
}
.prez-slide-deploiement-3 tr {
border: 1px solid white;
}
.prez-slide-pas-parle-de ul li {
font-size: 0.6em;
}
.prez-slide-grande-echelle h1 {
font-size: smaller;
}
.prez-slide-grande-echelle ul li {
font-size: 0.7em;
}
.prez-slide-conclusion ul li {
font-size: 0.6em;
}
.prez-slide-just-smaller ul li {
font-size: 0.7em;
}
h2.prez-slide-qui {
margin: 0;
font-size: .2em;
text-align: right;
color: white;
}
</style>