Skip to main content
reliability · kubernetes

Workloads with no readiness probe

resource types
3
rule IDs covered
9
severity
medium

What does ZopNight detect here?

Without a readiness probe Kubernetes adds a pod to Service endpoints as soon as its container starts, before the application can serve. Every rollout then drops requests during the warm-up window. ZopNight checks 3 workload kinds; there is no metric, only the spec.

Signal and threshold

How ZopNight evaluates Workloads with no readiness probe.
Field Value
Rule IDsRC-1709 · RC-1809 · RC-1909 · RC-1710 · RC-1810 · RC-1910 · RC-1719 · RC-1819 · RC-1919
Categoryreliability
Severitymedium
Metricnone — pure configuration read
Sourceinternal/rules/k8s/missing_readiness_probe.go

Started is not the same as ready

The moment a container process starts, the pod is added to its Service’s EndpointSlice and begins receiving traffic. That happens whether or not the application has loaded configuration, warmed a cache, established a connection pool or bound its listener.

For an application that starts in milliseconds the gap does not matter. For a JVM service, a framework with heavy initialisation, or anything that pre-loads data, the gap is seconds, and every request arriving in it fails.

Rollouts are where this actually bites

During a rolling update Kubernetes replaces pods in batches. With no readiness probe it considers each new pod available immediately and proceeds to terminate the next old one.

The result is a rollout that reports success while dropping a slice of traffic at every step. It is intermittent, brief, and looks like a network blip rather than a deploy problem. That is why it survives so many deployments before anyone traces it.

What a good readiness check tests

Unlike liveness, readiness should consider dependencies. A pod that cannot reach its database genuinely should not receive traffic, and removing it from the endpoint pool is exactly right.

The failure is recoverable: the pod stays alive, keeps being probed, and rejoins when the check passes. Nothing restarts.

Readiness also gates disruption

kubectl drain and the eviction API respect readiness through PodDisruptionBudgets. A workload with no readiness probe reports every pod as ready the instant it starts, so a budget requiring “at least 2 available” can be satisfied by two pods that cannot serve, and the drain proceeds into an outage.

Selecting containers where readinessProbe is null

Terminal window
kubectl get deploy,statefulset,daemonset -A -o json | jq -r '
.items[] | . as $w | .spec.template.spec.containers[]
| select(.readinessProbe == null)
| "\($w.kind) \($w.metadata.namespace)/\($w.metadata.name): \(.name)"'

Where it matters least

A DaemonSet with no Service in front of it, or a worker consuming from a queue rather than serving requests, has no endpoint pool to be added to. The probe adds little there, and this finding can reasonably be dismissed for those workloads.

See it fire on your bill.

Connect an account read-only. The first findings land in minutes.

417 rule families across 353 resource types on 22 platforms. Every threshold, metric, and IAM action is documented on these pages before you grant anything.

417 rule families documented
353 resource types covered
read-only default access level
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·