diff --git a/betrieb/monitoring.md b/betrieb/monitoring.md new file mode 100644 index 0000000..62e9b4b --- /dev/null +++ b/betrieb/monitoring.md @@ -0,0 +1,106 @@ +--- +title: Monitoring +description: Alloy → Prometheus/Loki +published: true +date: 2026-08-13T18:04:42.896Z +tags: +editor: markdown +dateCreated: 2026-08-13T18:04:42.895Z +--- + +**Status**: ✅ live · **Stand**: 2026-08-02 +**Remote Storage**: `10.0.0.3:9090` (Prometheus), `10.0.0.3:3100` (Loki) — **privates Netz**, nicht die öffentliche IP + +## Überblick + +Alloy (Grafana Agent) sammelt Metriken & Logs vom K3S-Cluster und schickt sie per +Remote-Write zu Prometheus/Loki auf CFGMON (Grafana: `selendis.axion1337.de`). +Der Monitoring-Stack auf CFGMON selbst liegt im Repo +[`threadnet-operating`](https://git.lab/axion1337.chat/threadnet-operating) unter +`monitoring/` — dort leben auch Alertmanager, die Alarmregeln und die CVE-Pipeline. + +## Komponenten + +| Komponente | Ort | Rolle | +|-----------|-----|-------| +| **Alloy** | Cluster | Metrics & Logs Collector, Remote-Write | +| **kube-state-metrics** | Cluster | Kubernetes Object Status | +| **node-exporter (systemd)** | Host `10.0.0.2` | Host-Metriken — **kein DaemonSet**, siehe unten | +| **Prometheus** | CFGMON | Metrics Ingestion + Alarmauswertung | +| **Loki** | CFGMON | Logs Ingestion | +| **Alertmanager + matrix-alerts** | CFGMON | Alarmzustellung nach Matrix | + +> ⚠️ **Der node-exporter als DaemonSet wurde am 2026-08-01 entfernt** (gitops#45, +> Commit `93ee6a3`). Er lief mit `hostNetwork` und kollidierte auf Port 9100 mit dem +> etablierten **systemd-Dienst** `prometheus-node-exporter` — Ergebnis war ein +> CrashLoopBackOff mit über 4.800 Neustarts, der monatelang unbemerkt blieb. +> Host-Metriken kommen unverändert vom systemd-Exporter, den CFGMON direkt über +> `10.0.0.2:9100` scrapt. Frühere Fassungen dieser Seite führten den DaemonSet als +> Komponente — das ist überholt. + +## Dateien (in `apps/monitoring/`) + +- `namespace.yaml` +- `helm-repos.yaml` (prometheus-community, grafana) +- `kube-state-metrics.yaml` +- `alloy-config.yaml` (River config: Scrape-Targets + Remote-Write) +- `alloy.yaml` (HelmRelease) + +## Scrape Targets + +Alloy scrapt: +- **Flux Controllers** (flux-system ns, Port 8080) +- **kube-state-metrics** (monitoring:8080) +- **Synapse** (`matrix.axion1337.chat:9001`) — ⚠️ **Port 9001, nicht 9000**: der falsche + Port lief 98 Tage ins Leere und fiel erst mit dem Alerting auf (Fix `b73d887`) + +Host-Metriken laufen **nicht** über Alloy, sondern werden von CFGMON direkt geholt +(`10.0.0.2:9100`, Job `k3s_host_node`). + +Alles Weitere per Remote-Write nach `10.0.0.3:9090` bzw. `:3100`. + +## Alerting (seit 2026-08-01, gitops#32) + +Alertmanager auf CFGMON wertet die Regeln aus `monitoring/prometheus/alerts.yml` aus und +stellt über einen kleinen Webhook-Empfänger (`matrix-alerts.py`) in Matrix zu: + +| Raum | Zweck | Bot | +|---|---|---| +| `!qavWkXbhLPfGvqtifj` | Betriebsalarme (TargetDown, OOM, Disk, Restarts) | `@alerts` | +| `!YRJvcEbVXtRlUIkNld` | Security: CVE-Meldungen, Upstream-Releases | derselbe Bot | + +Ein Alarm = **eine** Nachricht; bei `resolved` wird dieselbe Nachricht per +`m.replace` durchgestrichen und mit ✅ markiert, statt eine zweite zu senden. +Routing über das Label `room` in der Alarmregel. + +## CVE-Pipeline (gitops#47/#51) + +Auf CFGMON läuft ein 24-Stunden-Scanloop mit **Trivy** über die deployten Images +(`monitoring/cve/images.txt`), ein Exporter stellt die Funde als Metriken bereit +(`trivy_vuln_info{cve,severity,target,host,fixed_version}`, `trivy_vuln_first_seen_timestamp`). +Die Alarme sind bewusst **pro Ziel aggregiert** (`count by (target, target_type, host)`), +nicht pro CVE — die erste Fassung erzeugte 126 Einzelnachrichten und musste +stummgeschaltet werden (ADR-0003). Details stehen im Grafana-Dashboard, die +Matrix-Nachricht verlinkt nur dorthin. + +## Troubleshooting + +```bash +# Alloy-Logs im Cluster +kubectl logs -n monitoring -l app.kubernetes.io/name=alloy + +# Remote-Write angekommen? +curl 'http://10.0.0.3:9090/api/v1/query?query=up' + +# Loki-Test +curl -s 'http://10.0.0.3:3100/loki/api/v1/query_range?query=%7B%7D' | jq . + +# Auf CFGMON: Alarme und Silences +docker compose exec alertmanager amtool alert --alertmanager.url=http://localhost:9093 +docker compose exec alertmanager amtool silence --alertmanager.url=http://localhost:9093 +``` + +--- +**Verwandt**: [Host-Wartungsbenachrichtigungen](/betrieb/host-maintenance-notifications) · +Backlog und Betriebsentscheidungen im +[management-Repo](https://git.lab/axion1337.chat/management)