Skip to main content
This path is for teams comfortable with Kubernetes who want to install Cake Agents directly with Helm into an existing cluster.

End State

At the end of this guide you will have:
  • a cake-agents Helm release deployed to your cluster
  • a reachable control plane UI/API
  • a database connection (embedded Postgres for development or an external database)
  • session pods launching successfully in the expected namespace

Architecture Summary

Cake Agents Architecture Cake Agents has two runtime layers:
  • The control plane is a web application deployed as a standard Kubernetes workload.
  • Each user session launches a data plane pod that runs OpenCode inside the cluster.
The chart also manages supporting pieces such as RBAC, optional embedded PostgreSQL, optional Istio resources, and integration secrets.

Prerequisites

  • A working Kubernetes cluster
  • kubectl configured for the target cluster
  • helm 3+
  • A DNS name for the control plane
  • An ingress controller or API gateway configured to route traffic to the control plane (e.g. Istio, Nginx, ALB, etc.)
  • Kubernetes secrets or secret-management flow for integration credentials
  • Optionally, a preexisting Postgres database

What the Helm Chart Configures

The Helm install configures these main concerns:
  • Control plane deployment, service account, probes, and service
  • RBAC for creating and managing session workloads
  • Embedded PostgreSQL for development, or an external database via externalDatabase.existingSecret
  • Secret wiring for integrations and auth

Set up DNS

Cake Agent’s control plane needs to be reachable at a stable DNS name. This is used for user linking flows and should match the controlPlane.host value in the Helm chart.

Choose a Database Strategy

For development, the chart defaults to embedded PostgreSQL. For shared or production-like environments, use an external database and provide a secret instead:
If manually provisioning this secret, you may want to first create the namespace.
Then apply a secret manifest that looks like this:

Set up an auth client

Cake Agents uses OIDC for authentication. You can use any compliant provider, or delegate auth to an authenticating proxy via trusted headers. In your OIDC provider, create a new client with these settings:
  • Client type: Confidential or Public (with PKCE)
  • Redirect URI: https://<controlPlane.host>/api/auth/callback/oidc
  • Scopes: openid email profile
Export the client ID and secret for the next step. If using a public client, you can omit the secret.

Minimal Values File

Start from a small values file and expand from there:

Install with Helm

If manually installing, you’ll need to first assume an identity in your AWS account that has permissions to pull the control plane. Then, you can log into ECR and use that to authenticate helm to Cake’s private registry. For example:
Then you can install the chart with your values file:
Once you’re installed, you’ll need to configure your ingress or gateway to route traffic to the control plane service. If using Istio, you can enable the built-in gateway configuration in the chart and point your DNS at the gateway’s external IP. After you can reach the control plane in the browser, you’re ready to set up integrations:

Optional: S3 object storage

The control plane can optionally use an S3-compatible bucket for object storage. This is disabled by default; enable it when a feature you use requires durable object storage. Set the s3.* values to bootstrap the connection:
Credentials are resolved by the AWS SDK’s default provider chain, so use whichever flow fits your cluster:
  • An IAM role attached to the control plane service account (IRSA on EKS, Workload Identity on GKE)
  • Standard AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY env vars supplied via controlPlane.deployment.extraEnv
If s3.region or s3.endpoint are unset, the control plane also accepts the standard AWS_REGION and AWS_ENDPOINT_URL_S3 env vars.

Optional: Session pod resources

Each session runs in its own data plane pod. By default, the control plane requests 640Mi of memory for every new session container so the Kubernetes scheduler places sessions on nodes with enough headroom. Set dataPlane.resources to change this. The value accepts a full Kubernetes resource requirements block, so you can set both requests and limits:
Changes apply to sessions created after the Helm upgrade. Existing session pods keep the resources they were created with.

Values Reference