Liveness: kubelet restarts the pod if it fails. Readiness: removes the pod from Service routing if it fails. Startup: disables the other two until the app is up. They are not interchangeable; using one for all three is a production outage waiting to happen.
/live returns 200 only when the process is alive — minimal logic.
/ready returns 200 when DB and Redis are reachable — increments traffic only after ready.
/startup allows slow boot (cold cache, model load) and prevents the liveness probe restarting you mid-boot.
kubelet -> /live (restart?) -> Service -> /ready (route?)
Startup -> gates the other two until first success
Three probes, three purposes. Use a templated base class so new routes don’t skip them.