From f53c3adb7d122bde5ebc6013ff144c3d708cd58e Mon Sep 17 00:00:00 2001 From: Gabriel Radureau Date: Wed, 29 Jul 2026 01:56:58 +0200 Subject: [PATCH] =?UTF-8?q?fix(redis)=20=E2=80=94=20il=20mourait=20toutes?= =?UTF-8?q?=20les=2090=20s,=20et=20c'est=20le=20.fr=20qui=20tombait?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Symptôme observé : `kadans.arcodange.fr` et `gitea.arcodange.fr` en 403, corps vide, depuis n'importe quel client extérieur — pendant que `arcodange.fr` et `www` répondaient 200. Ça ressemble à un bannissement d'IP. Ça n'en était pas un. La chaîne, remontée de bout en bout : 1. Le sous-chart fige ses sondes à `timeoutSeconds: 1` sur `redis-cli ping` et n'expose aucune valeur pour les surcharger. 2. Sans réservation de ressources, le conteneur est en QoS `BestEffort` : sur un Raspberry Pi chargé, lancer `redis-cli` dépasse la seconde. 3. « Liveness probe failed: command timed out after 1s » 836 fois en 23 jours, 135 redémarrages, SIGTERM après ~90 s de vie à chaque tour. 4. Le plugin crowdsec de Traefik utilise ce Redis comme cache de décisions. Cache injoignable ⇒ `isCrowdsecStreamHealthy:false` ⇒ refus par défaut de tout client absent de `clientTrustedIPs` ⇒ le 403. D'où le motif trompeur : seuls les hôtes portant le middleware crowdsec tombaient, et depuis le LAN (IP de confiance) tout paraissait sain — l'origine répondait 401, son défi d'authentification normal. Trois fausses pistes en sont sorties : Cloudflare, un bannissement crowdsec, une règle de pare-feu. Aucune n'était la bonne, et `cscli decisions list` disait `isBanned:false` du début à la fin. La réservation fait passer le conteneur en `Burstable` et lui garantit sa part. Les limites restent larges : Redis n'est pas ce qui sature ce nœud. ⚠ Ce commit ne corrige PAS la sonde elle-même — elle reste à 1 s, et elle reste inatteignable depuis les valeurs. Si le clignotement revient malgré la réservation, il faudra un patch Kustomize au niveau de l'Application ArgoCD, ou abandonner ce sous-chart. Une vérification en production a été appliquée à chaud (`timeoutSeconds: 5`, `failureThreshold: 6`) pour rétablir l'accès immédiatement, mais `selfHeal: true` la ré-écrasera : elle n'est pas la correction, ce commit l'est. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GdUCA5Uz8QyMwa2P4Pg2hK --- redis/values.yaml | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/redis/values.yaml b/redis/values.yaml index f7a192a..edcb1aa 100644 --- a/redis/values.yaml +++ b/redis/values.yaml @@ -140,13 +140,36 @@ redis: &redis_config runAsUser: 999 # -- Compute resources used by the container. More info [here](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/). - resources: {} - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi + # + # ⚠ CE N'EST PAS DU CONFORT — c'est ce qui empêche Redis de mourir en boucle. + # + # Le sous-chart FIGE ses sondes à `timeoutSeconds: 1` sur `redis-cli ping`, et + # n'expose aucune valeur pour les surcharger. Sur ce matériel (Raspberry Pi), + # un conteneur SANS réservation tombe dans la classe QoS `BestEffort` : il est + # le premier affamé quand le nœud est chargé, et le simple lancement de + # `redis-cli` y dépasse la seconde. + # + # Mesuré le 2026-07-29 sur `redis-0` : « Liveness probe failed: command timed + # out: "redis-cli ping" timed out after 1s » **836 fois en 23 jours**, 135 + # redémarrages, le conteneur tué par SIGTERM après ~90 s de vie à chaque tour. + # + # ⚠ CE QUE ÇA CASSAIT, ET QUI N'AVAIT RIEN À VOIR AVEC REDIS EN APPARENCE : le + # plugin crowdsec de Traefik utilise ce Redis comme cache de décisions. Cache + # injoignable ⇒ `isCrowdsecStreamHealthy:false` ⇒ le plugin REFUSE PAR DÉFAUT + # tout client non listé dans `clientTrustedIPs` ⇒ **403, corps vide, sur + # `kadans.arcodange.fr` et `gitea.arcodange.fr`**, pendant que les hôtes qui ne + # portent pas ce middleware répondaient normalement. Le symptôme ne nomme ni + # Redis, ni crowdsec, ni la sonde — il ressemble à un bannissement d'IP, et + # c'est par là qu'on cherche d'abord. + # + # Une réservation fait passer le conteneur en `Burstable` et lui garantit sa + # part. Les limites restent larges : Redis n'est pas ce qui sature ce nœud. + resources: + requests: + cpu: 50m + memory: 64Mi + limits: + memory: 256Mi # -- Pod-level affinity. More info [here](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling). affinity: {} -- 2.54.0