design: gate 1 for the k3s patch, and it is a patch

I filed the fifteen criticals in k3s's bundled components as accepted, reasoning
that only a k3s upgrade could move them and that this was its own undertaking.
Then I repeated that in conversation as 'the biggest lever, a big project'
without ever checking which k3s release ships which components. It is v1.34.6 to
v1.34.10 — a patch on the minor we already run.

That patch carries traefik 3.7.8, coredns v1.14.6, metrics-server v0.9.0,
local-path v0.0.36 and helm-controller v0.16.26. Measured against what runs now:
278 high findings become 60, and all fifteen criticals go away, without touching
a single version line in our own manifests.

The risk is not k3s. It is that the same patch moves traefik's chart across a
major, and that a single node with a sqlite datastore means restarting k3s takes
the platform down with it. Both are named as decisions for sorb rather than
assumptions of mine.
This commit is contained in:
Thore Cimbal
2026-08-21 12:00:00 +00:00
parent 7523660f48
commit bf2d87ad40
3 changed files with 173 additions and 2 deletions
+4 -2
View File
@@ -84,9 +84,11 @@ Bedeutung der Meilensteine: siehe [roadmap.md](roadmap.md).
| [0072](docs/issues/0072-gitops-34-dsgvo-datenschutz-compliance-konkretisieren.md) | low | open | DSGVO/Datenschutz-Compliance konkretisieren |
## Active design docs (0)
## Active design docs (1)
_none active_
| Design | Gate | Title |
|---|---|---|
| [2026-08-22-k3s-patch-1-34-10](docs/design/2026-08-22-k3s-patch-1-34-10.md) | gate-1 | Design: k3s v1.34.6 → v1.34.10 — die mitgelieferten Komponenten nachziehen |
## ADRs (27)
+121
View File
@@ -0,0 +1,121 @@
---
type: design
status: gate-1
date: 2026-08-22
size: L
related:
- "docs/issues/0051-cve-remediation-pass.md"
- "docs/wiki/admin/cve-durchgang.md"
- "docs/aar/2026-08-21-mas-haproxy-netzregel.md"
---
# Design: k3s v1.34.6 → v1.34.10 — die mitgelieferten Komponenten nachziehen
## Gate 1 — Product
### Problem
Nach dem CRITICAL-Durchgang (#0051) stehen **4262 Befunde** im Bestand: 102
CRITICAL (alle entschieden), **1578 HIGH**, 1589 MEDIUM, 849 LOW, 144 UNKNOWN.
Der größte zusammenhängende Posten der HIGH sind die **sechs Komponenten, die
k3s mitbringt** — Traefik, CoreDNS, metrics-server, local-path-provisioner,
klipper-lb und klipper-helm. Sie tragen zusammen **278 HIGH und 15 CRITICAL**.
⚠️ **Und hier steht die Korrektur einer eigenen Aussage von vor einer Stunde.**
Diese 15 CRITICAL sind in `entscheidungen.json` als *hingenommen* vermerkt, mit
der Begründung: *„Eine neuere Fassung gibt es nur mit einem k3s-Upgrade —
eigenes Vorhaben mit eigener Rückfallebene."* Ich habe daraus im Gespräch „der
größte Hebel, ein großes Vorhaben" gemacht, **ohne nachzusehen, welche
k3s-Fassung was mitbringt.** Nachgemessen:
| Komponente | läuft | in **v1.34.10+k3s1** |
|---|---|---|
| Traefik | 3.6.10 | **v3.7.8** |
| CoreDNS | 1.14.2 | **v1.14.6** |
| metrics-server | v0.8.1 | **v0.9.0** |
| local-path-provisioner | v0.0.35 | **v0.0.36** |
| helm-controller (klipper-helm) | v0.9.14 | **v0.16.26** |
**v1.34.10 ist ein Patch auf unserer eigenen Minor-Reihe.** Wir stehen auf
v1.34.6+k3s1; es braucht keinen Kubernetes-Versionssprung, kein 1.35, kein 1.36.
Das Vorhaben ist erheblich kleiner, als ich es beschrieben habe — und der Ertrag
größer als der eines Minor-Sprungs, weil er sofort verfügbar ist.
### Gemessener Ertrag
Jede Zielfassung einzeln gescannt, Serien gezählt (nicht Vorkommen):
| Image | HIGH | CRITICAL |
|---|---|---|
| klipper-helm v0.9.14 → v0.13.3 | 73 → **15** | 4 → **0** |
| traefik 3.6.10 → 3.7.8 | 64 → **15** | 4 → **0** |
| coredns 1.14.2 → 1.14.7 | 50 → **11** | 1 → **0** |
| metrics-server v0.8.1 → v0.9.0 | 40 → **11** | 2 → **0** |
| local-path-provisioner v0.0.35 → v0.0.37 | 39 → **8** | 2 → **0** |
| klipper-lb v0.4.15 → v0.4.17 | 12 → **0** | 2 → **0** |
| **Summe** | **278 → 60** | **15 → 0** |
⚠️ Gescannt wurden die **neuesten** Tags, nicht exakt die von v1.34.10
mitgelieferten (dort z. B. CoreDNS v1.14.6 statt 1.14.7). Die Größenordnung
steht damit; die genaue Zuordnung Fassung → Image gehört in Gate 2 und wird
dort gegen die Release-Notes gepinnt, nicht geschätzt.
### Abnahmekriterien
1. **`kubectl get nodes` meldet v1.34.10+k3s1**, und alle sechs Komponenten
laufen in den Fassungen, die diese Release mitbringt — nachgesehen, nicht
angenommen.
2. **15 CRITICAL und ≥ 200 HIGH** nach der nächsten Scan-Runde, gemessen an
`trivy_vuln_info`. Die sechs `rancher/*`-Einträge in `entscheidungen.json`
werden **entfernt**, nicht umdatiert.
3. **Die Plattform ist danach vollständig oben:** alle 52 Pods `Running`,
Anmeldung über MAS erfolgreich, ein Raum lädt, Föderation weiter geschlossen.
4. ⚠️ **Der Ingress trägt wieder:** `axion1337.chat` und `wiki.axion1337.chat`
antworten von außen mit gültigem Zertifikat. Traefik springt dabei über einen
**Chart-Major** (39 → 40) — das ist der eigentliche Risikoträger, nicht k3s.
5. **Die NetworkPolicies passen noch.** Vor dem Ausrollen wird verglichen,
welche internen Ziele sich verschieben — die Lehre aus dem MAS-Ausfall vom
Vortag, diesmal *vor* dem Sprung.
6. **Der Rückweg ist vor dem Start hergestellt:** eine Kopie des laufenden
k3s-Binaries und ein Abzug von `state.db` (sqlite, Einzelknoten), beides
geprüft vorhanden.
### Nicht-Ziele
- **Kubernetes-Minor-Sprünge.** 1.35 und 1.36 existieren; sie bringen für dieses
Ziel nichts, was 1.34.10 nicht auch bringt, und kosten ein Vielfaches an
Risiko. Später, eigenes Vorhaben.
- **Die verbleibenden 60 HIGH** in den neuen Fassungen. Sie werden gezählt und
entschieden, nicht gejagt.
- **Die übrigen ~1100 HIGH** außerhalb der k3s-Komponenten (Wiki.js 114,
portainer 103, Synapse 84 …). Eigener Zuschnitt.
- **MEDIUM und LOW.** ⚠️ Die 2438 Befunde dort sind **gar nicht einzeln
erfasst** — der Exporter führt sie nur als Zähler. Wer sie bearbeiten will,
braucht zuerst die Daten; das ist eine Änderung am Exporter, kein Update.
- **Die Traefik-Konfiguration.** Wir setzen heute **keine** `HelmChartConfig`;
Traefik läuft mit k3s-Vorgaben. Das bleibt so.
- Das Homelab und `game-operating`.
### ⚠️ Was Gate 1 nicht allein entscheiden kann
1. **Die Ausfallzeit.** Einzelknoten, sqlite-Datastore: Ein Neustart des
k3s-Dienstes nimmt die API **und** die Arbeitslasten mit. Das ist ein
Ausfall der ganzen Plattform von vermutlich einigen Minuten — Matrix,
Authentik, Wiki. Wie lange genau, misst Gate 2; **ob** das zu einer
passenden Uhrzeit passiert, entscheidet sorb.
2. **Der Traefik-Chart-Major.** v1.34.10 hebt den Chart von 39 auf 40. Die
benannte Bruchstelle (`kubernetesIngressNginx``kubernetesIngressNGINX`)
trifft uns nicht — wir betreiben kein ingress-nginx, die einzige
IngressClass ist `traefik`. Ob der Major sonst etwas verschiebt, gehört
gerendert und verglichen, bevor irgendetwas neu startet.
### Ankündigung
k3s bringt sechs Komponenten mit, die niemand einzeln pflegt, und die sind seit
der Installation stehen geblieben. Ein Patch innerhalb unserer eigenen
Kubernetes-Reihe zieht alle sechs auf einmal nach: **15 CRITICAL und rund 220
HIGH verschwinden**, ohne dass eine einzige Fassungszeile in unseren Manifesten
angefasst wird. Der Preis ist ein Neustart der Plattform und ein Chart-Major bei
Traefik — beides plan- und prüfbar, aber nicht nebenbei.
> **STOP — wartet auf Gate-1-Freigabe.**
@@ -0,0 +1,48 @@
---
type: ledger
date: 2026-08-22
size: L
status: open
related:
- "docs/design/2026-08-22-k3s-patch-1-34-10.md"
- "docs/issues/0051-cve-remediation-pass.md"
---
# Ledger: k3s v1.34.6 → v1.34.10
## Gates
| gate | commit | approval | status | note |
|---|---|---|---|---|
| 1 | PENDING | sorb | DONE | Umfang, sechs Abnahmekriterien, zwei offene Entscheidungen (Ausfallzeit, Traefik-Chart-Major); ⚠️ korrigiert die eigene Aussage „grosses Vorhaben" — es ist ein Patch auf der eigenen Minor-Reihe. |
## Slices
| slice | commit | status | note |
|---|---|---|---|
## Ladder
| searched | found | outcome | commit |
|---|---|---|---|
| welche k3s-Fassung ueberhaupt laeuft, bevor ein Upgrade geplant wird | v1.34.6+k3s1, Einzelknoten, sqlite-Datastore, ueber das offizielle Installationsskript aufgesetzt | reused: der laufende Bestand als Ausgangspunkt — die Frage „wie wird hier eigentlich installiert" VOR der Frage „auf welche Fassung" | |
| ob die mitgelieferten Images ueberhaupt neuere Fassungen haben | alle sechs haben welche; die Tag-Listen sind alphabetisch sortiert und taeuschen (1.9.4 steht dort hinter 1.14.2) | reused: eine Sortierung nach Zahlenfolge statt der Voreinstellung — sonst waere der Befund „nichts Neueres" gewesen | |
| welche k3s-Release welche Komponenten mitbringt, statt Tags zu raten | die Release-Notes zu v1.34.10+k3s1 nennen jede Fassung einzeln — Traefik v3.7.8, CoreDNS v1.14.6, metrics-server v0.9.0, local-path v0.0.36, helm-controller v0.16.26 | reused: die Herausgeber-Notizen als Quelle; damit steht fest, dass ein PATCH genuegt und kein Minor-Sprung noetig ist | |
| ob wir k3s' Vorgaben irgendwo ueberschreiben | keine einzige `HelmChartConfig` im Cluster, keine im Repo; einzige IngressClass ist `traefik` | reused: der eigene Bestand als Pruefmassstab — die benannte Bruchstelle des Chart-Majors (ingress-nginx-Provider) trifft uns damit nicht | |
| ob die Gesamtzahl „4000 CVEs" ueberhaupt bearbeitbar ist | 1578 HIGH sind 238 verschiedene Kennungen; 2438 MEDIUM/LOW existieren NUR als Zaehler, ohne CVE, Paket oder Fix-Fassung | reused: nichts — aber der Befund grenzt das Vorhaben ab: MEDIUM ist keine Arbeit, sondern zuerst eine Datenfrage | |
## Notes
⚠️ **Dieser Lauf beginnt wieder mit der Korrektur einer eigenen Aussage.** Ich
hatte die k3s-Komponenten als „eigenes Vorhaben mit eigener Rueckfallebene" in
`entscheidungen.json` abgelegt und im Gespraech daraus „der groesste Hebel, ein
grosses Vorhaben" gemacht — **ohne nachzusehen, welche k3s-Fassung was
mitbringt**. Es ist ein Patch auf der Minor-Reihe, auf der wir ohnehin stehen.
Die Fehlerklasse ist dieselbe wie bei Grafana 13.x zwoelf Stunden zuvor: eine
Entscheidung, die auf einer **ungeprueften Annahme ueber den Aufwand** beruht,
nicht auf einer Messung. Beim ersten Mal war es eine falsch gelesene Zahl, hier
eine gar nicht erst gestellte Frage.
**Kein Issue dahinter** — sorb hat den Posten aus einer Liste gewaehlt. Ob er
einen bekommt, entscheidet sorb; ohne Zustimmung wird keiner angelegt.