← All posts
Blog

Kubernetes probes without the pain: liveness, readiness and startup

August 19, 2026

Probes are how the kubelet decides whether a container is healthy and whether traffic can be sent to it. The idea is simple, yet probes are exactly where most teams stumble: a misconfigured probe doesn't protect your service, it takes it down itself - either through cascading restarts or by routing traffic into a pod that is known to be broken. Let's go through what each of the three probes does, the mistakes that come up most often, and how to set them up so they work for you rather than against you.

The three probes and what they actually do

Kubernetes has three probes, and confusing them is the number-one source of trouble. The key difference isn't how they check (an HTTP request, a TCP connection, a command inside the container - the mechanism is identical), but what happens on failure.

PROBE QUESTION ON FAILURE startup slow boot Has the app finished booting? Wait. liveness and readiness don't run - the pod won't be killed during a long boot readiness traffic Ready to serve traffic right now? Pod is removed from the Service endpoints - no traffic. NO restart liveness life Is the container alive, not stuck? kubelet restarts the container
readiness controls traffic, liveness controls restarts. Different consequences - so the logic behind them must be different too.

Five mistakes that take prod down

How to configure it right

The rule that closes most problems: liveness should be cheap and local, while readiness may look at dependencies.

A quick cheat sheet on parameters: initialDelaySeconds - the pause before the first check (barely needed for liveness if you have a startup probe); periodSeconds - how often to check; timeoutSeconds - how long to wait for a response; failureThreshold - how many consecutive failures count as a failure; successThreshold - how many successes to recover (always 1 for liveness).

# a slow-starting web service startupProbe: httpGet: { path: /healthz, port: 8080 } periodSeconds: 5 failureThreshold: 30 # up to 150s to boot readinessProbe: httpGet: { path: /ready, port: 8080 } # checks the DB connection periodSeconds: 10 failureThreshold: 3 livenessProbe: httpGet: { path: /healthz, port: 8080 } # cheap, no dependencies periodSeconds: 10 timeoutSeconds: 3 failureThreshold: 3

How to diagnose

If a pod restarts endlessly, check the events first: kubectl describe pod <name> - the Events section will show a line like Liveness probe failed: ... with the concrete reason (timeout, response code, connection refused). A growing RESTARTS in kubectl get pods and a CrashLoopBackOff status almost always point at liveness. And if a pod sits at READY 0/1 for a long time but doesn't restart - it's readiness: the container is alive but not admitting traffic. Splitting «restart versus traffic» is the fastest way to know which probe to fix.

One caveat: a Last State: Terminated - Reason: OOMKilled message has nothing to do with probes - it's out of memory, and probes are not involved. Don't conflate the two, or you'll be tuning timeoutSeconds where you actually need to raise the memory limit.

When you don't have to write probes by hand

Everything above is manual work that gets repeated in every new service, with the same mistakes made in the same places. Internal Developer Platforms handle this differently: probes are generated from a healthcheck path or from the team's standard template, rather than hand-tuned on every deploy. If you're curious what that looks like in practice, we describe the approach in the Opsy platform overview. But even without a platform, the rule «liveness cheap and local, readiness looks at dependencies, startup for slow boots» removes most of the pain.

Related articles

Kubernetes deployment strategies Kubernetes monitoring and metrics AI log diagnostics for Kubernetes