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
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.
- kind
- minikube
Installation
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:See the CLI reference for available options.
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):
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:
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):
- 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.
Uninstalling
Remove operator credentials
Remove the authentication secret:Remove the operator
Remove cert-manager (optional)
If you no longer need cert-manager:Preventing resource deletion
Deleting a Kubernetes CRD while the operator is running will remove the corresponding resource from Control Plane. To prevent this, add thecpln.io/resource-policy: keep annotation:
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:
Secret CRD not syncing
Secret CRD not syncing
Secrets use native Kubernetes Secret objects with special labels, not CRDs. See the secrets handling documentation for the correct format and required labels.