Fixing AWS EKS Node Group Scaling That Stalls on Pending Pods
One of Kubernetes' biggest advantages is automatic scaling.
As workloads increase, Kubernetes can:
- Launch additional Pods
- Scale Deployments
- Increase ReplicaSets
- Trigger Cluster Autoscaler
- Add new worker nodes
In Amazon Elastic Kubernetes Service (EKS), this typically works together with managed node groups or self-managed node groups to increase cluster capacity automatically.
A typical scaling flow looks like:
Pod Created
β
Scheduler
β
No Available Node
β
Cluster Autoscaler
β
New Node
β
Pod Scheduled
Everything appears automated.
Then production traffic increases.
New Pods remain in:
Pending
Minutes pass.
No new nodes appear.
Applications begin failing.
Dashboards show:
- Pending Pods
- Low cluster capacity
- Healthy node groups
- Running autoscaler
The autoscaler appears operational,
yet nothing scales.
In most cases, the autoscaler isn't broken.
The issue lies elsewhere.
Kubernetes scheduling depends on many factors beyond CPU and memory.
This guide explains why EKS node groups sometimes fail to scale and how to identify the real bottleneck.
What You Will Learn From This Article
After reading this guide, you'll understand:
- How EKS scaling works.
- The Cluster Autoscaler decision process.
- Common reasons Pods remain pending.
- Node group limitations.
- Scheduling constraints.
- Monitoring strategies.
- Production best practices.
Understanding the Scaling Workflow
Scaling involves several independent components.
A simplified sequence is:
Deployment
β
Pending Pod
β
Scheduler
β
Cluster Autoscaler
β
EC2 Instance
β
Node Joins
β
Pod Runs
If any step fails,
the Pod remains pending.
Pending Doesn't Always Mean "Need More Nodes"
Many developers assume:
Pending
=
Cluster Too Small
Not necessarily.
Pods may remain pending because of:
- Resource requests
- Affinity rules
- Storage
- Networking
- Taints
- Quotas
The autoscaler only adds nodes when doing so can actually solve the scheduling problem.
Common Cause #1
Resource Requests Too Large
Suppose a Pod requests:
- 16 CPUs
- 64 GB RAM
Your node groups only provide smaller instances.
No node type can satisfy the request.
Scaling never occurs.
Solution
Ensure Pod resource requests are compatible with the available instance types in your node groups.
Common Cause #2
Node Selectors
Pods may specify:
Node Selector
or:
Node Affinity
If no node group matches those constraints,
additional nodes cannot be scheduled.
Solution
Verify that node labels align with Pod scheduling requirements.
Common Cause #3
Taints and Tolerations
A node group may contain tainted nodes.
Pods lacking matching tolerations cannot run there.
The scheduler rejects those nodes,
and scaling may not resolve the issue.
Solution
Review taints and tolerations carefully to ensure intended workloads can use the available node groups.
Common Cause #4
Maximum Node Count Reached
Every node group has scaling limits.
Example:
Minimum
β
Desired
β
Maximum
If the maximum size has already been reached,
additional nodes cannot be launched.
Solution
Review node group scaling limits and adjust maximum capacity when appropriate.
Common Cause #5
Cluster Autoscaler Permissions
Cluster Autoscaler requires appropriate IAM permissions to:
- Discover node groups
- Modify Auto Scaling Groups
- Launch instances
Insufficient permissions prevent scaling actions.
Solution
Verify IAM roles, service accounts, and required AWS permissions.
Common Cause #6
Unschedulable Pods
Some Pods request combinations of:
- CPU
- Memory
- GPUs
- Local storage
- Topology constraints
that no available node group can satisfy.
The autoscaler recognizes that adding identical nodes would not solve the scheduling issue.
Solution
Review scheduler events to identify the actual scheduling constraint.
Common Cause #7
VPC Networking Limits
New worker nodes require:
- IP addresses
- Subnet capacity
- Network interfaces
Subnet exhaustion can prevent new nodes from joining the cluster.
Solution
Monitor VPC subnet utilization and available IP address capacity.
Networking limits are a common scaling bottleneck in large clusters.
Check Scheduler Events
The Kubernetes scheduler often explains why Pods remain pending.
Typical reasons include:
- Insufficient CPU
- Insufficient memory
- Node affinity mismatch
- Taints
- Storage constraints
Always review scheduling events before assuming autoscaling has failed.
Storage Constraints
Persistent Volumes may introduce scheduling restrictions.
Examples include:
- Zone affinity
- Storage class limitations
- Volume attachment limits
Scaling compute resources alone will not resolve storage-related scheduling failures.
Availability Zones
Multi-AZ deployments improve resilience,
but Pods may require resources in specific zones.
Ensure node groups exist across the required Availability Zones.
Monitor Autoscaler Logs
Cluster Autoscaler logs provide valuable insight into scaling decisions.
Look for messages related to:
- Unschedulable Pods
- Scaling decisions
- Node group discovery
- Maximum size reached
- Permission failures
Logs often identify the root cause quickly.
Resource Requests vs Resource Usage
Autoscaling decisions are based primarily on requested resources,
not actual utilization.
A Pod requesting excessive resources may remain pending even when cluster usage appears low.
Right-size requests using production metrics.
Real-World Example
A SaaS platform experiences increased traffic after a product launch.
Several application Pods remain pending.
Initial investigation focuses on Cluster Autoscaler.
However,
scheduler events reveal:
Node Affinity Mismatch
The Deployment requires a label that exists only on a node group already at maximum capacity.
After:
- Expanding the node group
- Correcting scheduling labels
- Reviewing resource requests
Pods are scheduled successfully,
and scaling resumes normally.
Performance Considerations
Rapid scaling improves application availability,
but excessive scaling can increase:
- Infrastructure costs
- Startup latency
- Resource fragmentation
Balance responsiveness with efficient capacity planning.
Regularly review scaling policies as workloads evolve.
Best Practices Checklist
When managing EKS node groups:
β Review scheduler events
β Right-size resource requests
β Verify node selectors
β Validate taints and tolerations
β Monitor autoscaler logs
β Check node group limits
β Monitor subnet IP capacity
β Test scaling before production releases
β Use multiple Availability Zones
β Continuously monitor cluster health
Common Mistakes to Avoid
Avoid:
β Assuming every pending Pod requires more nodes
β Ignoring scheduler diagnostics
β Requesting unrealistic CPU or memory resources
β Forgetting node affinity rules
β Overlooking subnet exhaustion
β Setting node group maximum sizes too low
β Treating autoscaling as a substitute for capacity planning
Why This Problem Is Difficult to Diagnose
Pending Pods often lead engineers to focus immediately on Cluster Autoscaler, even though the autoscaler is only one part of Kubernetes' scheduling process. In many cases, the scheduler has already determined that adding more nodes will not solve the problem because of resource requests, affinity rules, taints, storage constraints, or networking limitations. Since these components interact across multiple layers of the Kubernetes and AWS infrastructure stack, identifying the true bottleneck requires examining scheduler events, autoscaler logs, and node group configuration together.
Understanding how Kubernetes makes scheduling decisions is the key to resolving stalled scaling events quickly and preventing unnecessary infrastructure changes.
Wrapping Summary
AWS EKS provides powerful automatic scaling capabilities, but successful node group scaling depends on much more than simply enabling Cluster Autoscaler. Pending Pods can result from oversized resource requests, node affinity constraints, taints, storage limitations, subnet exhaustion, IAM permission issues, or node groups that have already reached their configured maximum size. In many situations, adding more nodes would not solve the underlying scheduling problem.
Building resilient Kubernetes environments requires understanding the complete scheduling workflowβfrom Pod creation and scheduler evaluation to autoscaler decisions and node provisioning. By monitoring scheduler events, reviewing autoscaler logs, right-sizing resource requests, validating networking capacity, and regularly testing scaling behavior under production-like workloads, teams can ensure their EKS clusters respond reliably to changing demand while maintaining both performance and cost efficiency.
π€ Share this article
Sign in to saveRelated Articles
Cloud & DevOps
Fixing AWS ECS Task Networking Failures in awsvpc Mode
5m read
Cloud & DevOps
Tigris vs Cloudflare R2: Global Object Storage Tested for Latency, Pricing, and S3 API Coverage
5m read
Cloud & DevOps
Grafana Cloud vs Datadog for Metrics: Free Tier Limits, Retention, and Real Costs
5m read
Comments (0)
No comments yet. Be the first!