Files

107 lines
4.3 KiB
Markdown
Raw Permalink Normal View History

2026-08-13 18:04:48 +00:00
---
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)