Skip to main content
Version: Next

Deployment Topology

OpenChoreo uses a multi-plane architecture that separates concerns between control, runtime, build, and observability. This guide covers the prerequisites, topology options, and how planes connect.

Prerequisites​

Before deploying OpenChoreo to production, ensure your environment meets the following requirements.

Kubernetes Cluster​

RequirementSpecification
Kubernetes Version1.32 or later
Node CountMinimum 3 nodes (for high availability)
Node Resources4 CPU cores, 8 GB RAM per node (minimum)
RBACEnabled
LoadBalancerRequired for external access
Storage ClassesAt least one default StorageClass for PersistentVolumeClaims
note

For development or testing, a single-node cluster with 8 GB RAM and 4 CPU cores is sufficient. Production deployments should use a multi-node cluster with appropriate resource allocation.

Required Tools​

Install the following tools on your workstation:

ToolVersionNotes
kubectl1.32+Kubernetes CLI
Helm3.12+Package manager
cert-manager1.12+Required on all clusters where OpenChoreo planes are deployed

LoadBalancer Requirements​

OpenChoreo services require LoadBalancer with the ability to dynamically assign IPs. In production, each plane exposing services on port 443 needs a separate IP address (since multiple services cannot share the same IP:port combination).

If only a single IP is available, ports can be customized per service. Refer to the Helm Charts Reference for port configuration options.

IPs and Ports by Plane​

Control Plane:

PortPurpose
443Backstage UI, OpenChoreo API, Identity Provider
80HTTP to HTTPS redirect (optional)

Data Plane:

PortPurpose
443Application endpoints, deployment invocations
80HTTP to HTTPS redirect (optional)

Build Plane (Optional):

  • No inbound ports required
  • Only outbound connectivity needed (to Control Plane, container registry)

Observability Plane (Optional):

PortPurpose
443OpenSearch ingestion endpoint

Domain Requirements​

Each plane requires its own domain(s). These do not need to share a common base domain - configure each independently as needed.

PlaneDomains Required
Control PlaneConsole UI domain, API domain, Identity Provider domain
Data PlaneApplication endpoints domain (wildcard for dynamic apps)
Build Plane (Optional)No external domain required
Observability Plane (Optional)OpenSearch/ingestion endpoint domain

Refer to the Helm Charts Reference for domain configuration options.

TLS Certificate Requirements​

PlaneCertificate TypeDomains
Control PlaneStandard (SAN)Console, API, Identity Provider
Data PlaneWildcard*.{apps-domain} for application endpoints
Build Plane (Optional)None required (internal only)
Observability Plane (Optional)StandardIngestion endpoint

Use cert-manager to automatically provision and renew certificates, or bring your own certificates.

Resource Requirements​

Control Plane​

ComponentCPU RequestCPU LimitMemory RequestMemory Limit
Backstage200m2000m256Mi2Gi
OpenChoreo API100m500m256Mi512Mi
Controller Manager100m500m128Mi512Mi
Cluster Gateway100m500m128Mi256Mi

Data Plane​

ComponentCPU RequestCPU LimitMemory RequestMemory Limit
KGateway Controller100m200m128Mi256Mi
Cluster Agent50m100m128Mi256Mi

Build Plane (Optional)​

ComponentCPU RequestCPU LimitMemory RequestMemory Limit
Argo Workflows Controller25m50m32Mi64Mi
Cluster Agent50m100m128Mi256Mi

Observability Plane (Optional)​

ComponentCPU RequestCPU LimitMemory RequestMemory Limit
OpenSearch (per node)100m1000m1Gi1Gi
Observer100m200m128Mi200Mi
Cluster Agent50m100m128Mi256Mi

Storage Requirements​

PlaneComponentDefault Size
Control PlaneDatabase500Mi
Build Plane (Optional)Container Registry10Gi
Build Plane (Optional)Podman Cache10Gi
Observability Plane (Optional)OpenSearch (per data node)5Gi
note

OpenSearch storage requirements grow with log retention. For production with extended retention, increase openSearchCluster.nodePools.data.diskSize accordingly.

Pre-Installation Checklist​

Before proceeding with installation:

  • Kubernetes cluster meets version and resource requirements
  • kubectl and helm are installed and configured
  • LoadBalancer service type is available
  • Storage class is configured for PersistentVolumeClaims
  • Domains are registered and DNS is configurable
  • TLS certificate strategy is determined (cert-manager or bring your own)
  • Network connectivity between clusters is verified (for multi-cluster)
  • Required ports are accessible through firewalls

Architecture Overview​

PlaneRequiredPurpose
Control PlaneYesCentral management, API, UI
Data PlaneYesApplication runtime
Build PlaneNoCI/CD workflows
Observability PlaneNoLogging and monitoring

Resource Hierarchy​

Organization
β”œβ”€β”€ Environment
β”‚ └── references β†’ DataPlane
β”œβ”€β”€ DataPlane
β”‚ └── references β†’ ObservabilityPlane (optional)
β”œβ”€β”€ BuildPlane
β”‚ └── references β†’ ObservabilityPlane (optional)
└── ObservabilityPlane

Cluster Agent Connectivity​

OpenChoreo planes communicate via Cluster Agents using WebSocket connections. The agent runs in each remote plane and establishes an outbound connection to the Control Plane's Cluster Gateway.

Single-Cluster Mode: Communication happens via Kubernetes ClusterIP services - no external networking required between planes.

