Everything is owned by this chart except kuberay-operator.*, which passes through to the
KubeRay operator chart (1.3.0).
Value Default Purpose image.repositoryrayproject/rayUsed for both head and workers. image.tag2.43.0Ray version. Written verbatim into the RayService’s rayVersion, so tag custom images with the plain Ray version.
For production, build a custom image with your model code — see
Deploying models . Notebook environments must match this version;
see Connecting from Jupyter .
Value Default Purpose head.resources.requestscpu: 1, memory: 2Gi— head.resources.limitscpu: 2, memory: 4Gi— head.runtimeClassNameunset e.g. nvidia. head.containerEnv[]Extra environment variables. head.tolerations[]Extra tolerations; an nvidia.com/gpu one is injected automatically when the GPU resource is requested. head.readinessProbe{}Empty means KubeRay’s built-in probe applies. head.livenessProbe{}Same.
Value Default Purpose worker.replicas1Worker pods. worker.minReplicas1Lower clamp on replicas. Pinned to 1 in values.yaml — it does not follow replicas. worker.maxReplicas1Upper clamp on replicas. Same caveat; leave it below replicas and you get maxReplicas workers. worker.resources.requestscpu: 1, memory: 2Gi— worker.resources.limitscpu: 2, memory: 4Gi— worker.runtimeClassNameunset e.g. nvidia. worker.containerEnv[]Extra environment variables. worker.tolerations[]As above. worker.readinessProberaylet healthz Overrides KubeRay’s Serve-dependent default. worker.livenessProberaylet healthz Same command; longer thresholds.
{} does not suppress a probe
Helm’s deep merge keeps existing keys when overlaying with an empty map. Use null (~) to
fall back to KubeRay’s default. Full rationale in Scaling and GPUs .
Always set replicas, minReplicas, and maxReplicas together
The chart does not enable enableInTreeAutoscaling, so there is no Ray autoscaler and the
group size is exactly replicas — clamped into [minReplicas, maxReplicas] by KubeRay.
Since values.yaml pins both bounds to 1, raising replicas alone changes nothing. See
Scaling and GPUs .
Value Default Purpose serve.proxyLocationEveryNodeEveryNode, HeadOnly, or Disabled.serveApplications[]Applications, serialized into serveConfigV2.
Each entry needs a name and an import_path resolvable inside the image. route_prefix
is optional — it defaults to /, which means you must set it explicitly once you have more
than one application. Anything else valid in
Ray Serve’s config schema
is passed through. See Deploying models .
Value Default Purpose nebariapp.enabledfalseRender NebariApp resources. nebariapp.hostnameunset Serve endpoint hostname. Required for the serve NebariApp. nebariapp.serve.enabledfalseExpose the serve endpoint externally. nebariapp.dashboard.enabledtrueCreate a NebariApp for the dashboard. nebariapp.dashboard.hostnameunset Required when the dashboard is enabled — the render fails without it.nebariapp.dashboard.landingPage.*disabled Landing-page tile; dashboard only. nebariapp.service.name""Overrides the backend service for both resources. nebariapp.service.servePort8000— nebariapp.service.dashboardPort8265— nebariapp.gatewaypublicpublic or internal; applies to both.
The two hostnames behave differently when missing
dashboard.hostname uses required, so its absence fails the Helm render with a clear
message. nebariapp.hostname does not — the serve NebariApp is simply not rendered, with
no error. See Deploying on Nebari .
service.name overrides both
Set it and both the serve and dashboard NebariApps point at the same service. Leave it
empty and each uses its correct default (-serve-svc and -head-svc respectively) — which
is almost always what you want.
Value Default Purpose auth.enabledfalseOIDC at the gateway, for both resources. auth.providerkeycloak— auth.provisionClienttrueOperator creates the Keycloak client. auth.redirectURI/oauth2/callbackEnvoy Gateway rejects a bare /. auth.scopesopenid, profile, email—
Auth is all-or-nothing across both endpoints.
Value Default Purpose orgCABundle.configMapName""ConfigMap with key ca.crt. Empty disables injection entirely. orgCABundle.initImagealpine:3.20Needs only sh and cat.
Read Organization CA bundle before enabling this under Argo CD — the example
sync policy can silently drop the injection.
Value Default Purpose kuberay-operator.enabledtrueInstall the operator with the chart. Set false when one already runs cluster-wide. nameOverride""Changes the chart name in the fullname helper — and therefore both Service names. fullnameOverride""Same, more directly.
Name overrides change the Service names
-head-svc and -serve-svc are both derived from the fullname helper, and the NebariApp
defaults follow it. Notebook connection strings are not — anything hardcoding a service
name has to be updated too.
repository : your-registry/your-ray-image
requests : { cpu : " 2 " , memory : " 8Gi " }
limits : { cpu : " 4 " , memory : " 16Gi " }
requests : { cpu : " 4 " , memory : " 16Gi " }
limits : { cpu : " 8 " , memory : " 32Gi " , nvidia.com/gpu : 1 }
import_path : myapp.model:app
hostname : ray-dashboard.example.com
helm dependency update chart # once — templating fails without the kuberay-operator subchart
helm template rayserve chart --set nebariapp.enabled= true \
--set nebariapp.dashboard.hostname=ray-dashboard.example.com | less
helm -n rayserve get values rayserve
helm -n rayserve get values rayserve --all