What you’ll achieve
By the end of this guide, you will have:- A Kubernetes cluster with the Control Plane operator installed
- Authentication configured between your cluster and Control Plane
- The ability to deploy and manage Control Plane resources using Kubernetes CRDs
- Optional ArgoCD integration for GitOps workflows
When to use this
GitOps workflows
Manage Control Plane resources alongside your Kubernetes manifests in Git
ArgoCD integration
Deploy Control Plane resources through ArgoCD applications
Kubernetes-native experience
Manage GVCs, workloads, secrets, and more using CRDs
Infrastructure as Code
Define your entire Control Plane infrastructure declaratively
Supported resources
The operator manages the following Control Plane resource types through CRDs:| Resource | Description |
|---|---|
agent | Secure connectivity to private networks and cloud provider services |
auditctx | Tamper-proof audit trail for tracking actions |
cloudaccount | Cloud provider integrations (AWS, GCP, Azure, NGS) |
domain | Custom domain mapping with TLS and geo-routing |
group | Membership collection of users and service accounts |
gvc | Global Virtual Cloud - groups workloads and defines deployment locations |
identity | Grants workloads access to cloud resources and private networks |
ipset | Reserved public IP addresses for workloads |
location | Cloud regions where workloads can be deployed |
mk8s | Managed Kubernetes clusters across cloud providers |
org | Top-level context for all Control Plane resources |
policy | Grants permissions to principals on target resources |
secret | Encrypted storage for credentials and sensitive data |
serviceaccount | Machine identity for headless API operations |
volumeset | Persistent storage with snapshots and auto-scaling |
workload | Application containers running on Control Plane |
Prerequisites
Kubernetes cluster
Kubernetes cluster
A running Kubernetes cluster (v1.19+). This can be:
- A managed cluster (EKS, GKE, AKS)
- A local cluster (kind, minikube, Docker Desktop)
- Any conformant Kubernetes distribution
Helm CLI
Helm CLI
Install Helm v3.0+ for deploying the operator:For other installation methods, see the Helm installation guide.
kubectl configured
kubectl configured
Ensure kubectl is configured and can communicate with your cluster:
Control Plane account
Control Plane account
You need to be signed up to Control Plane and have access to an org. If you don’t already:
- Sign up for Control Plane and create a billing account
- Create an Org
Quick start (local cluster)
If you don’t have a Kubernetes cluster, you can set up a local one for testing.Docker must be installed and running on your machine for local Kubernetes clusters.
- Repo Quick Start
- kind
- minikube
Clone the operator repository and run the quick start command to create a local kind cluster with the operator pre-installed:This creates a kind cluster and installs cert-manager and the operator automatically.Verify the cluster is running:
Installation
If you used the Repo Quick Start above, skip to Step 3: Configure authentication — cert-manager and the operator are already installed.
Step 1: Install cert-manager
The operator requires cert-manager for webhook certificate management.Step 2: Install the operator
Add the Control Plane Helm repository and install the operator:Step 3: Configure authentication
The operator needs credentials to communicate with the Control Plane API. You have two options:- Using the CLI (Recommended)
- Manual setup
The CLI automatically creates the service account and Kubernetes secret:This command:Command options:
1
Creates a service account
Creates a service account named
k8s-operator if it doesn’t already exist2
Assigns group membership
Adds the service account to the
superusers group (customizable with --serviceaccount-group)3
Generates authentication key
Creates a new key for the service account
4
Creates Kubernetes secret
Stores the credentials as a secret in the
controlplane namespace| Option | Description |
|---|---|
--serviceaccount, -s | Service account name (required) |
--serviceaccount-group, -g | Group to assign (default: superusers) |
--export | Export YAML to stdout instead of applying to cluster |
--org | Target organization |
Generating CRD manifests
You don’t need to write CRD manifests from scratch. Control Plane can export any resource in Kubernetes CRD format.- Console UI
- CLI
Export existing resources:
- Navigate to any resource (GVC, workload, identity, etc.)
- Click the Export dropdown in the upper right corner
- Select K8s CRD to download the manifest
- Create a new resource and configure it using the UI
- Before clicking Create, click Preview
- Select K8s CRD to generate the manifest
- Copy or download the YAML without deploying
Deploying resources
All Control Plane resources are managed through CRDs. Each resource requires:org: The target Control Plane organizationgvc: The target GVC (for GVC-scoped resources like workloads and identities)
We recommend organizing resources by namespace:
- One namespace per GVC for GVC-scoped resources (workloads, identities, volumesets)
- One namespace per org for org-scoped resources (GVCs, secrets, policies)
Apply with kubectl
You can apply CRD manifests directly using kubectl. Save the following GVC manifest to a file (e.g.,gvc.yaml):
GitOps with ArgoCD
For production workflows, store your CRD manifests in a Git repository or package them as a Helm chart, and use ArgoCD to manage deployments automatically.Preventing resource deletion
Deleting a Kubernetes resource while the operator is installed and running will remove the corresponding resource from Control Plane. You can prevent this by adding thecpln.io/resource-policy: keep annotation to the metadata:
ArgoCD integration
The operator integrates seamlessly with ArgoCD for GitOps workflows. Once the operator is installed, you can point ArgoCD at a Git repository containing YAML manifests or a Helm chart.This section assumes ArgoCD is already installed on your cluster. See the ArgoCD installation guide if you haven’t set it up yet.
Defining ArgoCD applications
An ArgoCD Application defines what to deploy (source) and where to deploy it (destination). For Control Plane CRDs, you can use either a Helm chart or raw YAML manifests stored in a Git repository. Save the manifest to a file (e.g.,app.yaml) and update the placeholder values before applying.
- Helm Chart
- YAML Manifests
Point ArgoCD at a Helm repository containing your Control Plane CRD templates:To create your own Helm chart:
- Create a new Helm chart:
helm create my-cpln-chart - Add your Control Plane CRD manifests to the
templates/directory - Push the chart to a GitHub repository
- Publish the chart to GitHub Pages or a Helm repository
Example application
The k8s-operator repository includes a ready-to-use example that deploys a GVC, workload, identity, and other resources. Copy the following manifest and save it to a file (e.g.,example-app.yaml):
- Replace
YOUR_ORG_NAMEwith your actual Control Plane org name
- GVC named
freshinaws-eu-central-1 - Workload with a serverless container
- Identity for cloud access
- Policy for permissions
- Secret for credentials
- Additional resources (agent, domain, ipset)
Connecting to the ArgoCD UI
To access the ArgoCD UI, retrieve the admin password and port-forward the service:https://localhost:18081. Accept the self-signed certificate and log in with username admin and the password from the command above.
Secrets handling
For security reasons, secret data must be stored using a native Kubernetes Secret object, not a custom resource. This makes secrets slightly different from other resource types.The
app.kubernetes.io/managed-by: cpln-operator label is required for the operator to manage the secret. Secrets without this label are ignored.Uninstalling
Remove operator credentials
Remove the authentication secret:Remove the operator
Remove cert-manager (optional)
If you no longer need cert-manager:Troubleshooting
Operator pods not starting
Operator pods not starting
Check cert-manager is running:Verify webhook certificates:
Resources not syncing
Resources not syncing
Check operator logs:Verify the authentication secret exists (look for a secret named after your org):If the secret for your org doesn’t exist, run the
cpln operator install command to create it.Permission denied errors
Permission denied errors
Ensure the service account has appropriate permissions in Control Plane. Check which group and/or policy the service account belongs to and verify it has the necessary permissions.To reconfigure authentication, run the
cpln operator install command which will create a service account and add it to the superusers group.CRD validation errors
CRD validation errors
View the full resource spec available for each CRD:
Namespace doesn't exist
Namespace doesn't exist
Create the controlplane namespace: