Source the control plane from Vault and use a stable ref name

Two hardcoded values tied this repo to one specific Konnect org, and
replacing that org broke both.

CONTROL_PLANE_ID was pasted into gateway-kustomization.yaml. It now
comes from Vault through External Secrets, into a Secret in flux-system
that postBuild.substituteFrom reads. flux-system is acceptable for the
id — it is visible in the Konnect UI URL — but not for the token, which
keeps going straight to the domain namespace as before.

CONTROL_PLANE_REF_NAME held the random suffix the Gateway operator gives
its auto-created mirror CR, looked up by hand. The new org recreated
those CRs under new suffixes, so the ref named an object that no longer
existed and the domain's Kong entities sat Programmed=False. It now
names the ${NAME}-cp mirror declared in k8s-platform's
dataplane-template — derived from NAME, stable across Gateway
recreations and org changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Stéphane Tailland
2026-08-26 16:30:15 +02:00
parent 3e52afe834
commit e1a6b67fc3
3 changed files with 44 additions and 8 deletions
@@ -0,0 +1,34 @@
# The Control Plane id, delivered to flux-system so gateway-kustomization.yaml
# can substitute it instead of carrying a hardcoded UUID.
#
# Why a second ExternalSecret rather than extra keys on the existing one:
# substituteFrom requires the Secret to sit in the same namespace as the Flux
# Kustomization, which is flux-system — a shared, broadly-readable namespace.
# The Konnect token must never go there. A Control Plane id is not a secret;
# it is visible in the Konnect UI URL.
#
# Terraform writes this path (see konnect-platform). Moving to a new Konnect
# org then needs no edit here at all.
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: catalog-dev-control-plane
namespace: flux-system
spec:
refreshInterval: 1h
secretStoreRef:
kind: ClusterSecretStore
name: vault-kong-v2
target:
name: catalog-dev-control-plane
data:
# Key names are the Flux substitution variables verbatim: substituteFrom
# exposes each key as ${KEY}.
- secretKey: CONTROL_PLANE_ID
remoteRef:
key: kong-v2/catalog/dev/control-plane
property: CONTROL_PLANE_ID
- secretKey: CONTROL_PLANE_NAME
remoteRef:
key: kong-v2/catalog/dev/control-plane
property: CONTROL_PLANE_NAME
+6 -1
View File
@@ -23,7 +23,6 @@ spec:
substitute: substitute:
NAME: catalog-dev NAME: catalog-dev
NAMESPACE: catalog NAMESPACE: catalog
CONTROL_PLANE_ID: "7a1e7127-0a02-4d09-b1dd-2efc865e9e97"
HOSTNAME: catalog-dev.sttlab.local HOSTNAME: catalog-dev.sttlab.local
# Cluster-wide defaults only — the Konnect PAT is NOT handled via # Cluster-wide defaults only — the Konnect PAT is NOT handled via
# substitute/substituteFrom at all: that mechanism requires the source # substitute/substituteFrom at all: that mechanism requires the source
@@ -35,3 +34,9 @@ spec:
substituteFrom: substituteFrom:
- kind: ConfigMap - kind: ConfigMap
name: dataplane-template-defaults name: dataplane-template-defaults
# CONTROL_PLANE_ID comes from Vault via ESO instead of being hardcoded
# here: a new Konnect org then needs no edit in this repo. Not a secret —
# the id is visible in the Konnect UI URL — so flux-system is fine for it,
# unlike the token.
- kind: Secret
name: catalog-dev-control-plane
+4 -7
View File
@@ -19,13 +19,10 @@ spec:
substitute: substitute:
NAME: catalog-dev NAME: catalog-dev
NAMESPACE: catalog NAMESPACE: catalog
# Looked up manually after gateway-kustomization.yaml's # Stable by construction: the mirror CR is declared with this derived
# Gateway/GatewayConfiguration first reconciled — the operator # name in k8s-platform/dataplane-template/controlplane-mirror.yaml, so
# auto-names the mirrored KonnectGatewayControlPlane with a random # it no longer has to be looked up after each Gateway reconcile.
# suffix, not derivable from NAME. See CONTROL_PLANE_REF_NAME: catalog-dev-cp
# dataplane-globalpolicy-template/global-policies-pluginbindings.yaml's
# comment. Automate this lookup once the self-service pipeline exists.
CONTROL_PLANE_REF_NAME: catalog-dev-bkphl
# Every audience valid anywhere in the catalog domain — grows as the # Every audience valid anywhere in the catalog domain — grows as the
# domain gains APIs. # domain gains APIs.
JWT_AUDIENCE_WHITELIST: '["catalog-api", "mcp-catalog"]' JWT_AUDIENCE_WHITELIST: '["catalog-api", "mcp-catalog"]'