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

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

A Kubernetes cluster can show just 3% CPU usage while a Pod remains pending because the scheduler checks declared resource requests and placement rules—not cluster-wide utilization alone. Start with the Pod’s FailedScheduling event: it usually points to the constraint that excludes every eligible node. For an EBS-backed volume, that can be a zone mismatch even when other zones have ample capacity.

What does low CPU usage have to do with a pending Pod?

Observed CPU utilization and schedulability measure different things. Kubernetes decides whether a Pod fits by comparing its resource requests with the remaining allocatable resources on nodes that meet the Pod’s placement requirements. A low cluster-wide CPU percentage does not show whether any eligible node has enough unallocated requested CPU or memory.

Requests matter even when a workload is currently using little CPU. Init-container requests also affect the effective Pod request, so include them when checking whether the Pod fits. The Kubernetes documentation explains resource requests and scheduling at Resource Management for Pods and Containers.

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

How do you find the constraint blocking scheduling?

1. Read the Pod’s scheduling event

Run kubectl describe pod <pod> and inspect the Events section for FailedScheduling. The event is the first useful clue: it may report insufficient CPU or memory, or point to a placement or volume constraint. Kubernetes documents using Pod events to investigate scheduling issues in its resource management guidance.

2. Compare requests with node allocatable capacity

Inspect the Pod specification and the allocatable values on nodes that could otherwise run it. Compare the Pod’s effective requests with remaining capacity, rather than comparing its current CPU use with total cluster CPU. A request may not fit on any eligible node even if average utilization is low.

Also account for constraints that shrink the eligible-node set. A nodeSelector, required node affinity, untolerated taint, inter-Pod affinity rule, topology spread constraint, or other resource requirement can rule out nodes before resource fit is considered. Kubernetes’ scheduler uses filters including VolumeBinding, VolumeZone, NodeVolumeLimits, and EBSLimits; volume placement and attach limits can therefore block a Pod independently of overall CPU use. See the Kubernetes scheduler configuration documentation.

How can Karpenter affect a pending Pod?

Karpenter can provision capacity only when it can find a node that satisfies the Pod’s resource needs and placement requirements. Check the applicable NodePool and NodeClass requirements, including whether a suitable instance type and subnet are available in the required Availability Zone (AZ). Karpenter’s scheduling decisions compare Pod requests with node allocatable resources; low observed utilization does not remove those requirements. See Karpenter’s scheduling documentation.

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

For EKS Auto Mode or Karpenter, Amazon EKS guidance says the NodeClass must select subnets in each AZ where EBS-backed workloads may need nodes. If a Pod is constrained to a volume’s zone but the provisioner cannot launch a qualifying node there, adding capacity in another zone will not make that Pod schedulable. See Amazon EKS data plane best practices.

Why does EBS Availability Zone affinity matter?

Amazon EBS volumes are zonal. A Pod using a bound EBS volume must run in the volume’s AZ; Amazon EKS states, “A Pod cannot access EBS-backed persistent volumes located in a different AZ.” That means a cluster can have substantial available CPU in other zones and still have no node eligible for this Pod.

Trace the storage path by inspecting the Pod’s PVC, its bound PV, and the StorageClass. Confirm the volume’s zone and compare it with the zones in which eligible nodes already exist or can be provisioned. The relevant EKS guidance is in Data plane best practices.

What should you check in the StorageClass and EBS provisioner?

Confirm which EBS CSI configuration the cluster uses before changing storage settings. EKS examples for the standard EBS CSI driver use the provisioner ebs.csi.aws.com with volumeBindingMode: WaitForFirstConsumer. This lets the consumer’s scheduling inform volume placement and provisioning. EKS Auto Mode uses ebs.csi.eks.amazonaws.com and does not require installing the standard EBS CSI controller. These modes are not interchangeable assumptions; check the cluster’s actual setup in the Amazon EKS EBS CSI driver documentation and EKS StorageClass guidance.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

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

How should you choose a fix?

Make the change that addresses the constraint named by the event and confirmed by the Pod, node, and storage configuration. Lowering a request can help only when resource fit is the blocker; it will not resolve a volume-zone mismatch or an unsatisfied hard affinity rule.

  • Resource fit: Check whether the effective Pod requests fit the remaining allocatable CPU and memory on eligible nodes. Adjust requests only when they accurately reflect the workload and resource fit is the problem.
  • Node eligibility: Check required labels, affinity, taints and tolerations, and topology rules. Change a hard constraint only if the workload is intended to run elsewhere.
  • Provisioning in the required zone: Verify that Karpenter’s NodePool and NodeClass requirements permit an appropriate node and that a suitable subnet is available in the volume’s AZ.
  • Storage placement: Verify the PVC/PV binding, StorageClass binding mode, and CSI provisioner against the cluster’s EBS configuration.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

How do you tell whether scheduling failures persist?

Pod events show the failure for an individual Pod. For an EKS cluster, CloudWatch’s scheduler_pending_pods_UNSCHEDULABLE metric counts Pods the scheduler tried and failed to place, which it retains for retry. Use it to track persistent unschedulability, then inspect each affected Pod’s event to identify the specific constraint. See Amazon EKS CloudWatch metrics.

What this diagnosis can—and cannot—tell you

The checks above describe Kubernetes and EKS scheduling mechanisms; they do not identify the cause in a particular cluster. The decisive details are the Pod’s event, manifest, PVC/PV, StorageClass, and the deployed Kubernetes, Karpenter, and EKS storage configuration. APIs, scheduler behavior, and provisioning modes can vary by version and configuration, so verify findings against the versions and manifests actually deployed.

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.