Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A Pod stuck in Pending may be waiting for the scheduler to find a suitable node—or it may already have a node but be unable to start its container. Run kubectl describe pod <pod-name> -n <namespace> and begin with the Events section; its reason usually points to the right fix. These eight checks are a practical troubleshooting list, not an official Kubernetes ranking or exhaustive taxonomy.

First determine what “Pending” means for this Pod

Kubernetes describes an unscheduled Pending Pod this way: “If a Pod is stuck in Pending it means that it can not be scheduled onto a node.” The broad Pod phase can also include a Pod that has been assigned to a node but whose container has not started. Check whether .spec.nodeName is populated, and inspect the container state as well as Events. See the Kubernetes Debug Pods guide.

  1. Run kubectl describe pod <pod-name> -n <namespace>.
  2. Read the Events section. A FailedScheduling event points to placement constraints; a container waiting reason points to startup after assignment.
  3. If Events are not enough, inspect the relevant object: node allocation, quota, node labels and taints, or the referenced PVC.

The scheduler filters nodes for feasibility before scoring candidates. Requests, hardware and software constraints, policy, affinity and anti-affinity, and data locality can all affect whether a node is eligible. Fix the specific constraint shown by the event rather than changing unrelated settings. See the Kubernetes scheduler documentation.

Eight causes of Pending Pods and their fixes

1. CPU or memory requests do not fit

Clue: Events report insufficient CPU or memory, or no eligible node has enough allocatable resources for the Pod’s requests. Placement is based on requests and available allocatable capacity after existing requests are considered; low observed utilization does not by itself prove another request will fit. The Kubernetes resource management documentation explains how requests affect scheduling.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall

Fix: Compare the Pod’s requests and node allocations with kubectl describe pod and kubectl describe nodes. If the requests reflect actual workload needs, add suitable capacity or free it by changing other workloads. If requests are demonstrably oversized, revise them using measured needs and operational headroom; do not lower them merely to clear an event.

2. A namespace or cloud-provider quota blocks progress

Clue: A namespace ResourceQuota can constrain admission or resource allocation. Separately, a cluster autoscaler may be unable to add nodes because the cloud account or project has exhausted its quota. Google Kubernetes Engine (GKE) documents scale.up.error.quota.exceeded as a project-quota scale-up error; that wording is specific to GKE, not a universal Kubernetes event. Its workload troubleshooting guide covers the provider example.

Fix: For a namespace limit, inspect quota and current use, then reduce consumption or request an appropriate quota change. For a provider limit, inspect the cloud quota and autoscaler events, then request capacity or adjust the scaling plan. Treat these as different failure points: one prevents the Pod from being admitted or allocated within its namespace, while the other prevents the cluster from adding nodes.

3. A node taint has no matching toleration

Clue: A FailedScheduling event may report that available nodes have an untolerated taint. Taints repel Pods unless a matching toleration permits placement, but a toleration does not guarantee that the Pod will be scheduled; other constraints still apply. See Kubernetes taints and tolerations.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Fix: Inspect the node with kubectl describe node <node-name> and compare its taints with the Pod’s tolerations. If the node is intentionally reserved, leave the taint in place and use suitable nodes. Add a narrowly scoped matching toleration only if the workload belongs on that node class; removing a taint globally can defeat the placement policy.

4. Selectors, affinity, or topology rules exclude every node

Clue: A nodeSelector, required node affinity, or hard topology rule can leave no feasible node. Pod affinity and anti-affinity can also exclude candidates depending on selected Pods, namespaces, and topology labels. Required terms constrain placement; preferred terms express preferences. See Kubernetes node assignment and affinity.

Fix: Compare selectors and required affinity with real node labels, and check the relevant Pods and topology labels for Pod affinity or anti-affinity rules. Correct a mistaken label or accidental hard requirement, or add the intended label to the appropriate nodes. Preserve requirements that enforce real hardware, locality, or availability needs. Kubernetes notes that Pod anti-affinity relies on consistent labels for the topology key.

5. A PersistentVolumeClaim is unbound or cannot provision

Clue: Pod Events may say Unbound PersistentVolumeClaims. Inspect the claim and its Events with kubectl describe pvc <claim-name> -n <namespace>. The GKE troubleshooting guide recommends checking for provisioning failure and, when appropriate, attempting to pre-provision the volume again.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Fix: Follow the PVC’s event reason. Verify that the storage class and provisioner are available, and check the requested capacity, access mode, and any topology or zone restrictions imposed by the storage system. Correct the storage configuration or restore provisioning, then confirm the claim reaches the expected bound state. The remedy depends on the storage driver; do not delete a claim containing data as a generic troubleshooting step.

6. A hostPort limits available placements

Clue: A requested hostPort can reduce the number of nodes where a Pod can run because matching Pods cannot occupy the same host port on one node. Kubernetes lists hostPort as a reason a Pending Pod may have limited placement options in its Pod debugging guide.

Fix: If the workload does not need a node-level port binding, remove hostPort and expose the Pod through a Service. If it is required, check whether enough eligible nodes remain for the desired replicas and whether other rules further restrict placement.

7. A scheduling gate is deliberately holding the Pod

Clue: Check .spec.schedulingGates. A Pod created with gates is not considered ready for scheduling until those gates are removed. Kubernetes documents scheduling readiness as stable since v1.30. See Pod scheduling readiness.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Fix: Identify the controller or workflow responsible for the gate and satisfy its prerequisite. Remove the gate only after that condition is complete. Existing gates can be removed after creation, but a new gate cannot be added to the Pod afterward.

8. The Pod has a node, but its container is waiting

Clue: If .spec.nodeName is set, inspect the container state and its waiting reason. A Waiting container has been assigned to a worker node but cannot run there yet; image pull failure is the most common reason identified in the Kubernetes Debug Pods guide. This is different from a scheduler that cannot find any node.

Fix: For an image pull failure, verify the image name and tag, confirm the image was pushed to the registry, and check whether the node has the required access to pull it. Follow the specific waiting reason in kubectl describe pod; changing node affinity will not fix a registry authentication problem.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Match the fix to the evidence

What the evidence points to Inspect Typical direction for the fix
Resource fit Pod requests and node allocatable resources and allocations Add capacity or free it; right-size requests only when workload needs support the change.
Quota Namespace quota, or cloud quota and autoscaler events Address the namespace limit or provider capacity limit separately.
Node eligibility Taints, tolerations, labels, selectors, affinity, and topology rules Correct unintended constraints while preserving deliberate placement policy.
Storage PVC status and claim Events Resolve the storage class, provisioner, capacity, access-mode, or topology issue indicated by the claim.
Deliberate scheduling hold .spec.schedulingGates and the responsible workflow Complete the prerequisite before removing the gate.
Post-scheduling startup Node assignment and container waiting reason Resolve the startup issue, such as an image name, tag, or pull-access problem.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.