Verweise der Form #123 im folgenden Text beziehen sich auf die GitHub-Nummerierung, nicht auf die Nummern in diesem Repo. Geschlossene Issues wurden nicht mitgezogen und sind weiterhin nur auf GitHub lesbar.
Kontext
Ausgelagert aus #8 (Security-Hardening der Container), Auslagerung vom Maintainer genehmigt. Kein einziges Chart bringt aktuell eine NetworkPolicy mit — alle Pods dürfen clusterweit frei kommunizieren, sofern der Cluster kein Default-Deny hat.
Ziel
Jedes Chart bekommt eine sinnvolle Default-NetworkPolicy, konfigurierbar über values.yaml:
Ingress: nur vom Ingress-Controller-Namespace (bei Web-Apps) bzw. den tatsächlich benötigten Quellen; bei NodePort-Diensten (samba, teamspeak-server, satisfactory) entsprechend offen für die Service-Ports.
Egress: DNS immer; darüber hinaus nur die tatsächlich benötigten Ziele (z. B. Datenbank/Redis bei paperless, outline, zipline; SMTP bei rallly; OIDC-Provider bei patchmon, rallly, urlaubsverwaltung, voucher-vault).
Referenz-Implementierung im template-chart, dann Rollout pro Chart.
Zu klären vor der Umsetzung
Namespace/Labels des Ingress-Controllers im Ziel-Cluster (für die Ingress-Selektoren).
Ob externe Abhängigkeiten (DBs, OIDC) im Cluster oder außerhalb liegen — beeinflusst Egress-Regeln (namespaceSelector vs. ipBlock/FQDN).
Ob der Cluster CNI-seitig NetworkPolicies überhaupt durchsetzt (k3s: ja, mit kube-router/Cilium je nach Setup).
> Migriert aus [`jk-cluster/helm-charts#20`](https://github.com/jk-cluster/helm-charts/issues/20) — urspruenglich angelegt von **MeepMr** am 2026-08-21.
>
> Verweise der Form `#123` im folgenden Text beziehen sich auf die **GitHub-Nummerierung**, nicht auf die Nummern in diesem Repo. Geschlossene Issues wurden nicht mitgezogen und sind weiterhin nur auf GitHub lesbar.
---
## Kontext
Ausgelagert aus #8 (Security-Hardening der Container), Auslagerung vom Maintainer genehmigt. Kein einziges Chart bringt aktuell eine NetworkPolicy mit — alle Pods dürfen clusterweit frei kommunizieren, sofern der Cluster kein Default-Deny hat.
## Ziel
Jedes Chart bekommt eine sinnvolle Default-NetworkPolicy, konfigurierbar über `values.yaml`:
- **Ingress**: nur vom Ingress-Controller-Namespace (bei Web-Apps) bzw. den tatsächlich benötigten Quellen; bei NodePort-Diensten (samba, teamspeak-server, satisfactory) entsprechend offen für die Service-Ports.
- **Egress**: DNS immer; darüber hinaus nur die tatsächlich benötigten Ziele (z. B. Datenbank/Redis bei paperless, outline, zipline; SMTP bei rallly; OIDC-Provider bei patchmon, rallly, urlaubsverwaltung, voucher-vault).
- Referenz-Implementierung im `template-chart`, dann Rollout pro Chart.
## Zu klären vor der Umsetzung
- Namespace/Labels des Ingress-Controllers im Ziel-Cluster (für die Ingress-Selektoren).
- Ob externe Abhängigkeiten (DBs, OIDC) im Cluster oder außerhalb liegen — beeinflusst Egress-Regeln (namespaceSelector vs. ipBlock/FQDN).
- Ob der Cluster CNI-seitig NetworkPolicies überhaupt durchsetzt (k3s: ja, mit kube-router/Cilium je nach Setup).
Nachgeprüft am 2026-10-04: unverändert offen, mit Zahl
2 von 28 Chart-Verzeichnissen rendern eine NetworkPolicy:
valkey/templates/valkey.networkpolicy.yaml
stalwart/templates/stalwart.networkpolicy.yaml
Alle übrigen 26 haben keine. Bemerkenswert dabei: garage (#81) und keycloak (#83) sind nach diesem Issue entstanden und haben trotzdem keine — bei keycloak ist das besonders sichtbar, weil dort der Management-Port 9000 die Health- und Metrics-Oberfläche unauthentifiziert trägt und allein durch „kein Ingress" geschützt ist, nicht durch eine Policy.
Die Durchsetzung ist bestätigt: die CNI des Clusters setzt NetworkPolicies durch (für stalwart so erhoben und dort als Vorgabe networkPolicy.enabled: true gesetzt). Es fehlt also nicht die Voraussetzung, sondern die Umsetzung in den übrigen Charts.
## Nachgeprüft am 2026-10-04: unverändert offen, mit Zahl
**2 von 28** Chart-Verzeichnissen rendern eine NetworkPolicy:
- `valkey/templates/valkey.networkpolicy.yaml`
- `stalwart/templates/stalwart.networkpolicy.yaml`
Alle übrigen 26 haben keine. Bemerkenswert dabei: `garage` (#81) und `keycloak` (#83) sind nach diesem Issue entstanden und haben trotzdem keine — bei `keycloak` ist das besonders sichtbar, weil dort der Management-Port 9000 die Health- und Metrics-Oberfläche **unauthentifiziert** trägt und allein durch „kein Ingress" geschützt ist, nicht durch eine Policy.
Die Durchsetzung ist bestätigt: die CNI des Clusters setzt NetworkPolicies durch (für `stalwart` so erhoben und dort als Vorgabe `networkPolicy.enabled: true` gesetzt). Es fehlt also nicht die Voraussetzung, sondern die Umsetzung in den übrigen Charts.
Beides in einemfrom-Eintrag ist ein UND. Eine gegen ingress-nginx geschriebene Policy würde still allen Web-Verkehr blockieren. Stichproben, dass der Weg wirklich über Traefik läuft: id.klein.pub → 302 → /realms/klein-family/account/, MTA-STS-Policy → 200.
2. Liegen die Abhängigkeiten im Cluster? Für die Hauptfälle ja: postgres-18, maria-db und keycloak (OIDC) laufen im Cluster, stalwart liefert SMTP. namespaceSelector genügt also; ipBlock braucht nur, was wirklich außerhalb liegt.
3. Setzt die CNI durch? Ja — und sie ist Canal: Flannel fürs Netz, Calico für die Policies, 6/6. Daraus folgt eine harte Grenze: kein FQDN-Egress. Nur podSelector, namespaceSelector, ipBlock. Calicos GlobalNetworkSet-CRD liegt vor, aber es zu benutzen würde die Charts an Calico binden — dasselbe Argument, das implementierungsspezifische Policy-Objekte aus dem Gateway-Sweep (#114) herausgehalten hat.
Kein clusterweites Default-Deny — das schadet nicht: ein von einer Policy selektierter Pod wird für die genannten Richtungen von selbst dicht. Ein Rollout Chart für Chart wirkt also auch ohne.
Entscheidungen des Maintainers
Vorgabe networkPolicy.enabled: true, wie bei stalwart. Also Major je Chart. Die Alternative (aus, pro Release eingeschaltet) wurde mit der Begründung abgelehnt, dass #5 sonst erst erreicht ist, wenn jemand es in jk-cluster-config einschaltet.
Alle Charts in einer Runde, nicht nach Gestalt gruppiert.
Der Preis ist benannt und bewusst: eine falsche Quelle macht einen Dienst stumm oder einen Pod nie Ready, und das erreicht die laufenden Releases beim nächsten Upgrade.
Was das Risiko trägt: der Install-Test setzt Policies durch
Und das ist der Grund, warum „alles auf einmal mit Vorgabe an" vertretbar ist.
k3d cluster create in .github/workflows/install-test.yml:304 und :314 läuft ohne --disable-network-policy und ohne --k3s-arg, der daran rührt — k3s bringt seinen Policy-Controller also mit. Eine Policy, die den Probe-Pfad blockiert, macht den Pod nie Ready und den Install-Test rot, in CI statt in Produktion.
Und die Abdeckung ist fast vollständig: von 30 Chart-Verzeichnissen haben nur satisfactory und template-chart keine Install-Test-Fixture — genau die zwei in ci/excluded-charts.txt. 29 Charts bekommen die Prüfung automatisch.
Das ist zu belegen, nicht anzunehmen: eine absichtlich falsche Policy in eine Fixture, Install-Test muss rot werden, danach zurücknehmen. Hält das nicht, ist das Netz nicht da und der Umfang gehört neu besprochen.
Die beiden Präzedenzfälle sind der Entwurf
valkey und stalwart sind die zwei Charts, die schon eine Policy haben, und sie tragen die teuren Lehren. Sie gehören übernommen, nicht neu erfunden:
policyTypes nur, wo es etwas einzuschränken gibt.valkey liefert bewusst nur Ingress — „an egress rule here would constrain nothing while making the object look stricter than it is".
Ein leeres from erlaubt ALLES. Steht so im valkey-Kommentar; die Namensräume werden deshalb immer ausgeschrieben.
kubernetes.io/metadata.name wird von Kubernetes selbst gesetzt (≥ 1.21) — keine Label-Arbeit an fremden Namensräumen.
Pod-Ports, nicht NodePorts. Eine Policy wirkt an der Pod-Schnittstelle, nachdem kube-proxy übersetzt hat. 30025 trifft nichts, sieht streng aus und blockiert alles.
Egress nach Port, nicht nach Ziel — Policies matchen CIDRs und Selektoren, niemals Hostnamen.
Probes kommen von der IP des Knotens, auf dem der Pod läuft. Fehlt sie, wird der Pod nie Ready — „and a pod that is never Ready reads as a broken application rather than as a policy".
Vier CI-Zusicherungen — der Teil, der den Rollout trägt
Nach dem Vorbild von ci/run-selector-match-test.sh, das diese Gattung Prüfung schon macht und mit #131 um podAffinity erweitert wurde. Alle vier sind render-seitig entscheidbar:
Der podSelector trifft eine Pod-Spezifikation desselben Renders. Sonst ist die Policy ein Objekt ohne Wirkung — oder, schlimmer, sie trifft nach einem Label-Umbau nichts mehr und niemand merkt es.
Jeder Port einer NetworkPolicy kommt als containerPort in der selektierten Pod-Spezifikation vor. Das fängt die NodePort-Falle mechanisch — genau den Fehler, vor dem stalwarts Template in Großbuchstaben warnt.
Keine Ingress-Regel mit fehlendem oder leerem from, wenn policyTypesIngress enthält. Fängt „erlaubt alles" im Gewand von Strenge.
Der Probe-Pfad. Für jeden Port, den eine Liveness-, Readiness- oder Startup-Probe anspricht, muss die Policy ihn entweder nicht nach Quelle einschränken, oder der Chart muss einen Wert wie probeSources anbieten und in NOTES.txt sagen, dass ohne die Knoten-IP der Pod nie Ready wird. Das ist die gefährlichste Falle über 29 Charts und die einzige, die der Install-Test erst nach Minuten zeigt.
Umfang
template-chart: die Referenz-Implementierung, plus values.yaml, values.schema.json, NOTES.txt.
Alle übrigen Charts, Vorgabe an, je Chart ein Major. valkey und stalwart werden auf die Konvention gezogen, wo sie abweichen, ohne ihre begründeten Besonderheiten einzuebnen (Egress nach Port bei stalwart, Ingress-only bei valkey).
Die vier Zusicherungen als neuer Test plus Pipeline-Job.
README.md („Chart style guidelines") und Wiki Chart-Style-Guide, CI-CD, jede berührte Chart-Seite, und Lessons-Learned für die übertragbaren Fallen.
Ein Commit je Chart, mit Zwischenpushes. Bei dieser Größe ist das keine Form, sondern Haltbarkeit.
Was unbeweisbar bleibt
Dass Verkehr nach dem Merge noch fließt, lässt sich für die Produktion nicht zeigen: der Install-Test belegt den Probe-Pfad und die Annahme durch den API-Server, nicht den Weg von Traefik zum Pod — in k3d läuft kein Traefik.
satisfactory hat keine Install-Test-Abdeckung. Für diesen einen Chart gibt es kein Netz außer dem Review.
Egress bleibt grobkörnig. Ohne FQDN kann eine Policy nur Ports begrenzen, nicht Ziele — das ist eine echte Grenze und keine Nachlässigkeit, und sie gehört je Chart hingeschrieben statt stillschweigend in Kauf genommen.
# Genehmigter Plan — und der Rumpf beschreibt einen Cluster, der seit heute nicht mehr existiert
Alles unten gemessen am 14.10.2026 am laufenden Cluster und an `origin/main`.
## Die drei Fragen aus „Zu klären vor der Umsetzung" sind beantwortet
**1. Namespace und Labels des Ingress-Controllers — aber nicht mit der Antwort, die der Rumpf annimmt.**
| | |
| --- | --- |
| ingress-nginx | **weg** — kein DaemonSet, null Pods |
| IngressClass | nur noch **`traefik`** (`traefik.io/ingress-controller`), als Vorgabe; **keine `nginx`-Klasse** |
| Ingress-Objekte im ganzen Cluster | **null** |
| Traefik | `kube-system`, DaemonSet `rke2-traefik`, 6/6, Ports `web=8000`, `websecure=8443` |
Die Quelle für die Ingress-Richtung ist damit:
```yaml
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
app.kubernetes.io/name: rke2-traefik
```
Beides in **einem** `from`-Eintrag ist ein UND. Eine gegen ingress-nginx geschriebene Policy würde still **allen** Web-Verkehr blockieren. Stichproben, dass der Weg wirklich über Traefik läuft: `id.klein.pub` → `302 → /realms/klein-family/account/`, MTA-STS-Policy → 200.
**2. Liegen die Abhängigkeiten im Cluster?** Für die Hauptfälle ja: `postgres-18`, `maria-db` und `keycloak` (OIDC) laufen im Cluster, `stalwart` liefert SMTP. `namespaceSelector` genügt also; `ipBlock` braucht nur, was wirklich außerhalb liegt.
**3. Setzt die CNI durch?** Ja — und sie ist **Canal**: Flannel fürs Netz, **Calico** für die Policies, 6/6. Daraus folgt eine harte Grenze: **kein FQDN-Egress.** Nur `podSelector`, `namespaceSelector`, `ipBlock`. Calicos `GlobalNetworkSet`-CRD liegt vor, aber es zu benutzen würde die Charts an Calico binden — dasselbe Argument, das implementierungsspezifische Policy-Objekte aus dem Gateway-Sweep (#114) herausgehalten hat.
**Kein clusterweites Default-Deny** — das schadet nicht: ein von einer Policy selektierter Pod wird für die genannten Richtungen von selbst dicht. Ein Rollout Chart für Chart wirkt also auch ohne.
## Entscheidungen des Maintainers
**Vorgabe `networkPolicy.enabled: true`**, wie bei `stalwart`. Also **Major je Chart**. Die Alternative (aus, pro Release eingeschaltet) wurde mit der Begründung abgelehnt, dass #5 sonst erst erreicht ist, wenn jemand es in `jk-cluster-config` einschaltet.
**Alle Charts in einer Runde**, nicht nach Gestalt gruppiert.
**Der Preis ist benannt und bewusst:** eine falsche Quelle macht einen Dienst stumm oder einen Pod nie `Ready`, und das erreicht die laufenden Releases beim nächsten Upgrade.
## Was das Risiko trägt: der Install-Test setzt Policies durch
Und das ist der Grund, warum „alles auf einmal mit Vorgabe an" vertretbar ist.
`k3d cluster create` in `.github/workflows/install-test.yml:304` und `:314` läuft **ohne `--disable-network-policy`** und ohne `--k3s-arg`, der daran rührt — k3s bringt seinen Policy-Controller also mit. **Eine Policy, die den Probe-Pfad blockiert, macht den Pod nie `Ready` und den Install-Test rot**, in CI statt in Produktion.
Und die Abdeckung ist fast vollständig: von 30 Chart-Verzeichnissen haben **nur `satisfactory` und `template-chart`** keine Install-Test-Fixture — genau die zwei in `ci/excluded-charts.txt`. **29 Charts bekommen die Prüfung automatisch.**
**Das ist zu belegen, nicht anzunehmen:** eine absichtlich falsche Policy in eine Fixture, Install-Test muss rot werden, danach zurücknehmen. Hält das nicht, ist das Netz nicht da und der Umfang gehört neu besprochen.
## Die beiden Präzedenzfälle sind der Entwurf
`valkey` und `stalwart` sind die zwei Charts, die schon eine Policy haben, und sie tragen die teuren Lehren. Sie gehören übernommen, nicht neu erfunden:
- **`policyTypes` nur, wo es etwas einzuschränken gibt.** `valkey` liefert bewusst nur `Ingress` — *„an egress rule here would constrain nothing while making the object look stricter than it is"*.
- **Ein leeres `from` erlaubt ALLES.** Steht so im `valkey`-Kommentar; die Namensräume werden deshalb immer ausgeschrieben.
- **`kubernetes.io/metadata.name`** wird von Kubernetes selbst gesetzt (≥ 1.21) — **keine Label-Arbeit an fremden Namensräumen**.
- **Pod-Ports, nicht NodePorts.** Eine Policy wirkt an der Pod-Schnittstelle, nachdem kube-proxy übersetzt hat. `30025` trifft nichts, sieht streng aus und blockiert alles.
- **Egress nach Port, nicht nach Ziel** — Policies matchen CIDRs und Selektoren, niemals Hostnamen.
- **Probes kommen von der IP des Knotens**, auf dem der Pod läuft. Fehlt sie, wird der Pod nie `Ready` — *„and a pod that is never Ready reads as a broken application rather than as a policy"*.
## Vier CI-Zusicherungen — der Teil, der den Rollout trägt
Nach dem Vorbild von `ci/run-selector-match-test.sh`, das diese Gattung Prüfung schon macht und mit #131 um `podAffinity` erweitert wurde. Alle vier sind **render-seitig entscheidbar**:
1. **Der `podSelector` trifft eine Pod-Spezifikation desselben Renders.** Sonst ist die Policy ein Objekt ohne Wirkung — oder, schlimmer, sie trifft nach einem Label-Umbau nichts mehr und niemand merkt es.
2. **Jeder Port einer NetworkPolicy kommt als `containerPort` in der selektierten Pod-Spezifikation vor.** Das fängt die NodePort-Falle **mechanisch** — genau den Fehler, vor dem `stalwart`s Template in Großbuchstaben warnt.
3. **Keine Ingress-Regel mit fehlendem oder leerem `from`**, wenn `policyTypes` `Ingress` enthält. Fängt „erlaubt alles" im Gewand von Strenge.
4. **Der Probe-Pfad.** Für jeden Port, den eine Liveness-, Readiness- oder Startup-Probe anspricht, muss die Policy ihn entweder **nicht** nach Quelle einschränken, oder der Chart muss einen Wert wie `probeSources` anbieten **und** in `NOTES.txt` sagen, dass ohne die Knoten-IP der Pod nie `Ready` wird. Das ist die gefährlichste Falle über 29 Charts und die einzige, die der Install-Test erst nach Minuten zeigt.
## Umfang
- `template-chart`: die Referenz-Implementierung, plus `values.yaml`, `values.schema.json`, `NOTES.txt`.
- **Alle übrigen Charts**, Vorgabe an, je Chart ein **Major**. `valkey` und `stalwart` werden auf die Konvention gezogen, wo sie abweichen, **ohne** ihre begründeten Besonderheiten einzuebnen (Egress nach Port bei `stalwart`, Ingress-only bei `valkey`).
- Die vier Zusicherungen als neuer Test plus Pipeline-Job.
- `README.md` („Chart style guidelines") und Wiki `Chart-Style-Guide`, `CI-CD`, jede berührte Chart-Seite, und `Lessons-Learned` für die übertragbaren Fallen.
- **Ein Commit je Chart, mit Zwischenpushes.** Bei dieser Größe ist das keine Form, sondern Haltbarkeit.
## Was unbeweisbar bleibt
- **Dass Verkehr nach dem Merge noch fließt**, lässt sich für die Produktion nicht zeigen: der Install-Test belegt den **Probe-Pfad** und die Annahme durch den API-Server, nicht den Weg von Traefik zum Pod — in k3d läuft kein Traefik.
- **`satisfactory`** hat keine Install-Test-Abdeckung. Für diesen einen Chart gibt es kein Netz außer dem Review.
- **Egress bleibt grobkörnig.** Ohne FQDN kann eine Policy nur Ports begrenzen, nicht Ziele — das ist eine echte Grenze und keine Nachlässigkeit, und sie gehört je Chart hingeschrieben statt stillschweigend in Kauf genommen.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Kontext
Ausgelagert aus #8 (Security-Hardening der Container), Auslagerung vom Maintainer genehmigt. Kein einziges Chart bringt aktuell eine NetworkPolicy mit — alle Pods dürfen clusterweit frei kommunizieren, sofern der Cluster kein Default-Deny hat.
Ziel
Jedes Chart bekommt eine sinnvolle Default-NetworkPolicy, konfigurierbar über
values.yaml:template-chart, dann Rollout pro Chart.Zu klären vor der Umsetzung
Nachgeprüft am 2026-10-04: unverändert offen, mit Zahl
2 von 28 Chart-Verzeichnissen rendern eine NetworkPolicy:
valkey/templates/valkey.networkpolicy.yamlstalwart/templates/stalwart.networkpolicy.yamlAlle übrigen 26 haben keine. Bemerkenswert dabei:
garage(#81) undkeycloak(#83) sind nach diesem Issue entstanden und haben trotzdem keine — beikeycloakist das besonders sichtbar, weil dort der Management-Port 9000 die Health- und Metrics-Oberfläche unauthentifiziert trägt und allein durch „kein Ingress" geschützt ist, nicht durch eine Policy.Die Durchsetzung ist bestätigt: die CNI des Clusters setzt NetworkPolicies durch (für
stalwartso erhoben und dort als VorgabenetworkPolicy.enabled: truegesetzt). Es fehlt also nicht die Voraussetzung, sondern die Umsetzung in den übrigen Charts.Genehmigter Plan — und der Rumpf beschreibt einen Cluster, der seit heute nicht mehr existiert
Alles unten gemessen am 14.10.2026 am laufenden Cluster und an
origin/main.Die drei Fragen aus „Zu klären vor der Umsetzung" sind beantwortet
1. Namespace und Labels des Ingress-Controllers — aber nicht mit der Antwort, die der Rumpf annimmt.
traefik(traefik.io/ingress-controller), als Vorgabe; keinenginx-Klassekube-system, DaemonSetrke2-traefik, 6/6, Portsweb=8000,websecure=8443Die Quelle für die Ingress-Richtung ist damit:
Beides in einem
from-Eintrag ist ein UND. Eine gegen ingress-nginx geschriebene Policy würde still allen Web-Verkehr blockieren. Stichproben, dass der Weg wirklich über Traefik läuft:id.klein.pub→302 → /realms/klein-family/account/, MTA-STS-Policy → 200.2. Liegen die Abhängigkeiten im Cluster? Für die Hauptfälle ja:
postgres-18,maria-dbundkeycloak(OIDC) laufen im Cluster,stalwartliefert SMTP.namespaceSelectorgenügt also;ipBlockbraucht nur, was wirklich außerhalb liegt.3. Setzt die CNI durch? Ja — und sie ist Canal: Flannel fürs Netz, Calico für die Policies, 6/6. Daraus folgt eine harte Grenze: kein FQDN-Egress. Nur
podSelector,namespaceSelector,ipBlock. CalicosGlobalNetworkSet-CRD liegt vor, aber es zu benutzen würde die Charts an Calico binden — dasselbe Argument, das implementierungsspezifische Policy-Objekte aus dem Gateway-Sweep (#114) herausgehalten hat.Kein clusterweites Default-Deny — das schadet nicht: ein von einer Policy selektierter Pod wird für die genannten Richtungen von selbst dicht. Ein Rollout Chart für Chart wirkt also auch ohne.
Entscheidungen des Maintainers
Vorgabe
networkPolicy.enabled: true, wie beistalwart. Also Major je Chart. Die Alternative (aus, pro Release eingeschaltet) wurde mit der Begründung abgelehnt, dass #5 sonst erst erreicht ist, wenn jemand es injk-cluster-configeinschaltet.Alle Charts in einer Runde, nicht nach Gestalt gruppiert.
Der Preis ist benannt und bewusst: eine falsche Quelle macht einen Dienst stumm oder einen Pod nie
Ready, und das erreicht die laufenden Releases beim nächsten Upgrade.Was das Risiko trägt: der Install-Test setzt Policies durch
Und das ist der Grund, warum „alles auf einmal mit Vorgabe an" vertretbar ist.
k3d cluster createin.github/workflows/install-test.yml:304und:314läuft ohne--disable-network-policyund ohne--k3s-arg, der daran rührt — k3s bringt seinen Policy-Controller also mit. Eine Policy, die den Probe-Pfad blockiert, macht den Pod nieReadyund den Install-Test rot, in CI statt in Produktion.Und die Abdeckung ist fast vollständig: von 30 Chart-Verzeichnissen haben nur
satisfactoryundtemplate-chartkeine Install-Test-Fixture — genau die zwei inci/excluded-charts.txt. 29 Charts bekommen die Prüfung automatisch.Das ist zu belegen, nicht anzunehmen: eine absichtlich falsche Policy in eine Fixture, Install-Test muss rot werden, danach zurücknehmen. Hält das nicht, ist das Netz nicht da und der Umfang gehört neu besprochen.
Die beiden Präzedenzfälle sind der Entwurf
valkeyundstalwartsind die zwei Charts, die schon eine Policy haben, und sie tragen die teuren Lehren. Sie gehören übernommen, nicht neu erfunden:policyTypesnur, wo es etwas einzuschränken gibt.valkeyliefert bewusst nurIngress— „an egress rule here would constrain nothing while making the object look stricter than it is".fromerlaubt ALLES. Steht so imvalkey-Kommentar; die Namensräume werden deshalb immer ausgeschrieben.kubernetes.io/metadata.namewird von Kubernetes selbst gesetzt (≥ 1.21) — keine Label-Arbeit an fremden Namensräumen.30025trifft nichts, sieht streng aus und blockiert alles.Ready— „and a pod that is never Ready reads as a broken application rather than as a policy".Vier CI-Zusicherungen — der Teil, der den Rollout trägt
Nach dem Vorbild von
ci/run-selector-match-test.sh, das diese Gattung Prüfung schon macht und mit #131 umpodAffinityerweitert wurde. Alle vier sind render-seitig entscheidbar:podSelectortrifft eine Pod-Spezifikation desselben Renders. Sonst ist die Policy ein Objekt ohne Wirkung — oder, schlimmer, sie trifft nach einem Label-Umbau nichts mehr und niemand merkt es.containerPortin der selektierten Pod-Spezifikation vor. Das fängt die NodePort-Falle mechanisch — genau den Fehler, vor demstalwarts Template in Großbuchstaben warnt.from, wennpolicyTypesIngressenthält. Fängt „erlaubt alles" im Gewand von Strenge.probeSourcesanbieten und inNOTES.txtsagen, dass ohne die Knoten-IP der Pod nieReadywird. Das ist die gefährlichste Falle über 29 Charts und die einzige, die der Install-Test erst nach Minuten zeigt.Umfang
template-chart: die Referenz-Implementierung, plusvalues.yaml,values.schema.json,NOTES.txt.valkeyundstalwartwerden auf die Konvention gezogen, wo sie abweichen, ohne ihre begründeten Besonderheiten einzuebnen (Egress nach Port beistalwart, Ingress-only beivalkey).README.md(„Chart style guidelines") und WikiChart-Style-Guide,CI-CD, jede berührte Chart-Seite, undLessons-Learnedfür die übertragbaren Fallen.Was unbeweisbar bleibt
satisfactoryhat keine Install-Test-Abdeckung. Für diesen einen Chart gibt es kein Netz außer dem Review.