Place the dataplane defaults in every domain namespace

postBuild.substituteFrom can only read a ConfigMap in its own namespace.
dataplane-template-defaults existed only in flux-system, so every gateway
Kustomization had to live in flux-system to reach it — a namespace the
feature teams have no access to. Their own gateway configuration ended up
outside their reach as a side effect of a substitution rule, not as a
governance decision.

Add a namespace-less copy of the ConfigMap under
kong-platform/domain-defaults, plus one Kustomization per domain in
flux/domain-defaults.yaml differing only by targetNamespace. One source
file, one edit when a default changes, six copies that follow.

Platform-owned deliberately: these are the defaults a team inherits, not
ones it sets, so they stay in flux-system while everything a team does own
moves out of it.

This is the precondition, not the move itself. The flux-system copy stays
until the gateway Kustomizations relocate, and they cannot be patched into
a new namespace — that is a delete and recreate, with a window where the
gateway is unreconciled.

It also retires a workaround: platform-llm inlined OTEL_TRACES_ENDPOINT
because its Kustomization had to sit in the llm namespace, holding real
credentials it must not put in flux-system, and so could not read this
ConfigMap. With the ConfigMap in llm, that inlining can go.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Stéphane Tailland
2026-08-27 14:31:11 +02:00
parent a392e09ae5
commit 11d27c2655
3 changed files with 135 additions and 0 deletions
+102
View File
@@ -0,0 +1,102 @@
# One Kustomization per domain, all pointing at the same source file and
# differing only by targetNamespace. This is what puts
# dataplane-template-defaults inside each domain namespace, which is the
# precondition for a domain's own gateway Kustomization to live there too —
# postBuild.substituteFrom reads only from its own namespace.
#
# Platform-owned on purpose: these are the defaults a feature team inherits,
# not ones it sets. They stay in flux-system, and everything a team does own
# moves out of it.
#
# The flux-system copy stays for now: the gateway Kustomizations still read it
# from there and only stop once they move.
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: domain-defaults-catalog
namespace: flux-system
spec:
interval: 10m
sourceRef:
kind: GitRepository
name: k8s-platform
path: ./kong-platform/domain-defaults
targetNamespace: catalog
prune: true
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: domain-defaults-customers
namespace: flux-system
spec:
interval: 10m
sourceRef:
kind: GitRepository
name: k8s-platform
path: ./kong-platform/domain-defaults
targetNamespace: customers
prune: true
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: domain-defaults-payments
namespace: flux-system
spec:
interval: 10m
sourceRef:
kind: GitRepository
name: k8s-platform
path: ./kong-platform/domain-defaults
targetNamespace: payments
prune: true
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: domain-defaults-sales
namespace: flux-system
spec:
interval: 10m
sourceRef:
kind: GitRepository
name: k8s-platform
path: ./kong-platform/domain-defaults
targetNamespace: sales
prune: true
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: domain-defaults-workforce
namespace: flux-system
spec:
interval: 10m
sourceRef:
kind: GitRepository
name: k8s-platform
path: ./kong-platform/domain-defaults
targetNamespace: workforce
prune: true
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: domain-defaults-llm
namespace: flux-system
spec:
interval: 10m
sourceRef:
kind: GitRepository
name: k8s-platform
path: ./kong-platform/domain-defaults
targetNamespace: llm
prune: true