Kubernetes
Kubernetes and Helm requirements for Scrydon deployments
Before deploying Scrydon, ensure your cluster meets the Kubernetes requirements below.
-
Version: Kubernetes 1.28 or later. The chart enforces this;
helm installrefuses clusters below 1.28. -
Helm: Helm 3.14 or later.
-
A namespace-scoped service account with permissions to create Deployments, Services, Gateways, HTTPRoutes, Secrets, and ConfigMaps.
-
At least two nodes for the full default stack. The control plane, databases, and apps starting together on a single small node can OOM-kill pods during the cold-start storm. See Resources.
-
A default StorageClass, or
global.storageClassset explicitly. Every PVC the chart creates isReadWriteOnce; without a usable class they stayPendingand the install appears to hang. -
linux/amd64nodes. Platform images are published for amd64 only — an arm64 node pool (AWS Graviton, Azure Ampere, Ampere/Raspberry-class on-prem) fails withexec format error. -
The Gateway API CRDs and a GatewayClass. The chart's edge is
Gateway+HTTPRoute(gateway.networking.k8s.io), notIngress— and unlike Ingress, neither the CRDs nor an implementation is present in a stock cluster. Either install one yourself and setgateway.classNameto its GatewayClass, or settraefik.enabled: trueand the chart installs a Traefik release that brings the CRDs and publishes thetraefikGatewayClass. The HTTPS redirect, the Dapr identity-header strip and path precedence are core Gateway API and work on any conforming implementation; the one Traefik-only control isgateway.publicAuthRateLimit. See Other Gateway API implementations.Kubernetes Ingress is frozen, not deprecated: it is GA, keeps its stability guarantees and is not being removed, but it gets no further development and Kubernetes recommends the Gateway API instead. Note that
ingress-nginxwas retired — archived on 2026-03-24 with no further releases, bugfixes, or security fixes — so it is not a supported route into a Scrydon cluster.Whatever you run, check
gateway.listenerPorts.*: it is the port your controller listens on, not the public port. Traefik binds:8000/:8443internally (the chart default) while its Service publishes 80/443; a managed implementation that listens on the public port wants 80/443 there instead. -
Outbound HTTPS to
license.scrydon.com, or offline licensing. The defaultlicense.mode: onlinerevalidates every 24 h and falls back to a 30-day grace period before stopping. Egress-restricted or disconnected clusters use-f helm/scrydon/values.airgapped.yaml(license.mode: offline).
Not currently supported without additional work: OpenShift — the bundled data
services and the migration Jobs run as root and the Postgres pod needs a
runAsUser: 0 init container, so they require SCC exceptions beyond
restricted-v2. Point the chart at external data services, or contact us.
The runtime plane (isolated compute)
The runtime plane runs customer code — Agent steps and notebook kernels — in isolated pods. It is
off by default (runtimePlane.enabled: false) because enabling it safely requires cluster
capacity and policy decisions the chart cannot make for you.
What that means per feature:
| Feature | With the runtime plane disabled |
|---|---|
| Agent steps in workflows | Run in-process and audited, provided nobody explicitly required isolation and the host has no /dev/kvm. An organization that turns on Require isolated execution, or a deployment that pins it, fails closed instead. |
| Marimo notebook compute | Unavailable. Notebooks still open and edit, but Connect fails with Compute could not start. There is deliberately no fallback onto the Analytics host. |
Notebook compute has no in-process fallback. If your users need notebooks, the runtime plane is a hard requirement, not optional hardening — plan the node pool below before you promise the feature.
What enabling it requires
- Dapr enabled for both the platform and runtime plane. It is the authenticated control path.
- A CNI that enforces Kubernetes NetworkPolicy, with
networkPolicies.enabled: true. - Separate controller and hostile-workload namespaces, plus a reviewed admission exception for
the root, capability-limited egress-enforcer sidecar (
NET_ADMINandNET_BIND_SERVICEonly), while the untrusted application remains non-root with all capabilities dropped. - Cluster-pullable runner and enforcer images, pinned by digest. The runtime plane refuses
empty, untagged, or
latestreferences. Released charts carry these digests; ifruntimePlane.marimoRuntimeImage/enforcerImage/runnerImageare empty in your chart, set them explicitly before enabling. - A schedulable Kata RuntimeClass backed by KVM/nested virtualization, for the microVM tier.
A RuntimeClass object alone is not capability proof: verify that a Ready eligible node can run
the workload, and check the runtime plane's boot capability report. On AKS this means a
separate Pod Sandboxing node pool —
--workload-runtime KataVmIsolationwith--os-sku AzureLinux(the only supported SKU) and a Gen2, nested-virtualization VM size. It cannot be turned on for an existing pool. KeepruntimePlane.isolation.microvm.renderRuntimeClass: false, because AKS registers its ownkata-vm-isolationRuntimeClass and rendering a second one conflicts. The Runtime Plane discovers that class and a compatible Ready, uncordoned node at boot. - Capacity for the workloads themselves. Each interactive notebook runtime reserves ~5.6 GiB and each notebook job ~4.25 GiB; see Resources.
Set executionFabric.managedProcess.enabled: false when the deployment must be physically
microVM-only. When the managed backend is deployed, it is used only after MicroVM is unavailable
and an organization admin turns off Require isolated execution. There is no
hardened-container product tier.