4.3 KiB
title, description, published, date, tags, editor, dateCreated
| title | description | published | date | tags | editor | dateCreated |
|---|---|---|---|---|---|---|
| Monitoring | Alloy → Prometheus/Loki | true | 2026-08-13T18:04:42.896Z | markdown | 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 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 mithostNetworkund kollidierte auf Port 9100 mit dem etablierten systemd-Dienstprometheus-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 über10.0.0.2:9100scrapt. Frühere Fassungen dieser Seite führten den DaemonSet als Komponente — das ist überholt.
Dateien (in apps/monitoring/)
namespace.yamlhelm-repos.yaml(prometheus-community, grafana)kube-state-metrics.yamlalloy-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 (Fixb73d887)
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
# 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 · Backlog und Betriebsentscheidungen im management-Repo