Skip to content

feat(helm/raySpec): allow customizing the Ray head node readiness probe (#742)#986

Open
Anai-Guo wants to merge 1 commit into
vllm-project:mainfrom
Anai-Guo:fix/ray-head-customizable-readiness-probe
Open

feat(helm/raySpec): allow customizing the Ray head node readiness probe (#742)#986
Anai-Guo wants to merge 1 commit into
vllm-project:mainfrom
Anai-Guo:fix/ray-head-customizable-readiness-probe

Conversation

@Anai-Guo

@Anai-Guo Anai-Guo commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes #742.

The multi-node Ray head pod hard-codes its readiness probe in helm/templates/ray-cluster.yaml:

readinessProbe:
  httpGet:
    path: /health
    port: {{ include "chart.container-port" . }}
  failureThreshold: 1
  periodSeconds: 10

With failureThreshold: 1 and periodSeconds: 10, a single failed probe marks the head pod unready. On large multi-node deployments the head serving process can take longer than one 10s period to begin answering /health, so the pod flips to unready and never receives traffic (Readiness probe failed: ... connect: connection refused). As reported in #742, there was no way to relax it — setting readinessProbe under servingEngineSpec, modelSpec, or raySpec.headNode had no effect on the head node.

Change

Honor raySpec.headNode.readinessProbe when set, rendered verbatim via toYaml, and fall back to the existing default otherwise:

readinessProbe:
  {{- if $modelSpec.raySpec.headNode.readinessProbe }}
  {{- toYaml $modelSpec.raySpec.headNode.readinessProbe | nindent 14 }}
  {{- else }}
  httpGet:
    path: /health
    port: {{ include "chart.container-port" . }}
  failureThreshold: 1
  periodSeconds: 10
  {{- end }}
  • Backward compatible: with the field unset the rendered output is byte-identical to before.
  • Documents the field with an example in values.yaml.
  • No values.schema.json change: raySpec.headNode is an open object in the schema (no additionalProperties: false), and the schema is generated from values.yaml in CI, so hand-editing it would just be reverted by the generator.

Example

raySpec:
  headNode:
    requestCPU: 16
    requestMemory: "32Gi"
    requestGPU: 2
    readinessProbe:
      httpGet:
        path: /health
        port: 8000
      failureThreshold: 10
      periodSeconds: 30

Notes

I don't have a multi-node GPU cluster to reproduce end-to-end, so I verified the template logic and the values change by inspection. helm template with the field set renders the overriding probe; with it unset it renders the original default unchanged.

🤖 Generated with Claude Code

@Anai-Guo Anai-Guo force-pushed the fix/ray-head-customizable-readiness-probe branch from 91acc54 to b09ee8c Compare July 1, 2026 16:26

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the ability to configure a custom readiness probe for the Ray head node in the Helm chart, updating the template, schema, and values files. The review feedback suggests guarding the nested field access in the Helm template with an 'and' condition to prevent potential nil pointer evaluation errors if 'headNode' is undefined.

- name: {{ include "chart.container-port-name" . }}
containerPort: {{ include "chart.container-port" . }}
readinessProbe:
{{- if $modelSpec.raySpec.headNode.readinessProbe }}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

To prevent potential template rendering errors (such as nil pointer evaluating interface{}), it is safer to guard the nested field access by checking if headNode is defined before accessing readinessProbe.

              {{- if and $modelSpec.raySpec.headNode $modelSpec.raySpec.headNode.readinessProbe }}

The multi-node Ray head pod hard-codes its readiness probe to
failureThreshold: 1 / periodSeconds: 10. On slow, large multi-node
deployments the head serving process can take longer than a single 10s
period to start answering /health, so the pod is marked unready after the
first failed probe and never receives traffic. Users had no way to relax
it -- setting readinessProbe under servingEngineSpec, modelSpec, or
raySpec.headNode had no effect on the head node.

Honor raySpec.headNode.readinessProbe when set (rendered verbatim via
toYaml), falling back to the existing default otherwise, so behavior is
unchanged unless the field is provided. Document the new field in
values.yaml. headNode is an open object in values.schema.json, so no
schema change is needed (and the schema is CI-generated from values.yaml).

Fixes vllm-project#742.

Signed-off-by: Anai-Guo <antai12232931@outlook.com>
@Anai-Guo Anai-Guo force-pushed the fix/ray-head-customizable-readiness-probe branch from b09ee8c to 114c458 Compare July 1, 2026 16:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Readiness probe for multi-node setup cannot be customized and might make the Ray head pod unready

1 participant