Last Updated: Dec 25, 2025
Introduction
When deploying the Crusoe Load Balancer Controller using Helm on self-managed Kubernetes clusters, you may encounter an error related to a missing secret key:
Error: couldn't find key CRUSOE_CLUSTER_ID in Secret crusoe-system/crusoe-secrets
This error occurs because self-managed clusters do not use CMK, and therefore do not have a CRUSOE_CLUSTER_ID. The Helm chart expects this key unless you provide an alternative: the CRUSOE_SUBNET_ID.
This guide explains how to resolve this issue and deploy the controller successfully.
Prerequisites
Before starting, make sure you have:
A running self-managed Kubernetes cluster
kubectl configured for your cluster
Helm 3+ installed
Access to your Crusoe API Keys and Project ID
Your Subnet ID from the Crusoe infrastructure
Step-by-Step Instructions
-
Confirm the Error
-
After installing the Helm chart using the Crusoe Load Balancer Controller Helm Chart guide, check the pod status. It will show a CreateContainerConfigError error.
$ kubectl get pods -n crusoe-system -l app=crusoe-lb-controller NAME READY STATUS RESTARTS AGE crusoe-lb-controller-crusoe-lb-controller-xxxxx 0/1 CreateContainerConfigError 0 28s -
Describe the pod to check the specific error.
$ kubectl describe pods crusoe-lb-controller-crusoe-lb-controller-xxxxx -n crusoe-system -
You'll likely see the following error
Warning Failed xx kubelet Error: couldn't find key CRUSOE_CLUSTER_ID in Secret crusoe-system/crusoe-secrets
-
-
Modify
values.yamlto RemoveCRUSOE_CLUSTER_IDand AddCRUSOE_SUBNET_ID-
Open
values.yamllocated at/crusoe-load-balancer-controller-helm-charts/charts/crusoe-lb-controllerand make the following changes:crusoe: secrets: crusoeApiKeys: # The Crusoe LB Controller requires access to the Crusoe API in order to manage load balancer resources. # It is expected that the secret will contain two keys at accessKeyPath and secretKeyPath containing # the base64 encoded access key and secret key respectively. secretName: "crusoe-secrets" accessKeyPath: "CRUSOE_ACCESS_KEY" secretKeyPath: "CRUSOE_SECRET_KEY" # clusterIdPath: "CRUSOE_CLUSTER_ID" ### COMMENT OR REMOVE THIS projectIdPath: "CRUSOE_PROJECT_ID" controller: namespace: crusoe-system image: repository: ghcr.io/crusoecloud/crusoe-load-balancer-controller tag: "latest" pullPolicy: Always imagePullSecrets: [] env: CRUSOE_API_ENDPOINT: "https://api.crusoecloud.com/v1alpha5" # subnet_id is optional if using a cmk cluster but required for self-managed clusters CRUSOE_SUBNET_ID: "<subnet-id>" ### ADD YOUR SUBNET ID HERE -
NOTE: The
CRUSOE_SUBNET_IDis mandatory for self-managed clusters and overrides the need forCRUSOE_CLUSTER_ID. In the templates/controller.yaml file, you will observe that Cluster ID is only required when Subnet ID is not provided.
-
-
Re-deploy the Controller
-
Upgrade the Helm release with your updated values
$ helm upgrade --install crusoe-lb-controller ./crusoe-lb-controller --namespace crusoe-system -
Now check the pod status again. It should be Running.
$ kubectl get pods -n crusoe-system -l app=crusoe-lb-controller NAME READY STATUS RESTARTS AGE crusoe-lb-controller-crusoe-lb-controller-xxxxx 1/1 Running 0 12s
-
Example
Successful Pod Describe Output should show that the Pod and Container status is Running.
$ kubectl describe pods crusoe-lb-controller-crusoe-lb-controller-xxxxx -n crusoe-system
Status: Running
....
....
Containers:
crusoe-lb-controller:
....
....
State: Running
Started: Thu, 18 Sep 2025 10:45:27 -0700
You will also see the following under Environment:
CRUSOE_API_ENDPOINT: https://api.crusoecloud.com/v1alpha5
CRUSOE_SUBNET_ID: <your-subnet-id>
CRUSOE_ACCESS_KEY: <set to key in secret>
CRUSOE_SECRET_KEY: <set to key in secret>
CRUSOE_PROJECT_ID: <set to key in secret>
CRUSOE_CLUSTER_ID: <empty>Additional Resources