Environment map
This page is the canonical map of the Fedshi reference instance — customer #1 of DevsPortal. It lists every public hostname, what serves it, which plane and namespace it lives in, the TLS secret that terminates it, and the DNS strategy that ties them together.
DevsPortal is built on the Control Plane Operator engine. The internal
namespace names (openchoreo-control-plane, etc.), the chart coordinates, and the CRD
API group are upstream identifiers and are kept unchanged — they are internal and never
exposed to users. Only the public hostnames under {fedshi.dnsZone} are branded.
Cluster context
Everything runs in a single GKE cluster. The four Control Plane Operator planes (control, data, workflow, observability) plus the shared infrastructure all live in one cluster:
| Property | Value |
|---|---|
| Kube-context | {fedshi.cluster} |
| Region | europe-north2 |
| Kubernetes | {versions.kubernetes} |
| DNS zone | {fedshi.dnsZone} (Cloudflare) |
| Public root | idp.{fedshi.dnsZone} |
Public hostnames
Every hostname below serves a real, trusted Let's Encrypt certificate (issued via Cloudflare DNS-01). No skip-TLS or insecure flags are set anywhere.
| Hostname | Serves | Plane | Namespace | TLS secret |
|---|---|---|---|---|
| console.idp.fedshi.com | Developer portal (branded Backstage) | Control | openchoreo-control-plane | cp-gateway-tls |
| api.idp.fedshi.com | Control Plane Operator API server | Control | openchoreo-control-plane | cp-gateway-tls |
| auth.idp.fedshi.com | ThunderID OAuth2 / OIDC | Identity | thunder | cp-gateway-tls |
{fedshi.apps} | Deployed workload endpoints (wildcard) | Data | openchoreo-data-plane | dp-gateway-tls |
| registry.idp.fedshi.com | Harbor container registry | Registry | harbor | harbor-tls |
| observer.idp.fedshi.com | Observer API (logs / metrics / traces) | Observability | openchoreo-observability-plane | obs-gateway-tls |
Notes:
console,api, andauthshare the control-plane gateway (gateway-defaultinopenchoreo-control-plane) and therefore the samecp-gateway-tlsSAN cert. The ThunderID identity provider lives in its ownthundernamespace but is fronted by the control-plane gateway, so it is reachable atauthover that listener.- The workflow plane (
openchoreo-workflow-plane, Argo Workflows) has no public hostname — it builds images internally and pushes them to Harbor. dp-gateway-tlsis a wildcard (*.apps.idp.{fedshi.dnsZone}+apps.idp.{fedshi.dnsZone}). Deployed component endpoints look like<env>-<namespace>.apps.idp.{fedshi.dnsZone}.
Namespaces
| Namespace | Contains |
|---|---|
openchoreo-control-plane | API server, portal, controllers, cluster-gateway, kgateway |
openchoreo-data-plane | Workload runtime + app-traffic gateway |
openchoreo-workflow-plane | Build workflows (Argo Workflows) |
openchoreo-observability-plane | Observer + OpenSearch + Prometheus |
thunder | ThunderID identity provider |
harbor | Harbor container registry |
openbao | OpenBao secret backend |
cert-manager | cert-manager (TLS issuance) |
external-secrets | External Secrets Operator |
DNS and LoadBalancer strategy
DNS is served from the {fedshi.dnsZone} Cloudflare zone. Every record is an A
record, DNS-only (grey cloud, NOT proxied). The platform gateways terminate TLS
themselves; enabling the Cloudflare proxy would break SNI/host routing and wildcard TLS.
Each plane's gateway (and Harbor) is exposed as a LoadBalancer Service with its own
GKE regional external IP. The DNS strategy is a broad wildcard pointing at the
control-plane IP, with more-specific overrides for the planes that have their own
LoadBalancer:
| Record | Target | Resolves |
|---|---|---|
*.idp.{fedshi.dnsZone} (and idp.{fedshi.dnsZone} apex) | Control-plane LB | console, api, auth (catch-all) |
*.apps.idp.{fedshi.dnsZone} | Data-plane LB | App endpoints (wildcard) |
registry.idp.{fedshi.dnsZone} | Harbor LB | Registry |
observer.idp.{fedshi.dnsZone} | Observability LB | Observer API |
Cloudflare resolves most-specific-first, so the *.apps, registry, and observer
records override the broad *.idp wildcard.
LoadBalancer IPs are GKE regional L4 addresses tied to each plane's gateway-default
(and Harbor) Service. If a Service is recreated the IP can change — re-check with
kubectl get svc <svc> -n <ns> and update the corresponding DNS record.
Related pages
- Versions — every pinned chart and image.
- Endpoints and credentials — how to reach each endpoint and where secrets live.
- API and CRDs — the platform and developer API surface.