You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix: atenet-egress emptyDir limits and oauth2-proxy registry on 4.x #880
A customer installation cut over to the current 4.x meta chart (4.122.0, kagent chart 1.5.0, Substrate 1.6.2) reports two Kyverno Audit findings the platform should not produce. Neither is already tracked by #866 (the migrate CronJob's /tmp) or #875 (kagent-pg's emptyDirs):
require-emptydir-requests-and-limits on Deployment ate-system/atenet-egress. The drain-signal volume is an emptyDir: {} without sizeLimit, and neither container (agentgateway, ext-proc) sets resources, so it has no ephemeral-storage requests or limits.
restrict-image-registries on Deployment kagent/kagent-oauth2-proxy. The image is quay.io/oauth2-proxy/oauth2-proxy:v7.15.5, the kagent chart's default, not from gsoci.azurecr.io.
Both are Audit on the fleet, so nothing is blocked. But since connectivity 4.10.6 a fresh 4.x installation reported nothing of the platform, so these are regressions.
Proposed solution
The meta chart sets atenet-egress's drain-signalsizeLimit and ephemeral-storage requests and limits on its containers (or the Substrate chart gains the knobs and the meta chart sets them), with the render guard used for the façade.
The meta chart pins kagent's oauth2-proxy to the gsoci.azurecr.io mirror of the same tag.
Acceptance criteria
On a fresh 4.x installation, kubectl get policyreports -n ate-system and -n kagent show no require-emptydir-requests-and-limits or restrict-image-registries failure for these two Deployments.
Fixed by giantswarm/agent-platform#912 (b70de289), released as v4.124.1-rc.2; the Substrate half is giantswarm/substrate#255 (9246909a, released as 1.8.0-rc.4). The egress bound is the chart's own from Substrate 1.8.0 on (atenetEgress.resources, atenetEgress.extProc.resources, atenetEgress.drainSignal.sizeLimit); below that floor the meta chart applies it as one kustomize strategic-merge patch on the substrate HelmRelease, retired at the re-pin. kagent's oauth2-proxy runs gsoci.azurecr.io/giantswarm/oauth2-proxy:v7.15.5, the mirror of the subchart's default at the same digest.
Proof so far (an agent's):
Render, helm template with the chart's defaults: the substrate HelmRelease carries the patch — agentgateway and ext-procrequests.ephemeral-storage: 16Mi, limits.ephemeral-storage: 256Mi, drain-signalemptyDir.sizeLimit: 16Mi; the kagent HelmRelease values oauth2-proxy.image: {registry: gsoci.azurecr.io, repository: giantswarm/oauth2-proxy, tag: v7.15.5}.
The patch through kubectl kustomize on the substrate chart 1.6.2 and 1.7.0 rendered with the forwarded values: both containers bounded, the emptyDir with its sizeLimit, images unchanged. The published 1.8.0-rc.4 renders the bound by itself, and the meta chart pinned to it renders no patch.
make verify-substrate-egress-ephemeral-storage: the substrate chart 1.7.0 (below 1.8.0) fails require-emptydir-requests-and-limits by itself and passes with the HelmRelease's patch merged by name; the three knobs null render no patch. make verify-kagent-oauth2-proxy-image: kagent 1.6.0 bundles oauth2-proxy chart 10.7.1 (appVersion 7.15.5); the pin is its gsoci copy and is published.
Live, a test installation on 4.x with Kyverno, read-only, before the candidate: kubectl get policyreports -n ate-system — Deployment atenet-egress FAIL 1, require-emptydir-requests-and-limits/autogen-check-emptydir-requests-limits … failed at path /resources/limits/; -n kagent — Deployment kagent-oauth2-proxy and its ReplicaSets FAIL 1, restrict-image-registries/autogen-validate-registries … failed at path /spec/template/spec/containers/0/image/.
Acceptance of the roll: the installation follows this chart's release candidates through its GitOps range; once v4.124.1-rc.2 runs there, kubectl get policyreports -n ate-system and -n kagent show no failure for the two Deployments. The result follows in this thread.
Live result, two test installations on 4.x with Kyverno, after v4.124.1-rc.2 rolled there through their GitOps ranges (meta chart, substrate and kagent releases Ready; read-only, an agent's read at 13:14Z):
Deployment ate-system/atenet-egress runs agentgateway and ext-proc with requests.ephemeral-storage: 16Mi, limits.ephemeral-storage: 256Mi and drain-signal as emptyDir: {sizeLimit: 16Mi} (the substrate HelmRelease's postRenderer, Substrate 1.7.0 on both). The reports of the objects created by the roll are clean: Pod atenet-egress-… PASS 20 FAIL 0 and ReplicaSet atenet-egress-… PASS 19 FAIL 0 on both installations. The Deployment-scoped report still carries its pre-roll entry (require-emptydir-requests-and-limits, timestamps 10:14Z and 10:03Z, before the roll) and the ten retired ReplicaSets keep theirs: Kyverno's reports controller rescans in the background (--backgroundScanInterval=1h, two workers), so the Deployment entry refreshes at its next pass. Acceptance of that entry: the next read on these installations shows Deployment atenet-egress FAIL 0.
Deployment kagent/kagent-oauth2-proxy runs gsoci.azurecr.io/giantswarm/oauth2-proxy:v7.15.5; its report is PASS 23 FAIL 0 (PASS 22 FAIL 0 on the second installation), the new Pod's and ReplicaSet's FAIL 0 — restrict-image-registries no longer reports it. Only the retired ReplicaSets' reports keep the old finding until the revision history prunes them.
Last read (an agent's, 12:00Z), the two test installations, after Kyverno's hourly background pass had rescanned the Deployment atenet-egress report (the other policies' entries now stamped 11:39Z and 11:52Z): the require-emptydir-requests-and-limits entry still carries its pre-roll result and timestamp (10:14Z, 10:03Z). The previous comment's acceptance line does not hold as written, and the entry is not a re-evaluated failure: the rule's context lists only emptyDir volumes without a sizeLimit, so a Deployment whose drain-signal carries one yields no result for the rule at all, and Kyverno keeps the entry it had instead of dropping it. Reproduced locally with kyverno apply (CLI 1.19.1) against the live ClusterPolicy: the live Deployment and Pod produce no row, a retired ReplicaSet with the old template reproduces the FAIL.
Live on both installations: drain-signal is emptyDir: {sizeLimit: 16Mi}, agentgateway and ext-proc run with requests.ephemeral-storage: 16Mi and limits.ephemeral-storage: 256Mi; the current Pod's and ReplicaSet's reports are FAIL 0. Deployment kagent/kagent-oauth2-proxy runs gsoci.azurecr.io/giantswarm/oauth2-proxy:v7.15.5, its report FAIL 0 on both.
Standing: every FAIL left for these two workloads is the retained Deployment entry or a retired, zero-replica ReplicaSet; no running object fails. The retained entry is a Kyverno reporting matter (the policy's context and the reports controller's merge), handed to the policies' owners separately; this issue stays closed on the live objects.
Activity
teemow commentedon Oct 9, 2026
Seen again on an installation cut over tonight (written by an agent): the Kyverno audit findings on 4.x this issue covers.
teemow commentedon Oct 10, 2026
Fixed by giantswarm/agent-platform#912 (
b70de289), released asv4.124.1-rc.2; the Substrate half is giantswarm/substrate#255 (9246909a, released as1.8.0-rc.4). The egress bound is the chart's own from Substrate 1.8.0 on (atenetEgress.resources,atenetEgress.extProc.resources,atenetEgress.drainSignal.sizeLimit); below that floor the meta chart applies it as one kustomize strategic-merge patch on thesubstrateHelmRelease, retired at the re-pin. kagent's oauth2-proxy runsgsoci.azurecr.io/giantswarm/oauth2-proxy:v7.15.5, the mirror of the subchart's default at the same digest.Proof so far (an agent's):
helm templatewith the chart's defaults: thesubstrateHelmRelease carries the patch —agentgatewayandext-procrequests.ephemeral-storage: 16Mi,limits.ephemeral-storage: 256Mi,drain-signalemptyDir.sizeLimit: 16Mi; thekagentHelmRelease valuesoauth2-proxy.image: {registry: gsoci.azurecr.io, repository: giantswarm/oauth2-proxy, tag: v7.15.5}.kubectl kustomizeon the substrate chart 1.6.2 and 1.7.0 rendered with the forwarded values: both containers bounded, the emptyDir with itssizeLimit, images unchanged. The published 1.8.0-rc.4 renders the bound by itself, and the meta chart pinned to it renders no patch.make verify-substrate-egress-ephemeral-storage: the substrate chart 1.7.0 (below 1.8.0) failsrequire-emptydir-requests-and-limitsby itself and passes with the HelmRelease's patch merged by name; the three knobs null render no patch.make verify-kagent-oauth2-proxy-image: kagent 1.6.0 bundles oauth2-proxy chart 10.7.1 (appVersion 7.15.5); the pin is its gsoci copy and is published.kubectl get policyreports -n ate-system—Deployment atenet-egressFAIL 1,require-emptydir-requests-and-limits/autogen-check-emptydir-requests-limits … failed at path /resources/limits/;-n kagent—Deployment kagent-oauth2-proxyand its ReplicaSets FAIL 1,restrict-image-registries/autogen-validate-registries … failed at path /spec/template/spec/containers/0/image/.Acceptance of the roll: the installation follows this chart's release candidates through its GitOps range; once
v4.124.1-rc.2runs there,kubectl get policyreports -n ate-systemand-n kagentshow no failure for the two Deployments. The result follows in this thread.teemow commentedon Oct 10, 2026
Live result, two test installations on 4.x with Kyverno, after
v4.124.1-rc.2rolled there through their GitOps ranges (meta chart,substrateandkagentreleases Ready; read-only, an agent's read at 13:14Z):Deployment ate-system/atenet-egressrunsagentgatewayandext-procwithrequests.ephemeral-storage: 16Mi,limits.ephemeral-storage: 256Mianddrain-signalasemptyDir: {sizeLimit: 16Mi}(the substrate HelmRelease's postRenderer, Substrate 1.7.0 on both). The reports of the objects created by the roll are clean:Pod atenet-egress-…PASS 20 FAIL 0 andReplicaSet atenet-egress-…PASS 19 FAIL 0 on both installations. The Deployment-scoped report still carries its pre-roll entry (require-emptydir-requests-and-limits, timestamps 10:14Z and 10:03Z, before the roll) and the ten retired ReplicaSets keep theirs: Kyverno's reports controller rescans in the background (--backgroundScanInterval=1h, two workers), so the Deployment entry refreshes at its next pass. Acceptance of that entry: the next read on these installations showsDeployment atenet-egressFAIL 0.Deployment kagent/kagent-oauth2-proxyrunsgsoci.azurecr.io/giantswarm/oauth2-proxy:v7.15.5; its report is PASS 23 FAIL 0 (PASS 22 FAIL 0 on the second installation), the new Pod's and ReplicaSet's FAIL 0 —restrict-image-registriesno longer reports it. Only the retired ReplicaSets' reports keep the old finding until the revision history prunes them.teemow commentedon Oct 10, 2026
Last read (an agent's, 12:00Z), the two test installations, after Kyverno's hourly background pass had rescanned the
Deployment atenet-egressreport (the other policies' entries now stamped 11:39Z and 11:52Z): therequire-emptydir-requests-and-limitsentry still carries its pre-roll result and timestamp (10:14Z, 10:03Z). The previous comment's acceptance line does not hold as written, and the entry is not a re-evaluated failure: the rule's context lists only emptyDir volumes without asizeLimit, so a Deployment whosedrain-signalcarries one yields no result for the rule at all, and Kyverno keeps the entry it had instead of dropping it. Reproduced locally withkyverno apply(CLI 1.19.1) against the live ClusterPolicy: the live Deployment and Pod produce no row, a retired ReplicaSet with the old template reproduces the FAIL.Live on both installations:
drain-signalisemptyDir: {sizeLimit: 16Mi},agentgatewayandext-procrun withrequests.ephemeral-storage: 16Miandlimits.ephemeral-storage: 256Mi; the current Pod's and ReplicaSet's reports are FAIL 0.Deployment kagent/kagent-oauth2-proxyrunsgsoci.azurecr.io/giantswarm/oauth2-proxy:v7.15.5, its report FAIL 0 on both.Standing: every FAIL left for these two workloads is the retained Deployment entry or a retired, zero-replica ReplicaSet; no running object fails. The retained entry is a Kyverno reporting matter (the policy's context and the reports controller's merge), handed to the policies' owners separately; this issue stays closed on the live objects.