kiln-app: liveness-probe startar om podden under last (självförvärrande) #119
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bakgrund
Under lasttest av
kiln.kobbo.se(2026-09-26) upptäcktes attkiln-app-poddarnablir liveness-dödade och startar om när appen blir överlastad — innan den
egentligen är död. Det är ett självförvärrande fel: kubelet tar bort kapacitet
mitt under en lasttopp, vilket gör överlasten värre.
Berörda manifest:
kubernetes/apps/kiln/app/deployment.yaml(branchfeature/kiln).Vad som händer
Både readiness- och liveness-proben pekar på samma endpoint,
/api/health/live:/api/health/live/api/health/live/api/health/livegörSELECT 1och serveras av samma Node-process ochevent-loop som SSR-sidan. När appen mättas (CPU-bunden SSR) blockerar
event-loopen även health-endpointen, och då:
på kvarvarande pod → fler probe-failures. Ond spiral.
Bevis (från lasttest inifrån klustret)
Appens egna probes är klientoberoende bevis. Vid en trapptest — konstanta
RPS-nivåer mot
kiln-app(mix: 50 % startsida, 30 %/login, 20 %/api/health/live):Appens health-endpoint började svara >1s (probe-timeout) precis när 400-nivån
startade, och liveness dödade podden:
kubectl -n kiln get events:Container app failed liveness probe, will be restartedOmstarter under testerna:
0 → 5resp.0 → 3(båda poddarna), medankiln-postgresstod helt orörd (0 omstarter, 8/100 anslutningar, inga fel iloggen). Flaskhalsen är alltså Node-processen, inte databasen.
Varför liveness är fel verktyg här
Liveness ska svara på frågan "är processen död eller permanent hängd?" — inte
"är den upptagen just nu?". En CPU-mättad men fullt fungerande app ska
dräneras av readiness, inte dödas av liveness. Att lägga liveness på en
endpoint som delar event-loop med den dyra SSR-koden gör att en tillfällig
överlast leder till onödiga omstarter och längre avbrott än nödvändigt.
Förslag på åtgärd
en
tcpSocket-probe på port3000, eller höjtimeoutSeconds(3–5s) ochfailureThreshold(5–6). Liveness får inte fälla på tillfällig latens./api/health/live— den ska dra ur trafik, vilket ärprecis vad man vill när appen är upptagen.
fler replicas om högre kapacitet behövs.
Tasks
livenessProbeikubernetes/apps/kiln/app/deployment.yaml(tcpSocket eller höjd timeout/failureThreshold)
kiln-appReferenser
scripts/loadtest/(kiln-brytpunkt.js,kiln-trapp.js,README.md)docs/kiln-deploy-plan.md