Liveness restarts, readiness gates traffic, startup protects slow boots.
Three probes answer three different questions. Mixing them up is one of the most common causes of self-inflicted outages.
Liveness
Is it broken beyond repair?
Fails: the kubelet kills and restarts the container. Use for deadlocks, never for "busy".
Readiness
Can it take traffic now?
Fails: the Pod is removed from Service endpoints. The container keeps running and can recover.
Startup
Has it finished booting?
Holds liveness and readiness back until it passes, so a slow JVM is not killed during start.
probes
startupProbe: httpGet: {path: /healthz, port: 8080} failureThreshold: 30 periodSeconds: 10 livenessProbe: httpGet: {path: /healthz, port: 8080} failureThreshold: 3 readinessProbe: httpGet: {path: /ready, port: 8080} periodSeconds: 5