Skip to main content
reliability · kubernetes

Deployments with fewer ready replicas than desired

resource types
1
rule IDs covered
3
severity
high

What does ZopNight detect here?

A Deployment reporting fewer ready replicas than its spec requests is running at reduced capacity right now. ZopNight compares desired against ready. A gap of 1 on a 10-replica service is degraded; the same gap on a 1-replica service is a full outage nothing has alerted on.

Signal and threshold

How ZopNight evaluates Deployments with fewer ready replicas than desired.
Field Value
Rule IDsRC-1714 · RC-1814 · RC-1914
Categoryreliability
Severityhigh
Metricnone — pure configuration read
Sourceinternal/rules/k8s/deployment_degraded.go

Degraded is not the same as down, and both look the same here

The rule compares spec.replicas against status.readyReplicas. The gap is the finding.

What that gap means depends entirely on the denominator. Nine of ten ready is a service running at 90% capacity (probably fine, worth knowing). Zero of one ready is a complete outage, and it produces the identical shape of finding.

Read the ratio, not the difference.

Why a Deployment sits partially ready

Insufficient node capacity. Pods are Pending because no node satisfies their requests. Common after adding replicas without cluster autoscaling.

Readiness failing. Pods are Running but not passing their readiness probe: a dependency is unavailable, or the probe is stricter than the application.

Image pull failures. Wrong tag, missing pull secret, registry rate limit. The pod never starts.

Scheduling constraints unsatisfiable. Node affinity, taints, or a topology spread constraint that cannot be met with the nodes currently available.

The first two are by far the most frequent, and they need opposite responses. One is a capacity problem, the other an application one.

Persistent versus transient

Every rollout produces a temporary gap. That is the deployment strategy working, not a fault.

What matters is duration. A Deployment that has been short a replica for hours is stuck; one short for ninety seconds is mid-update. The rule cannot see how long the state has held, so a finding here is a prompt to check, not proof of a stuck workload.

From readyReplicas to the pod describe events

Terminal window
kubectl get deploy -A -o json | jq -r '
.items[] | select((.status.readyReplicas // 0) < .spec.replicas)
| "\(.metadata.namespace)/\(.metadata.name)\t\(.status.readyReplicas // 0)/\(.spec.replicas)"'

Then go straight to the pods, where the actual reason lives:

Terminal window
kubectl get pods -n <ns> -l app=<name>
kubectl describe pod <pod> -n <ns> | tail -25

The Events section at the bottom of describe names the cause in almost every case.

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·