From b9626d878ba538806931acf75a0eb9ed21e08ad8 Mon Sep 17 00:00:00 2001 From: Gabriel Radureau Date: Fri, 24 Jul 2026 00:12:37 +0200 Subject: [PATCH] =?UTF-8?q?feat(alerting):=20groupe=20homelab=20=E2=80=94?= =?UTF-8?q?=20alert=C3=A9=20quand=20(ou=20juste=20avant=20que)=20le=20lab?= =?UTF-8?q?=20tombe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Incident 2026-07-23 : un build CI sans limites a épuisé la RAM de pi1 (0 swap), load15 >100, traefik + apiserver affamés → tout *.arcodange.lab injoignable, Gitea compris (pourtant sain sur pi2). Personne n'est prévenu : on subit. Quatre règles, livrées par la chaîne Telegram déjà en place (testée live) : - NoeudInjoignable (critical) : node-exporter muet 3 min — nœud down ou noyé. - IngressLabIndisponible (critical) : 0 replica traefik dispo, ou métrique absente (kube-state-metrics vit sur pi1) — *.arcodange.lab est HS. - NoeudPressionMemoire (warning) : <500 Mo dispo 5 min — le précurseur exact de l'incident, déclenche avant le thrash. - NoeudEnSurcharge (warning) : load15 >8 pendant 10 min. Exprs validées contre le Prometheus live (parse + match) : pendant la rédaction, IngressLabIndisponible et NoeudEnSurcharge matchaient l'incident en cours. Prometheus (pi3) et Alertmanager (pi2) survivent à la perte de pi1. Co-Authored-By: Claude Fable 5 --- prometheus/values.yaml | 51 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/prometheus/values.yaml b/prometheus/values.yaml index 4586ce4..876826d 100644 --- a/prometheus/values.yaml +++ b/prometheus/values.yaml @@ -1185,6 +1185,57 @@ prometheus: &prometheus_config annotations: summary: "Prospection — brief produit mais non poussé sur Telegram" description: "La vidéo du brief a été rendue mais l'envoi Telegram a échoué (token/chat_id/API). Voir les logs du CronJob prospection." + # Santé du socle : être prévenu quand (ou juste avant que) le homelab tombe. + # Incident 2026-07-23 : build CI sans limites sur pi1 → RAM épuisée (0 swap), + # load15 >100, traefik + apiserver k3s affamés → tout *.arcodange.lab injoignable + # (Gitea compris, pourtant sain sur pi2). Prometheus vit sur pi3 et Alertmanager + # sur pi2 : cette chaîne d'alerte survit donc à la perte de pi1. + - name: homelab + rules: + - alert: NoeudInjoignable + # node-exporter ne répond plus : nœud éteint, réseau HS, ou surcharge telle + # que plus rien n'y répond (le cas de l'incident). + expr: up{job="kubernetes-service-endpoints", app_kubernetes_io_name="prometheus-node-exporter"} == 0 + for: 3m + labels: + severity: critical + app: homelab + annotations: + summary: "Homelab — {{ $labels.node }} est injoignable" + description: "node-exporter de {{ $labels.node }} ({{ $labels.instance }}) ne répond plus depuis 3 min : nœud down ou en surcharge sévère." + - alert: IngressLabIndisponible + # Plus aucun replica traefik dispo — ou kube-state-metrics muet (il vit sur + # pi1 : quand pi1 tombe, la métrique disparaît au lieu de passer à 0). + expr: >- + kube_deployment_status_replicas_available{namespace="kube-system",deployment="traefik"} < 1 + or absent(kube_deployment_status_replicas_available{namespace="kube-system",deployment="traefik"}) + for: 3m + labels: + severity: critical + app: homelab + annotations: + summary: "Homelab — ingress traefik indisponible : *.arcodange.lab est HS" + description: "Aucun replica traefik disponible (ou métrique absente = kube-state-metrics muet). Gitea, ArgoCD, Grafana, Vault… sont injoignables via leurs URLs .lab. Gitea reste accessible en direct : http://192.168.1.202:3000." + - alert: NoeudPressionMemoire + # Précurseur direct de l'incident : <500 Mo dispo sur un Pi 8 Go — sans + # swap, le kernel part en thrash bien avant d'atteindre 0. + expr: node_memory_MemAvailable_bytes < 500 * 1024 * 1024 + for: 5m + labels: + severity: warning + app: homelab + annotations: + summary: "Homelab — mémoire critique sur {{ $labels.node }}" + description: "{{ $labels.node }} n'a plus que {{ $value | humanize1024 }}B de mémoire disponible depuis 5 min : risque imminent de thrash (pas de swap sur les Pis). Suspect n°1 : un job CI trop gourmand." + - alert: NoeudEnSurcharge + expr: node_load15 > 8 + for: 10m + labels: + severity: warning + app: homelab + annotations: + summary: "Homelab — {{ $labels.node }} en surcharge (load15 = {{ $value | humanize }})" + description: "load15 > 8 depuis 10 min sur {{ $labels.node }} (4 cœurs) : quelque chose sature la machine, l'ingress et l'API k3s sont en danger si c'est pi1." # groups: # - name: Instances # rules: -- 2.54.0