# OpenShell Helm Chart > **Experimental** - the Kubernetes deployment path is under active development. Expect rough edges and breaking changes. This chart deploys the OpenShell gateway into a Kubernetes cluster. It is published as an OCI artifact to GHCR at `oci://ghcr.io/nvidia/openshell/helm-chart`. ## Prerequisites The Kubernetes Agent Sandbox CRDs and controller must be installed on the cluster before deploying OpenShell. Install them with: ```shell kubectl apply -f https://github.com/kubernetes-sigs/agent-sandbox/releases/latest/download/manifest.yaml ``` ## Install on Kubernetes ```shell helm install openshell oci://ghcr.io/nvidia/openshell/helm-chart --version ``` ## Install on OpenShift See the full [OpenShift install guide](https://docs.nvidia.com/openshell/latest/kubernetes/openshift) for details. Quick start: ```shell # Precreate the openshell namespace so we can create the SCC cluster role oc create ns openshell # Sandboxes are deployed into the openshell namespace and use the openshell-sandbox service account oc adm policy add-scc-to-user privileged -z openshell-sandbox -n openshell # Deploy openshell with overrides to allow SCC assignment of fsGroup and runAsUser for the gateway helm install openshell oci://ghcr.io/nvidia/openshell/helm-chart --version -n openshell \ --set server.disableTls=true \ --set podSecurityContext.fsGroup=null \ --set securityContext.runAsUser=null ``` ## Available versions | Tag | Source | Notes | | --- | --- | --- | | `` (e.g. `0.6.0`) | Tagged GitHub release | Tracks the matching gateway and supervisor image versions. Recommended for production. | | `0.0.0-dev` | Latest commit on `main` | Floating tag, overwritten on every push. `appVersion` is `dev`, so images resolve to the `:dev` tag. | | `0.0.0-dev.` | A specific commit on `main` | Per-commit pin. Chart version and `appVersion` both use the full 40-character commit SHA, which matches the image tag pushed by CI. | The `dev` tags are intended for testing changes ahead of a release. Production deployments should pin to a tagged release. ## Configuration See [`values.yaml`](values.yaml) for source defaults. Selected overlays: - [`ci/values-gateway.yaml`](ci/values-gateway.yaml) - gateway-only configuration - [`ci/values-cert-manager.yaml`](ci/values-cert-manager.yaml) - cert-manager integration - [`ci/values-keycloak.yaml`](ci/values-keycloak.yaml) - Keycloak OIDC integration - [`ci/values-high-availability.yaml`](ci/values-high-availability.yaml) - CI overlay for multi-replica external PostgreSQL testing - [`ci/values-spire.yaml`](ci/values-spire.yaml) - SPIFFE/SPIRE provider token grants - [`ci/values-spire-stack.yaml`](ci/values-spire-stack.yaml) - SPIRE hardened chart values for local development ### Database backend By default, OpenShell uses SQLite and runs the gateway as a StatefulSet so the database is backed by a per-pod PVC: ```yaml server: dbUrl: "sqlite:/var/openshell/openshell.db" ``` #### External PostgreSQL Use external PostgreSQL when the gateway should connect to a database managed outside this chart. The OpenShell chart does not deploy a database; install PostgreSQL separately using the chart, operator, or managed service that fits your environment, then pass the connection URI through a Secret. Create a Secret containing the PostgreSQL connection URI if one does not already exist: ```bash kubectl create secret generic my-pg-credentials -n openshell \ --from-literal=uri="postgresql://user:pass@host:5432/dbname" ``` Then install the chart pointing at that Secret: ```bash helm install openshell oci://ghcr.io/nvidia/openshell/helm-chart --version \ -n openshell \ --set workload.kind=deployment \ --set server.externalDbSecret=my-pg-credentials ``` Use `workload.kind=deployment` for external database-backed multi-replica gateways. `workload.kind=statefulset` is still available for single-replica SQLite installs and for operators who explicitly need StatefulSet identity or storage semantics. #### OpenShift Append these flags to any of the PostgreSQL commands above for OpenShift: ``` --set server.disableTls=true \ --set podSecurityContext.fsGroup=null \ --set securityContext.runAsUser=null ``` ## Secret bootstrap By default, a pre-install/pre-upgrade hook Job runs `openshell-gateway generate-certs` to create the gateway's server/client mTLS Secrets and sandbox JWT signing Secret. The Job uses the gateway image itself, so air-gapped environments only need to mirror that one image (no separate openssl/alpine sidecar). When `certManager.enabled=true`, cert-manager owns the TLS Secrets and the chart runs the same hook in JWT-only mode because cert-manager does not create the sandbox JWT signing Secret. This precedence applies even if `pkiInitJob.enabled` remains true. Set `pkiInitJob.enabled=false` only when an external non-cert-manager TLS source manages TLS and you pre-create the sandbox JWT signing Secret. ## SPIFFE/SPIRE provider token grants Set `server.providerTokenGrants.spiffe.enabled=true` to let sandbox supervisors use SPIFFE JWT-SVIDs for dynamic provider token grants. The chart keeps supervisor-to-gateway authentication on gateway-minted sandbox JWTs and passes the SPIFFE Workload API socket path to the Kubernetes driver so sandbox pods can mount the SPIFFE CSI socket. For local development, uncomment the SPIRE Helm releases in `skaffold.yaml` and add `ci/values-spire.yaml` to the OpenShell release values files. {{ template "chart.valuesSection" . }} {{ template "helm-docs.versionFooter" . }}