Cluster
- Kubernetes. Any reasonably recent version. The chart uses only stable core APIs (
apps/v1,policy/v1,v1) and has no CEL, admission webhooks, or version-gated features. - A default
StorageClass. The chart provisions engine and PostgreSQL PVCs withoutstorageClassNameand falls back to the cluster default. To pick a specific class, setengines[].storage.storageClassNameper engine orengineSpec.defaultStorage.storageClassNamechart-wide. - Object storage for engine managed data. Engines run against a dedicated Metadata Service and refuse to start against a local filesystem. You must point
customEngineConfig.storageat object storage before the engine becomes ready. See Object Storage.
Engine node requirements
Engine pods inherit their locked-memory (memlock) limit from the node’s container runtime, and engines need at least 8 GiB. Engines lock memory for io_uring at startup. The default on many managed node images, around 8 MiB, is far too low. When the limit is too low, the engine crashes during startup with an error like this:
engineSpec.memlockSetup: true (the default), the chart injects a memlock-setup sidecar that raises the engine pod’s memlock limit at runtime, so no node configuration is required. See Memlock-setup sidecar.
When you set engineSpec.memlockSetup: false, the sidecar is gone and every node that runs an engine must provide the limit itself. The rest of this section covers that path. Raise memlock on the container runtime (containerd) with a systemd drop-in:
infinity is simplest. A bounded value such as LimitMEMLOCK=8G also works, as long as it is at least 8 GiB. After you write the drop-in, reload systemd, restart containerd, and confirm the limit:
Amazon EKS and Karpenter
Add the drop-in through your managed node group’s launch template user data, so each node configures itself before it registers. Include the following as a shell-script part of the launch template’s MIME multipart user data:spec.userData of your EC2NodeClass.
Google GKE
GKE node system configuration does not exposememlock, so apply the drop-in with a privileged DaemonSet that writes it to each node and restarts containerd. The DaemonSet reapplies it to new nodes as they join, which covers upgrades and autoscaling:
containerd also restarts this pod, and the check lets the replacement pod skip a second restart once the limit is already in place.
GKE Autopilot blocks privileged DaemonSets, so you cannot use this approach there directly. Either request a privileged-workload allowlist (--autopilot-privileged-admission), or run your engine node pool on GKE Standard.
Microsoft Azure (AKS)
AKS does not exposeLimitMEMLOCK through its supported node configuration, so apply the same privileged DaemonSet shown for Google GKE, or bake the drop-in into a custom node image. Either way, it reapplies automatically to nodes added by node image upgrades and cluster autoscaling, so you do not have to configure nodes by hand.
Local tooling
helmv3.kubectlmatching your cluster version.makeif you intend to use the chart’s Makefile targets such asmake install,make upgrade, andmake test.
Optional
- Prometheus Operator CRDs. Required only if you set
podMonitor.engines.enabledorpodMonitor.gateway.enabled. The chart rendersmonitoring.coreos.com/v1PodMonitorresources gated on those values. - A private image registry. The chart pulls engine and metadata images from
ghcr.io/firebolt-dbby default. To mirror through your own registry, see Image overrides.