Deployments with fewer ready replicas than desired after the rollout finished
What does ZopNight detect here?
ZopNight flags a Kubernetes Deployment on EKS, GKE or AKS when `readyReplicas` is below the desired replica count while the rollout itself is complete, meaning `updatedReplicas` already equals the desired count. The Deployment is running short-handed with no update to blame, usually because pods are crash-looping, pending or failing readiness checks.
Signal and threshold
| Field | Value |
|---|---|
| Rule IDs | RC-1714 · RC-1814 · RC-1914 |
| Category | reliability |
| Severity | high |
| Metric | status.readyReplicas vs desired replicas |
| Threshold | ready below desired, rollout complete |
| Source | ZopNight |
| Permissions used | list deployments.apps · list pods |
Where it applies
Short on capacity with nothing in progress
During a rollout it is normal for ready replicas to trail desired while new pods start. Once every replica has been updated, the two numbers should match. When they do not, some pods are stuck, and the service is running on less capacity than it was sized for. With the rolling update defaults in the Deployments documentation, up to 25% of pods may be unavailable during an update; a Deployment stuck below desired afterwards has lost that margin for good.
The same page lists the usual reasons a Deployment stops progressing: insufficient quota, failing
readiness probes, image pull errors, insufficient permissions, limit ranges and application
misconfiguration. Kubernetes takes no action on a stalled Deployment beyond reporting a
Progressing condition with reason ProgressDeadlineExceeded.
Finding Deployments running below desired
kubectl get deployments -A -o json | jq -r ' .items[] | select(.spec.replicas > 0 and (.status.readyReplicas // 0) < .spec.replicas and (.status.updatedReplicas // 0) >= .spec.replicas) | "\(.metadata.namespace)/\(.metadata.name) ready=\(.status.readyReplicas // 0) desired=\(.spec.replicas)"'kubectl rollout status deployment/<name> confirms whether Kubernetes considers the rollout
finished.
Three checks before the finding fires
ZopNight reads the desired and ready replica counts and fires when desired is above zero and ready is below it. A missing ready count is treated as zero. Two conditions hold it back:
- If the updated replica count is below desired, a rollout is still running and the gap is expected.
- If ZopNight itself started, stopped or scaled the Deployment within the last 15 minutes, for example through a schedule, it waits for pods to settle.
There is no longer window; the finding reflects the counts at evaluation time.
Deployments outside the check
A Deployment set to zero replicas has nothing to be ready and is skipped; parked Deployments are covered by Stopped deployment. StatefulSets have their own version of this check, StatefulSet not fully ready. The finding reports the counts, not the cause, so the diagnosis steps below are still needed.
Reliability risk without a saving
This high-severity reliability finding carries no dollar amount. The exposure is reduced capacity and redundancy for a service that believes it has its full replica count.
Diagnosing the missing replicas
- Run
kubectl describe deployment <name>and read the conditions forProgressDeadlineExceededor quota errors. - List the pods and find those not ready:
kubectl get pods -n <namespace> -l <selector>. - For
Pendingpods, readkubectl describe podevents for scheduling failures such as insufficient CPU or unbound volumes. - For
CrashLoopBackOffor failing readiness, readkubectl logs <pod> --previousand the probe configuration. - Fix the cause and confirm ready replicas return to the desired count.