Multi-Cluster Mode: Each plane's cluster agent connects outbound to the Control Plane. Only the Control Plane needs to be reachable from other clusters.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Control Plane Cluster β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Cluster Gateway β”‚ β”‚
β”‚ β”‚ (wss://:8443) β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ β”‚
β”‚ WebSocket β”‚ WebSocket β”‚ WebSocket
β”‚ (outbound) β”‚ (outbound) β”‚ (outbound)
β”‚ β”‚ β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Data Plane Cluster β”‚ β”‚ Build Plane β”‚ β”‚ Observability Plane Cluster β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ Cluster β”‚ β”‚ (Optional) β”‚
β”‚ β”‚ Cluster Agent β”‚ β”‚ β”‚ (Optional) β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Cluster Agent β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚Cluster Agentβ”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Deployment Workflow (Order of Operations)​

When building your production environment, follow this general sequence to ensure dependencies are met:

  1. Control Plane Setup:

    • Deploy the openchoreo-control-plane chart
    • Configure TLS certificates for the Console, API, and IdP
    • Crucial: Configure the Cluster Gateway ingress and certificate - this is the entry point for all other planes
  2. Establish Trust (Multi-Cluster Only):

    • Extract the Cluster Gateway CA certificate from the Control Plane
    • This CA is required by all other planes to verify the Control Plane's identity
    • See Multi-Cluster Connectivity for detailed steps
  3. Observability Plane (Recommended First):

    • Deploy the openchoreo-observability-plane chart
    • Register it with the Control Plane using the ObservabilityPlane CRD
    • This allows subsequent planes to immediately start sending logs and metrics
  4. Data Plane(s):

    • Deploy the openchoreo-data-plane chart
    • Configure the ingress/gateway for your application workloads (*.apps.example.com)
    • Register with the Control Plane using the DataPlane CRD
    • Link to Observability Plane (if deployed)
  5. Build Plane (Optional):

    • Deploy the openchoreo-build-plane chart
    • Configure the Container Registry ingress - this is critical for the Control Plane to read image metadata
    • Register with the Control Plane using the BuildPlane CRD

Common Topologies​

Single-Cluster​

All planes run in the same Kubernetes cluster with namespace isolation. Communication happens via Kubernetes ClusterIP services.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Single Kubernetes Cluster β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Control Plane β”‚ Data Plane β”‚ Build & Observability β”‚
β”‚ Namespace β”‚ Namespace β”‚ Namespaces β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Multi-Cluster​

Separate clusters provide isolation and independent scaling. Cluster agents establish outbound WebSocket connections to the Control Plane.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Control Plane │◀────│ Data Plane β”‚
β”‚ Cluster β”‚ β”‚ Cluster β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
│◀──────────────│ Build Plane β”‚
β”‚ β”‚ Cluster β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
└───────────────│ Observability β”‚
β”‚ Cluster β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

For multi-cluster setup instructions, see Multi-Cluster Connectivity.

Multi-Region​

Central Control Plane with Data Planes across regions. Each Data Plane has a unique gateway.publicVirtualHost (e.g., us.apps.example.com, eu.apps.example.com).

                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Control Plane β”‚
β”‚ (Central) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β–Ό β–Ό β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Data Plane US β”‚ β”‚ Data Plane EU β”‚ β”‚ Data Plane APAC β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Plane Resources​

Organizations​

An Organization is the top-level tenant resource. All other OpenChoreo resources (Environment, DataPlane, BuildPlane, ObservabilityPlane) are namespaced within an organization.

A default organization (default-organization) is created during installation.

For complete configuration options, see the Organization API Reference.

Environments​

An Environment represents a deployment stage (development, staging, production) bound to a specific DataPlane.

Key considerations:

  • The dataPlaneRef is immutable - to change the DataPlane, delete and recreate the Environment
  • The gateway.dnsPrefix determines the subdomain for deployed applications

For complete configuration options, see the Environment API Reference.

DataPlane​

A DataPlane defines where application workloads run. It requires:

  • Cluster agent configuration with CA certificate for authentication
  • Gateway configuration with public virtual host for application endpoints

For complete configuration options and examples, see the DataPlane API Reference.

BuildPlane (Optional)​

A BuildPlane provides infrastructure for CI/CD workflows. When enabled:

  • Requires cluster agent configuration with CA certificate
  • Can reference an ObservabilityPlane for build logs

For complete configuration options, see the BuildPlane API Reference.

ObservabilityPlane (Optional)​

An ObservabilityPlane provides logging and monitoring infrastructure. Key fields:

  • observerURL: The Observer service endpoint
  • agent: Cluster agent configuration for communication

Both DataPlane and BuildPlane can reference an ObservabilityPlane via observabilityPlaneRef.

Linking Planes​

Planes reference each other in their spec to form a logical topology.

ResourceReference FieldTarget
EnvironmentdataPlaneRefDataPlane
DataPlaneobservabilityPlaneRefObservabilityPlane
DataPlanesecretStoreRefClusterSecretStore
BuildPlaneobservabilityPlaneRefObservabilityPlane

For detailed instructions on registering planes and establishing trust between clusters, see Multi-Cluster Connectivity.

Verifying Resources​

kubectl get organizations
kubectl get environments -n <organization-name>
kubectl get dataplanes -n <organization-name>
kubectl get buildplanes -n <organization-name>
kubectl get observabilityplanes -n <organization-name>

Troubleshooting​

Agent Connection Issues​

# Check agent pod status
kubectl get pods -n openchoreo-data-plane -l app.kubernetes.io/name=cluster-agent

# View agent logs
kubectl logs -n openchoreo-data-plane deployment/cluster-agent

Environment Not Ready​

# Check environment conditions
kubectl describe environment <name> -n <organization-name>

# Verify referenced DataPlane exists
kubectl get dataplane <dataplane-ref> -n <organization-name>

Plane Status Not Updating​

# Check controller-manager logs
kubectl logs -n openchoreo-control-plane deployment/controller-manager

# View plane conditions
kubectl get dataplane <name> -n <organization-name> -o jsonpath='{.status.conditions}'