Repository navigation
fix(openclaw): tune probe timeouts and rollback admins to beta.1 - #55
Conversation
admins-openclaw on 2026.4.28-beta.2 crash-looped (9 restarts in 35min).
kubectl describe surfaced "Startup probe failed: context deadline exceeded
on /healthz" — k8s default timeoutSeconds=1 is too tight for the openclaw
gateway: plugin install + first response can stall the Node event loop
past 1s, especially while model-pricing fetch (30s) is running. base-service
chart template never rendered timeoutSeconds for any probe, so all three
tenants were vulnerable.
Why these changes:
- helm-charts/base-service: render timeoutSeconds for startup/liveness/
readiness, plus failureThreshold for liveness/readiness. Defaults match
k8s defaults (1s / 3 failures), so no behaviour change for other charts.
- services/{admins,labs,ovk}/openclaw: explicit timeoutSeconds (3s startup
& readiness, 5s liveness) and roomier failureThresholds. Liveness period
raised 20→30s with 60s initialDelay so the gateway has 150s slack on
transient stalls before kubelet kills it.
- services/admins/openclaw: pin image back to 2026.4.26-beta.1 (the tag
labs/ovk run) until we understand whether beta.2 introduced an extra
startup-time regression on top of the probe issue. Also fixes the
hardcoded beta.2 reference in the setup init container.
|
@codex review |
|
Codex Review: Didn't find any major issues. Breezy! ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
There was a problem hiding this comment.
Pull request overview
This PR addresses OpenClaw crash-looping caused by overly tight Kubernetes probe defaults by extending the shared base-service Helm chart to support probe timeout configuration, then tuning probe settings for the three OpenClaw tenants and rolling admins back to a known-good image tag.
Changes:
- Render
timeoutSecondsfor startup/liveness/readiness probes (andfailureThresholdfor liveness/readiness) in the base-service Deployment template. - Tune startup/readiness/liveness probe settings in admins/labs/ovk OpenClaw tenant values.
- Roll admins OpenClaw image +
OPENCLAW_VERSION(and a setup initContainer image reference) back to2026.4.26-beta.1.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| platform-gitops/helm-charts/base-service/templates/deployment.yaml | Adds probe fields (timeoutSeconds, plus failureThreshold for liveness/readiness) to rendered Deployment manifests. |
| platform-gitops/services/admins/openclaw/values.yaml | Rolls back admins image/version and applies expanded probe timings to avoid startup probe failures. |
| platform-gitops/services/labs/openclaw/values.yaml | Applies expanded probe timings consistent with the other OpenClaw tenants. |
| platform-gitops/services/ovk/openclaw/values.yaml | Applies expanded probe timings consistent with the other OpenClaw tenants. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| @@ -75,6 +76,8 @@ spec: | |||
| port: {{ .Values.probes.liveness.port }} | |||
| initialDelaySeconds: {{ .Values.probes.liveness.initialDelaySeconds }} | |||
| periodSeconds: {{ .Values.probes.liveness.periodSeconds }} | |||
| timeoutSeconds: {{ .Values.probes.liveness.timeoutSeconds | default 1 }} | |||
| failureThreshold: {{ .Values.probes.liveness.failureThreshold | default 3 }} | |||
| {{- end }} | |||
| {{- if .Values.probes.readiness }} | |||
| readinessProbe: | |||
| @@ -83,6 +86,8 @@ spec: | |||
| port: {{ .Values.probes.readiness.port }} | |||
| initialDelaySeconds: {{ .Values.probes.readiness.initialDelaySeconds }} | |||
| periodSeconds: {{ .Values.probes.readiness.periodSeconds }} | |||
| timeoutSeconds: {{ .Values.probes.readiness.timeoutSeconds | default 1 }} | |||
| failureThreshold: {{ .Values.probes.readiness.failureThreshold | default 3 }} | |||
| @@ -75,6 +76,8 @@ spec: | |||
| port: {{ .Values.probes.liveness.port }} | |||
| initialDelaySeconds: {{ .Values.probes.liveness.initialDelaySeconds }} | |||
| periodSeconds: {{ .Values.probes.liveness.periodSeconds }} | |||
| timeoutSeconds: {{ .Values.probes.liveness.timeoutSeconds | default 1 }} | |||
| failureThreshold: {{ .Values.probes.liveness.failureThreshold | default 3 }} | |||
| {{- end }} | |||
| {{- if .Values.probes.readiness }} | |||
| readinessProbe: | |||
| @@ -83,6 +86,8 @@ spec: | |||
| port: {{ .Values.probes.readiness.port }} | |||
| initialDelaySeconds: {{ .Values.probes.readiness.initialDelaySeconds }} | |||
| periodSeconds: {{ .Values.probes.readiness.periodSeconds }} | |||
| timeoutSeconds: {{ .Values.probes.readiness.timeoutSeconds | default 1 }} | |||
| failureThreshold: {{ .Values.probes.readiness.failureThreshold | default 3 }} | |||
Summary
2026.4.28-beta.2crash-looped (9 restarts in 35 min). Startup probe was failing on/healthzwithcontext deadline exceeded— k8s defaulttimeoutSeconds=1is too tight for openclaw's plugin install + Node event-loop blocking on model-pricing fetch.helm-charts/base-service/templates/deployment.yamlnever renderedtimeoutSecondsfor any probe, so all three openclaw tenants are vulnerable (admins/labs/ovk share probe config).timeoutSeconds(andfailureThresholdfor liveness/readiness, with k8s-default defaults so no behaviour change for other charts), (b) sets explicit roomier values in all three openclaw tenants, and (c) rolls admins back to2026.4.26-beta.1(the tag labs/ovk run) until we understand if beta.2 added a startup-time regression on top.Root cause (from
kubectl describe pod)Two failure modes during the ~78s startup:
connection refusedwhile plugins install (HTTP server not yet up)context deadline exceededonce HTTP is up but/healthzresponse > 1s due to event-loop stallChanges
platform-gitops/helm-charts/base-service/templates/deployment.yamltimeoutSecondsfor startup/liveness/readiness +failureThresholdfor liveness/readiness. Defaults preserve k8s defaults (1s, 3) — non-breaking for other charts.platform-gitops/services/admins/openclaw/values.yaml2026.4.28-beta.2→2026.4.26-beta.1(incl. setup init container hardcode +OPENCLAW_VERSION). New probe values (see below).platform-gitops/services/labs/openclaw/values.yamlplatform-gitops/services/ovk/openclaw/values.yamlNew probe config (synced across admins/labs/ovk):
startup:timeoutSeconds: 3,failureThreshold: 36(5 + 36×5 = 185s, ≈2.4× current ~78s startup)readiness:timeoutSeconds: 3,failureThreshold: 3liveness:initialDelaySeconds: 60,periodSeconds: 30,timeoutSeconds: 5,failureThreshold: 5(150s tolerance for transient event-loop stalls)Test plan
helm templatefor all three tenants — confirmed probes render with new fields and only:2026.4.26-beta.1image references for adminskubectl -n admins get pod -l app.kubernetes.io/instance=admins-openclaw -w→2/3 → 3/3, RestartCount stays 0 after warm-upkubectl -n admins describe pod ... | grep -E 'Startup|Liveness|Readiness'→ new timeouts visiblemctl_get_service_status team=admins service=openclaw→Healthymctl_get_service_logs team=admins service=openclaw since=15m→ only onegateway readyevent in window (no restart cycle)curl -I https://admins-openclaw.mctl.ai/→ 200/302 (not "no available server")Follow-ups (separate PRs)
mctl-openclawdiff2026.4.26-beta.1..2026.4.28-beta.2to decide whether to re-roll admins.# CLAUDE_CODE_OAUTH_TOKEN — required by the bundled claude-cli backendcomment in all three values files is stale (per memoryfeedback_openclaw_claude_cli_unfit.md, claude-cli was abandoned for openclaw —agent model: openai-codex/gpt-5.4is the active backend). Drop the secret import.