mirror of
https://github.com/sredevopsorg/deepseek-kubernetes-sandbox.git
synced 2026-11-03 01:13:24 +00:00
Add a startup probe so slow DSH cold starts are not killed (#6)
DSH takes tens of seconds to load plugins and start serving on a small node, and every resume starts cold. The liveness budget (initialDelay 15s, period 15s, failureThreshold 3) is shorter than that, so the kubelet killed the container mid-startup. DSH exits 0 on SIGTERM, which the sandbox controller records as PodSucceeded/Finished - the pod is then never recreated and the sandbox stays unusable until a manual suspend/resume cycle. Gate liveness and readiness behind a startupProbe on /favicon.svg with a 120s budget (24 x 5s, matching the gateway's WAKE_TIMEOUT). Liveness still catches a genuinely hung server once startup succeeds. Co-authored-by: SREDevOpsAgents <agents@sredevops.org>
This commit is contained in:
committed by
GitHub
parent
a8ef211aa4
commit
c193ed21a4
@@ -58,7 +58,15 @@ spec:
|
|||||||
- name: dsh-home
|
- name: dsh-home
|
||||||
mountPath: /home/node/.dsh # DSH_HOME
|
mountPath: /home/node/.dsh # DSH_HOME
|
||||||
# / is behind DSH's launch-token cookie (401 without it); use an
|
# / is behind DSH's launch-token cookie (401 without it); use an
|
||||||
# unauthenticated path for probes.
|
# unauthenticated path for probes. The startup probe gives a cold
|
||||||
|
# start (plugin activation on a small node, or the first resume of a
|
||||||
|
# suspended sandbox) up to 120s before liveness can restart it.
|
||||||
|
startupProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /favicon.svg
|
||||||
|
port: 3080
|
||||||
|
periodSeconds: 5
|
||||||
|
failureThreshold: 24
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /favicon.svg
|
path: /favicon.svg
|
||||||
|
|||||||
@@ -70,6 +70,19 @@ spec:
|
|||||||
# otherwise fail readiness and then get the pod killed by liveness.
|
# otherwise fail readiness and then get the pod killed by liveness.
|
||||||
# /favicon.svg is served without auth and is the cheapest liveness
|
# /favicon.svg is served without auth and is the cheapest liveness
|
||||||
# signal that proves the HTTP server is actually serving requests.
|
# signal that proves the HTTP server is actually serving requests.
|
||||||
|
#
|
||||||
|
# Gate liveness/readiness behind a startup probe: a cold start on a
|
||||||
|
# small node takes tens of seconds to load plugins and start serving
|
||||||
|
# (a resumed sandbox starts cold too). Without it the kubelet can kill
|
||||||
|
# DSH mid-startup, and a SIGTERM'd DSH exits 0, which the sandbox
|
||||||
|
# controller records as finished. 24 x 5s = 120s, matching the
|
||||||
|
# gateway's WAKE_TIMEOUT.
|
||||||
|
startupProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /favicon.svg
|
||||||
|
port: 3080
|
||||||
|
periodSeconds: 5
|
||||||
|
failureThreshold: 24
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /favicon.svg
|
path: /favicon.svg
|
||||||
|
|||||||
@@ -45,7 +45,9 @@ What it demonstrates, feature by feature:
|
|||||||
- **Host allow-list**: DSH rejects unknown `Host` headers. The gateway forwards the browser's
|
- **Host allow-list**: DSH rejects unknown `Host` headers. The gateway forwards the browser's
|
||||||
`Host`, so the public hostname must be added to `DSH_TRUSTED_HOSTS` in the template.
|
`Host`, so the public hostname must be added to `DSH_TRUSTED_HOSTS` in the template.
|
||||||
- **Probes target `/favicon.svg`**: `/` returns `401` without the launch token, so a probe on
|
- **Probes target `/favicon.svg`**: `/` returns `401` without the launch token, so a probe on
|
||||||
`/` crash-loops the pod. `/favicon.svg` is unauthenticated.
|
`/` crash-loops the pod. `/favicon.svg` is unauthenticated, and a `startupProbe` gates
|
||||||
|
liveness/readiness so a slow cold start (plugin activation, or a resumed sandbox) is not
|
||||||
|
restarted mid-boot.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user