Kubernetes / Editorial solution guide
Pending Pods: identify the unsatisfied scheduling contract
Separate placement, storage, and initialization evidence before changing requests, constraints, or capacity.
Read-only knowledge base ยท No public comments
Recognize the symptoms
A workload requests replicas but Pods remain Pending. Cluster utilization can look low, and raising replica count produces more waiting work. Pending is a coarse phase that can include different preparation stages, so first establish whether a node was assigned and which current condition or event explains the wait.
Understand the likely causes
- A Pod may lack a feasible node because of CPU or memory requests, taints, affinity, topology, unavailable storage, quota or admission prerequisites, or node conditions. A scheduled Pod can instead wait on image retrieval or volume setup. Aggregate free CPU does not prove one eligible node satisfies every indivisible requirement.
Identify the exact phase of preparation
Record namespace, UID, owner, admitted resource specification, node assignment, relevant condition, and observation time. An old FailedScheduling event from a previous lifetime should not override a current scheduled condition. Keep admission rejection separate from an object that exists but cannot schedule. Inspect only authorized safe metadata and events, not credentials. The first synthetic record shows no assigned node and a current CPU-fit reason; it does not describe image startup. Establish this boundary before suggesting a probe change, image rebuild, or arbitrary restart.
pod_uid: lab-pending-a
node_assignment: none
current_condition: unschedulable
synthetic_reason: eligible nodes lack requested CPU
not_established: image-or-readiness-failure
The named condition narrows the first investigation to feasibility. No actual scheduling event, node inventory, or resource usage is collected.
Compare per-node constraints, not averages
Review effective requests and the eligible node set, including init-container and overhead semantics in the real scheduler. The second local simulation considers only synthetic CPU request fit and demonstrates why two separate 400m gaps cannot host one 500m request. Real feasibility also includes memory, special resources, taints, required affinity, ports, and topology. A toleration permits consideration of a tainted node but does not force selection or bypass other filters. Reducing a request may enable placement without reducing actual demand, transferring the failure into runtime contention.
available_request_mcpu = [400, 400]
pod_request_mcpu = 500
print(sum(available_request_mcpu))
print(any(value >= pod_request_mcpu for value in available_request_mcpu))
800
False
The aggregate is 800m but no individual synthetic node fits 500m. Other resources and real scheduler rules are deliberately omitted.
Include storage and failure-domain requirements
A claim can be unbound because the StorageClass, provisioner, capacity, credentials, or topology prerequisite is missing. Bound storage can still constrain placement to a zone without suitable nodes. Review delayed binding and driver semantics with the storage owner. Do not delete a PVC to clear an unexplained condition, because reclaim behavior can destroy data. Anti-affinity or spread requirements may also exceed available domains. Determine whether the constraint protects data, availability, or trust before relaxing it, and preserve the approved reason for any exception.
Repair through accountable capacity ownership
Choose the smallest supported correction: fix an erroneous request, supply reviewed eligible capacity, restore a provisioning prerequisite, or revise an impossible placement rule through its owner. Node autoscaling is separate and can fail because of provider quota or unsupported constraints. Keep workload and infrastructure changes in their authorized workflows and verify dependency headroom before wider scale. No node, provider, quota, claim, or scheduling field is changed by this guide. Its examples are synthetic; the Python model is in-memory arithmetic rather than a cluster simulator or capacity recommendation.
Verify the fix
Confirm that the intended Pod lifetime becomes scheduled on an eligible node, then independently verify image, startup, volume, readiness, and user behavior. Check actual runtime demand and neighboring pressure after a request change. Preserve the explanation and approved specification so a lower Pending count is not mistaken for reliable capacity.
Keep it from recurring
- Plan requests, topology, storage, rollout surge, and failure headroom together. Review LimitRange and quota defaults and test hard constraints in an authorized isolated environment. Keep ownership and evidence for capacity changes, and avoid universal request reductions or force operations as troubleshooting habits.