Skip to main content

Clusters and Namespaces

OpenControlPlane spans multiple Kubernetes clusters, each with its own namespace conventions.

Cluster Overview

OpenControlPlane uses four types of clusters, each with a distinct role:

ClusterPurposePrimary Audience
OnboardingUser-facing API surface for managing Projects, Workspaces, and ControlPlanesEnd users
PlatformRuns all operators (openmcp-operator, service providers, cluster providers) and manages per-tenant resourcesPlatform operators, service provider developers
MCPPer-tenant lightweight Kubernetes clusterEnd users
WorkloadShared multi-tenant cluster for running DomainService controllers (optional)Service provider developers

Namespace Model

The following diagram shows how namespaces are organized across all four cluster types:

Onboarding Cluster

The Onboarding Cluster is the entry point for end users. Namespaces follow a hierarchical pattern:

NamespaceCreated ByContains
project-<project-name>Creating a ProjectWorkspaces, project-scoped resources
project-<project-name>--ws-<workspace-name>Creating a WorkspaceManagedControlPlaneV2 resources, ServiceProviderAPI instances

For example, a project named platform-team with a workspace dev results in:

  • project-platform-team for the project
  • project-platform-team--ws-dev for the workspace

Service Providers install CRDs on the Onboarding Cluster so that all tenants can discover available services.

Platform Cluster

The Platform Cluster runs all operators. Tenant resources are isolated using namespaces:

NamespacePurpose
openmcp-systemSystem namespace where all provider pods (service providers, cluster providers, platform services) and the openmcp-operator run
mcp--<uuid>One per MCP tenant. Auto-generated using a deterministic SHAKE128 hash of the MCP name and namespace. Contains AccessRequests, ClusterRequests, and kubeconfig secrets scoped to that tenant

The mcp--<uuid> namespaces are created and managed automatically by the platform.

info

The POD_NAMESPACE environment variable, available to all provider pods, refers to the provider's namespace on the Platform Cluster (typically openmcp-system). See the deployment guide for all available environment variables.

MCP Cluster

Each tenant gets a dedicated MCP (Managed Control Plane) Cluster — a lightweight Kubernetes cluster with its own API server and data store. This provides the strongest isolation boundary between tenants.

NamespacePurpose
Service-specific (e.g., crossplane-system, ls-system-<id>, flux-system)Resources deployed by service providers and platform components

Each service provider chooses its own namespace on the MCP cluster — there is no single default namespace convention. For example, Crossplane uses the fixed namespace crossplane-system, while Landscaper derives an instance-specific namespace like ls-system-<id>. When building a new service provider, you decide which namespace to deploy your resources into.

Workload Cluster

Workload Clusters are shared multi-tenant clusters. Multiple service instances from different tenants can run on the same cluster, so tenant isolation via namespaces is required.

Each service provider must use a unique namespace per tenant service instance. For example, by hashing the tenant resource's name and namespace into an instance ID and using it as a namespace suffix.

NamespacePurpose
<provider>-<instance-id> (e.g., ls-system-<id>)Service provider workloads, isolated per tenant
info

Newly developed services should prioritize deploying their workloads on Workload Clusters rather than MCP Clusters. See the service provider design for details.

Real-World Examples

The following examples show how two production service providers use namespaces across all cluster types.

service-provider-crossplane (MCP-only, no Workload Cluster)

ClusterNamespaceWhat goes there
Platformpod namespace (typically openmcp-system)Provider pod; source for image pull secrets
Platformmcp--<uuid> (tenant namespace)HelmRelease + OCIRepository for Flux; AccessRequest + kubeconfig secret; chart pull secrets
Onboardingproject-<p>--ws-<w>Crossplane ServiceProviderAPI objects
MCPcrossplane-system (fixed)Crossplane pods, provider pods, image pull secrets (copied from platform)

Image pull secrets are copied from the pod namespace on the Platform Cluster to crossplane-system on the MCP cluster.

service-provider-landscaper (MCP + Workload Cluster)

ClusterNamespaceWhat goes there
Platformpod namespace (typically openmcp-system)Provider pod; source for image pull secrets
Platformmcp--<uuid> (tenant namespace)AccessRequests for MCP and Workload cluster access
Onboardingproject-<p>--ws-<w>Landscaper ServiceProviderAPI objects
MCPls-system-<instance-id> (derived)Namespace + RBAC resources
Workloadls-system-<instance-id> (derived)Landscaper controller, webhooks server, manifest-deployer, helm-deployer; config and kubeconfig Secrets; image pull secrets

The instance ID is a base32-encoded SHA1 hash of the Landscaper resource's namespace and name, producing a unique namespace per instance. Image pull secrets are synced from the pod namespace on the Platform Cluster to the instance namespace on the Workload Cluster.

For Service Provider Developers

You access MCP and Workload clusters via the ClusterContext provided by the service-provider-runtime. See the service provider development guide for the full mapping.