Installation¶
One Helm chart installs the whole control plane. This page covers the knobs that matter; the full value list is in Chart values.
The chart¶
The chart is published as a versioned, signed OCI artifact on every release:
helm install kubespaces oci://ghcr.io/kubespaces-io/charts/kubespaces \
--namespace kubespaces --create-namespace \
--set operator.enabled=true
Pin a specific release with --version X.Y.Z (recommended for production).
Verify the chart signature before installing — see
Verifying what you run.
From a source checkout
To install from a clone (e.g. a development branch), point Helm at the local path instead:
What the default install contains¶
| Component | Default | Production guidance |
|---|---|---|
| API | ✅ | — |
| Web portal | ✅ | — |
| Tenant operator | opt-in (operator.enabled=true) |
enable it; it is the product |
| PostgreSQL | ✅ built-in StatefulSet, official postgres image |
point at managed Postgres: postgresql.enabled=false + externalDatabase.* |
| Keycloak | ✅ built-in, dev mode, realm auto-imported | bring your own OIDC: keycloak.enabled=false + oidc.* — the bundled instance is for evaluation only |
There are no Bitnami subcharts — the built-ins are minimal StatefulSets on official images, designed to be swapped out, not scaled up.
Profiles¶
The examples/ directory ships three values profiles:
values-kind-demo.yaml— the Quickstart tiervalues-gke-test.yaml— a real cluster with tenant API + app exposure enabled (the configuration the E2E suite runs against)values-production.yaml— external Postgres, external OIDC, real ingress
Enabling tenant exposure¶
Public tenant endpoints require one-time host-cluster preparation (Gateway API implementation, shared Gateways, DNS, cert-manager) — the full runbook is Host cluster preparation. Once prepared:
operator:
enabled: true
tenantApi:
domain: example.com
gateway: {name: kubespaces-api, namespace: kubespaces-system, sectionName: apipassthrough}
tenantApps:
domain: example.com
gateway: {name: kubespaces-apps, namespace: kubespaces-system}
clusterIssuer: letsencrypt-dns01
Leave these empty and KubeSpaces runs in evaluation mode (port-forward access) — nothing else changes.
Verifying what you run¶
Every image is built by GitHub Actions and signed with cosign (keyless, GitHub OIDC identity). Verify before trusting:
cosign verify ghcr.io/kubespaces-io/operator:0.2.0 \
--certificate-identity-regexp \
'^https://github.com/kubespaces-io/kubespaces/.github/workflows/build.yml@refs/tags/v.*$' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
The umbrella chart is signed the same way — verify it before installing:
cosign verify ghcr.io/kubespaces-io/charts/kubespaces:0.8.0 \
--certificate-identity-regexp \
'^https://github.com/kubespaces-io/kubespaces/.github/workflows/build.yml@refs/tags/v.*$' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
SBOMs (syft) ship with every release artifact. The vCluster chart the
operator installs is pinned and mirrored at
oci://ghcr.io/kubespaces-io/charts/vcluster — upstream changes can never
break existing installs. Details: Security.
Upgrading¶
One version line: a vX.Y.Z tag releases the images and the CLI together.
Watch the changelog;
pre-1.0, minor versions may break (see
RELEASING.md).