Ingress controller migration: up ctx fails or control plane unreachable after switching ingress controllers
Last updated: July 9, 2026
Symptoms
After migrating the ingress controller fronting Spaces (e.g. NGINX Ingress Controller → Traefik or similar), the up CLI fails, even though the ingress and spaces-router backend otherwise look healthy:
up: error: failed to get server groups: the server was unable to return a response in the time allotted, but may still be processing the request
up: error: Get "https:///api/v1/namespaces/upbound-system/configmaps/ingress-public": context deadline exceeded
The empty hostname in that second URL, that's the tell.
Root cause
ingress.host isn't set in the Spaces Helm values. Spaces uses this value to populate:
The
PUBLIC_HOSTenvironment variable on the Spaces RouterThe
ingress-publicConfigMap inupbound-system, which theupCLI reads to discover the Spaces endpoint
Without it, both default to proxy.upbound-127.0.0.1.nip.io, a local dev placeholder that won't work outside a local cluster. This surfaces during ingress migrations because that's usually when people are touching this part of the values file, but it isn't specific to any particular ingress controller.
Fix
Set ingress.host explicitly in the Spaces Helm values, both before and after any ingress controller migration:
ingress:
host: "<your-public-hostname>"
If your CNI enforces network policies, also set the controller-specific ingress.podLabels and ingress.namespaceLabels for whichever controller now fronts Spaces, so traffic is allowed into the Spaces Router.
ingress:
podLabels:
app.kubernetes.io/name: "traefik"
namespaceLabels:
kubernetes.io/metadata.name: "traefik"
Don't manually patch ingress-public
It's tempting to patch the ConfigMap directly as a quick fix. Don't rely on this: it doesn't survive chart upgrades and won't propagate to other places that read ingress.host (like PUBLIC_HOST). Set the Helm value instead.
Choosing and configuring your new ingress controller
Spaces needs end-to-end TLS passthrough to spaces-router, not TLS termination and re-encryption. For controller-specific setup (including the Traefik path, annotation mappings, and running old/new controllers side by side for a zero-downtime cutover), see the ingress-nginx migration guide.