- Implement both `readinessProbe` and `livenessProbe` for HTTP/TCP/exec checks
- Use `startupProbe` for legacy apps with extremely long or unpredictable initialization times
- Do not couple readiness checks with backend database latency—check only if the app itself can accept traffic
- `livenessProbe` decides if a pod is dead and should be restarted; restrict its logic to purely application-level deadlocks
- `readinessProbe` decides if a pod should receive ingress traffic; this can temporarily fail without causing restarts
- Avoid cascading failures by ensuring your readiness/liveness checks do not hit congested DBs or rate-limited external APIs