Validate Helm Charts / Detect changed charts (pull_request) Successful in 3s
Validate Helm Charts / Selector match (pull_request) Successful in 9s
Validate Helm Charts / HTTPRoute match (pull_request) Successful in 7s
Validate Helm Charts / YAML scalars (pull_request) Successful in 8s
Validate Helm Charts / NetworkPolicy (pull_request) Successful in 16s
Validate Helm Charts / Build apache-tika (pull_request) Successful in 4s
Validate Helm Charts / Trivy config apache-tika (pull_request) Successful in 10s
Validate Helm Charts / Build bentopdf (pull_request) Successful in 4s
Validate Helm Charts / Build bulwark (pull_request) Successful in 4s
Validate Helm Charts / Build garage (pull_request) Successful in 4s
Validate Helm Charts / Build matrix-synapse (pull_request) Successful in 4s
Validate Helm Charts / Resource quantities (pull_request) Successful in 9s
Validate Helm Charts / Bump level (pull_request) Successful in 3s
Validate Helm Charts / Build calibre-web-automated (pull_request) Successful in 4s
Validate Helm Charts / Build cyberchef (pull_request) Successful in 4s
Validate Helm Charts / Build freesailarr (pull_request) Successful in 5s
Validate Helm Charts / Build gotenberg (pull_request) Successful in 4s
Validate Helm Charts / Build homeassistant (pull_request) Successful in 4s
Validate Helm Charts / Build keycloak (pull_request) Successful in 4s
Validate Helm Charts / Build outline (pull_request) Successful in 4s
Validate Helm Charts / Build rallly (pull_request) Successful in 4s
Validate Helm Charts / Build samba (pull_request) Successful in 4s
Validate Helm Charts / Build satisfactory (pull_request) Successful in 5s
Validate Helm Charts / Build stalwart (pull_request) Successful in 5s
Validate Helm Charts / Build minecraft-router (pull_request) Successful in 4s
Validate Helm Charts / Build minecraft-server (pull_request) Successful in 4s
Validate Helm Charts / Build paperless-ngx (pull_request) Successful in 4s
Validate Helm Charts / Build patchmon (pull_request) Successful in 5s
Validate Helm Charts / Build rss-bridge (pull_request) Successful in 5s
Validate Helm Charts / Build searxng (pull_request) Successful in 5s
Validate Helm Charts / Build teamspeak-server (pull_request) Successful in 4s
Validate Helm Charts / Build template-chart (pull_request) Successful in 5s
Validate Helm Charts / Build valkey (pull_request) Successful in 4s
Validate Helm Charts / Build voucher-vault (pull_request) Successful in 5s
Validate Helm Charts / Build ytdlp-web-player (pull_request) Successful in 6s
Validate Helm Charts / Build zipline (pull_request) Successful in 5s
Validate Helm Charts / Build sure (pull_request) Successful in 4s
Validate Helm Charts / Build urlaubsverwaltung (pull_request) Successful in 5s
Validate Helm Charts / Trivy config bentopdf (pull_request) Successful in 12s
Validate Helm Charts / Trivy config gotenberg (pull_request) Successful in 10s
Validate Helm Charts / Trivy config homeassistant (pull_request) Successful in 10s
Validate Helm Charts / Trivy config keycloak (pull_request) Successful in 11s
Install-test / Install-test bentopdf (pull_request) Successful in 51s
Validate Helm Charts / Trivy config bulwark (pull_request) Successful in 10s
Validate Helm Charts / Trivy config calibre-web-automated (pull_request) Successful in 10s
Validate Helm Charts / Trivy config cyberchef (pull_request) Successful in 11s
Validate Helm Charts / Trivy config freesailarr (pull_request) Successful in 17s
Install-test / Install-test apache-tika (pull_request) Successful in 1m5s
Validate Helm Charts / Trivy config garage (pull_request) Successful in 11s
Validate Helm Charts / Trivy config matrix-synapse (pull_request) Successful in 14s
Validate Helm Charts / Trivy config minecraft-router (pull_request) Successful in 11s
Validate Helm Charts / Trivy config minecraft-server (pull_request) Successful in 12s
Validate Helm Charts / Trivy config outline (pull_request) Successful in 11s
Validate Helm Charts / Trivy config paperless-ngx (pull_request) Successful in 11s
Validate Helm Charts / Trivy config patchmon (pull_request) Successful in 17s
Validate Helm Charts / Trivy config satisfactory (pull_request) Successful in 11s
Validate Helm Charts / Trivy config searxng (pull_request) Successful in 14s
Validate Helm Charts / Trivy config stalwart (pull_request) Successful in 20s
Validate Helm Charts / Trivy config sure (pull_request) Successful in 14s
Validate Helm Charts / Trivy config teamspeak-server (pull_request) Successful in 11s
Validate Helm Charts / Trivy config rallly (pull_request) Successful in 15s
Install-test / Install-test bulwark (pull_request) Successful in 1m18s
Validate Helm Charts / Trivy config rss-bridge (pull_request) Successful in 12s
Validate Helm Charts / Trivy config samba (pull_request) Successful in 12s
Install-test / Install-test calibre-web-automated (pull_request) Successful in 1m37s
Validate Helm Charts / Trivy config template-chart (pull_request) Successful in 12s
Validate Helm Charts / Trivy config urlaubsverwaltung (pull_request) Successful in 10s
Validate Helm Charts / Trivy config valkey (pull_request) Successful in 11s
Validate Helm Charts / Trivy config voucher-vault (pull_request) Successful in 13s
Validate Helm Charts / Trivy config ytdlp-web-player (pull_request) Successful in 20s
Install-test / Install-test cyberchef (pull_request) Successful in 1m3s
Validate Helm Charts / Trivy config zipline (pull_request) Successful in 14s
Install-test / Install-test freesailarr (pull_request) Successful in 3m29s
Install-test / Install-test garage (pull_request) Successful in 1m9s
Install-test / Install-test gotenberg (pull_request) Successful in 1m18s
Install-test / Install-test homeassistant (pull_request) Successful in 2m20s
Install-test / Install-test keycloak (pull_request) Successful in 2m22s
Install-test / Install-test matrix-synapse (pull_request) Successful in 1m35s
Install-test / Install-test minecraft-router (pull_request) Successful in 51s
Install-test / Install-test minecraft-server (pull_request) Successful in 1m40s
Install-test / Install-test outline (pull_request) Successful in 2m7s
Install-test / Install-test paperless-ngx (pull_request) Successful in 3m3s
Install-test / Install-test patchmon (pull_request) Successful in 1m9s
Install-test / Install-test searxng (pull_request) Successful in 56s
Install-test / Install-test stalwart (pull_request) Successful in 1m17s
Install-test / Install-test teamspeak-server (pull_request) Successful in 1m8s
Install-test / Install-test valkey (pull_request) Successful in 1m13s
Install-test / Install-test rallly (pull_request) Successful in 1m38s
Install-test / Install-test rss-bridge (pull_request) Successful in 42s
Install-test / Install-test samba (pull_request) Successful in 1m1s
Install-test / Install-test sure (pull_request) Successful in 2m8s
Install-test / Install-test urlaubsverwaltung (pull_request) Successful in 1m20s
Install-test / Install-test voucher-vault (pull_request) Successful in 1m46s
Install-test / Install-test ytdlp-web-player (pull_request) Successful in 51s
Install-test / Install-test zipline (pull_request) Successful in 2m0s
Validate Helm Charts / Install-test (pull_request) Successful in 43m0s
Gitea #143, maintainer's instruction. The HBONE port and the redirected probe source are ISTIO CONSTANTS, not standards, so they move from template literals into values with documented defaults - an operator can then correct them when Istio changes a number, without waiting for a chart release. One object under one "enabled", so the two halves still cannot be set separately; two values could drift apart, which is what this design exists to prevent. Every read is null-safe (#99), so a deleted object or one carrying only "enabled: true" falls back to the defaults declared here rather than dereferencing nil - the defect #136 shipped one value away. Provenance now written on each constant: 15008 is Istio's HBONE port, not IANA-registered for this and unknown to Kubernetes; 169.254.7.127 is link-local (RFC 3927, never routed), its IPv6 counterpart carries the same digits plus 1337, and neither the NetworkPolicy API nor the kubelet knows the address - only Istio's data plane rewrites the probe source onto it. Both read for ztunnel 1.30.6, and a change in either fails silently. The exception in ci/run-networkpolicy-test.sh stays pinned to the numbers that test names, and additionally asserts this chart declares the same defaults - never "whatever the value says", which would let a mistyped port in through a configurable field. No version change: nothing is published yet, the default is still off, and the render at defaults is byte-identical - re-diffed against origin/main. No redirectedProbeSources here, in neither values.yaml nor the schema: this chart offers no networkPolicy.probeSources, so its probe rule is never source-restricted and no ipBlock is ever rendered. The key would reach no rule and read as a control that does nothing, which is worse than one that is absent. ci/run-networkpolicy-test.sh asserts that absence rather than tolerating it.
133 lines
7.2 KiB
YAML
133 lines
7.2 KiB
YAML
{{- /*
|
|
NetworkPolicy for valkey (Gitea #5).
|
|
|
|
THIS CHART AND stalwart ARE THE TWO THAT HAD A POLICY BEFORE #5, so the
|
|
convention was derived from them rather than imposed on them. What changed here
|
|
is the FORM and not a single rule: the reasoning moved out of "#" comments,
|
|
which are part of the rendered object and travel into the cluster, into template
|
|
comments, which render nothing. ci/run-networkpolicy-test.sh now fails on a
|
|
rendered "#", and this file was one of the two that failed it.
|
|
|
|
TWO THINGS THAT DELIBERATELY DID NOT CHANGE, because they are right and the
|
|
convention was written to accommodate them:
|
|
|
|
1. INGRESS ONLY. This instance opens no outbound connection of its own - no
|
|
replication, no cluster bus - so an egress rule here would constrain nothing
|
|
while making the object look stricter than it is. policyTypes names only
|
|
what there is something to restrict. homeassistant and satisfactory invoke
|
|
the same rule in the other direction, for outbound traffic nobody can
|
|
enumerate.
|
|
|
|
2. 6379 IS RESTRICTED BY SOURCE, with no probeSources value anywhere in this
|
|
chart - and that combination is only safe because of a detail worth knowing:
|
|
ALL THREE PROBES HERE ARE EXEC PROBES. An exec probe runs inside the
|
|
container through the kubelet's runtime and puts no packet on the network, so
|
|
there is no kubelet traffic to let through and nothing to accommodate. A
|
|
chart with an httpGet or tcpSocket probe on this port could NOT restrict it
|
|
this way - it would need the worker node's IP, which no chart can know, and
|
|
the pod would never become Ready without it. minecraft-server is tight for
|
|
the same reason; every web app in the sweep is not.
|
|
|
|
So this policy is what the rest of the rollout aims at and mostly cannot reach:
|
|
a port that is genuinely closed to everything but the namespaces named below.
|
|
*/ -}}
|
|
{{- if .Values.networkPolicy.enabled }}
|
|
{{- /* networkPolicy.ingress - the policy's INBOUND side, and not the same
|
|
thing as the top-level .Values.ingress (the Ingress object) - both match
|
|
a search for "ingress". */}}
|
|
{{- $npIngress := .Values.networkPolicy.ingress | default dict }}
|
|
{{- /* NULL-SAFE ON PURPOSE (#99): ambientMesh is an OBJECT, so every read goes
|
|
through a fallback reproducing THIS chart's declared defaults. An
|
|
operator who deletes the object, or writes only "enabled: true", must
|
|
land on the defaults and not in a nil dereference - #136 shipped exactly
|
|
that defect one value away, where the NOTES.txt branch dereferenced
|
|
.networkPolicy.egress directly. */}}
|
|
{{- $ambient := $npIngress.ambientMesh | default dict }}
|
|
{{- $ambientEnabled := $ambient.enabled }}
|
|
{{- $ambientPort := $ambient.port | default 15008 }}
|
|
apiVersion: networking.k8s.io/v1
|
|
kind: NetworkPolicy
|
|
metadata:
|
|
name: {{ .Release.Name }}-{{ .Chart.Name }}-networkpolicy
|
|
labels:
|
|
app: {{ .Release.Name }}-{{ .Chart.Name }}-networkpolicy
|
|
spec:
|
|
podSelector:
|
|
matchLabels:
|
|
app: {{ .Release.Name }}-{{ .Chart.Name }}-sfs
|
|
policyTypes:
|
|
- Ingress
|
|
ingress:
|
|
{{- /*
|
|
One rule with a list of sources. Note the shape: an empty "from" would allow
|
|
EVERYTHING, so the namespaces are always spelled out - the release's own
|
|
namespace first, then whatever networkPolicy.allowedNamespaces adds. An
|
|
empty "from: []" is worse still, because it allows everything while reading
|
|
as a restriction; ci/run-networkpolicy-test.sh rejects that form outright.
|
|
*/}}
|
|
- from:
|
|
- namespaceSelector:
|
|
matchLabels:
|
|
{{- /*
|
|
Set by Kubernetes itself on every namespace (>= 1.21), so this
|
|
needs no labelling work on the target namespaces.
|
|
*/}}
|
|
kubernetes.io/metadata.name: {{ .Release.Namespace }}
|
|
{{- range .Values.networkPolicy.allowedNamespaces }}
|
|
- namespaceSelector:
|
|
matchLabels:
|
|
kubernetes.io/metadata.name: {{ . | quote }}
|
|
{{- end }}
|
|
ports:
|
|
- protocol: TCP
|
|
port: 6379
|
|
{{- if $ambientEnabled }}
|
|
{{- /* networkPolicy.ingress.ambientMesh (Gitea #143). 15008/TCP is ztunnel's
|
|
HBONE tunnel, the port every inbound connection arrives on once the
|
|
namespace carries istio.io/dataplane-mode - ambient "does not and will
|
|
never bypass Kubernetes NetworkPolicy enforcement", so without it a pod
|
|
in the mesh is unreachable.
|
|
|
|
It is the one port here that is NOT a containerPort of the selected pod
|
|
spec: ztunnel terminates it, not the application. ci/run-networkpolicy-
|
|
test.sh holds a NAMED exception for exactly this number, gated on exactly
|
|
this value, and proves on a second render that it stays the only such
|
|
port and that it is absent while the value is false.
|
|
|
|
THE PORT HALF ONLY, and that is not an omission. Elsewhere this switch
|
|
also adds 169.254.7.127/32 as a probe source, because inside the mesh the
|
|
kubelet's probes are redirected away from the worker node's address.
|
|
This chart offers no networkPolicy.probeSources at all, so the rule
|
|
carrying the probe port is never restricted by source - and an
|
|
unrestricted rule needs no probe address. Measured in the render: three
|
|
exec probes, which run inside the container through the kubelet's
|
|
runtime and put no packet on the network at all.
|
|
WHICH RULE IT JOINS:
|
|
the only rule this policy has, the one carrying 6379. That rule is
|
|
ALWAYS restricted to the release's own namespace plus allowedNamespaces,
|
|
so 15008 is restricted with it - and whether ztunnel is reached by those
|
|
peers is the open question of #143. ztunnel runs with its own pod IPs in
|
|
istio-system (measured 2026-10-19: no hostNetwork on the DaemonSet,
|
|
Istio 1.30.6), so if a peer of its own proves necessary it is
|
|
expressible as a namespaceSelector plus podSelector and not as an
|
|
unknowable node CIDR. It cannot be settled before a namespace joins the
|
|
mesh, and none has.
|
|
AN ISTIO CONSTANT, NOT A STANDARD: 15008 is not registered with
|
|
IANA for this, no protocol prescribes it, and Kubernetes knows
|
|
nothing about it - Istio picked it for HBONE and Istio can change
|
|
it. Hence a VALUE with a documented default rather than a literal
|
|
here, so an operator can correct it without a chart release. Read
|
|
for ztunnel 1.30.6. The exception ci/run-networkpolicy-test.sh
|
|
grants is pinned to the number THAT TEST names, plus a check that
|
|
this chart declares the same default - never to whatever the value
|
|
says, because that would let a mistyped port ride in through a
|
|
configurable field (design A of #143).
|
|
|
|
NOT MEASURED: that 15008 alone suffices comes from Istio's
|
|
documentation. Measured on this cluster is only which listeners ztunnel
|
|
opens. Provable at the first namespace to join the mesh; none has. */}}
|
|
- protocol: TCP
|
|
port: {{ int $ambientPort }}
|
|
{{- end }}
|
|
{{- end }}
|