From bf2d87ad403696265c9a099689a7995c8355dd8b Mon Sep 17 00:00:00 2001 From: Thore Cimbal Date: Fri, 21 Aug 2026 12:00:00 +0000 Subject: [PATCH] design: gate 1 for the k3s patch, and it is a patch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- STATUS.md | 6 +- docs/design/2026-08-22-k3s-patch-1-34-10.md | 121 ++++++++++++++++++++ docs/ledger/2026-08-22-k3s-patch-1-34-10.md | 48 ++++++++ 3 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 docs/design/2026-08-22-k3s-patch-1-34-10.md create mode 100644 docs/ledger/2026-08-22-k3s-patch-1-34-10.md diff --git a/STATUS.md b/STATUS.md index 6b07056..c98b9ee 100644 --- a/STATUS.md +++ b/STATUS.md @@ -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) diff --git a/docs/design/2026-08-22-k3s-patch-1-34-10.md b/docs/design/2026-08-22-k3s-patch-1-34-10.md new file mode 100644 index 0000000..661e79d --- /dev/null +++ b/docs/design/2026-08-22-k3s-patch-1-34-10.md @@ -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.** diff --git a/docs/ledger/2026-08-22-k3s-patch-1-34-10.md b/docs/ledger/2026-08-22-k3s-patch-1-34-10.md new file mode 100644 index 0000000..f0f4868 --- /dev/null +++ b/docs/ledger/2026-08-22-k3s-patch-1-34-10.md @@ -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.