Amazon EKS — Managed Node Groups
Managed Node Groups
Managed node groups are the recommended way to run worker nodes on EKS. AWS handles AMI updates, node draining, and health monitoring — you just specify the instance type and scaling parameters.
How Managed Node Groups Work
Managed Node Group Lifecycle
┌──────────────────────────────────────────────────────────┐
│ │
│ You define: AWS manages: │
│ • Instance type • AMI selection │
│ • Desired/min/max count • Node health checks │
│ • Labels and taints • Graceful draining │
│ • Volume size • Rolling updates │
│ • Subnets • Integration with ASG │
│ │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ Node 1 │ │ Node 2 │ │ Node 3 │ │
│ │ m5.lg │ │ m5.lg │ │ m5.lg │ │
│ │ ┌────┐ │ │ ┌────┐ │ │ ┌────┐ │ │
│ │ │Pods│ │ │ │Pods│ │ │ │Pods│ │ │
│ │ └────┘ │ │ └────┘ │ │ └────┘ │ │
│ └────────┘ └────────┘ └────────┘ │
│ └──── Auto Scaling Group (managed) ────┘ │
└──────────────────────────────────────────────────────────┘
Create a Managed Node Group
CLI
$ eksctl create nodegroup \
--cluster demo \
--name general \
--node-type m5.large \
--nodes 3 \
--nodes-min 2 \
--nodes-max 10
Config File
managedNodeGroups:
- name: general
instanceType: m5.large
desiredCapacity: 3
minSize: 2
maxSize: 10
volumeSize: 50
volumeType: gp3
privateNetworking: true
labels:
role: general
environment: production
tags:
Team: platform
iam:
withAddonPolicies:
imageBuilder: true # ECR access
autoScaler: true # Cluster Autoscaler
ebs: true # EBS CSI driver
efs: true # EFS CSI driver
cloudWatch: true # CloudWatch agent
Max Pods Per Instance Type
EKS limits pods per node based on the number of ENIs and IPs per ENI:
| Instance Type | ENIs | IPs per ENI | Max Pods |
|---|---|---|---|
| t3.medium | 3 | 6 | 17 |
| t3.large | 3 | 12 | 35 |
| m5.large | 3 | 10 | 29 |
| m5.xlarge | 4 | 15 | 58 |
| m5.2xlarge | 4 | 15 | 58 |
Formula: Max Pods = (Number of ENIs × IPs per ENI) - 1
Node Group Updates
Managed node groups support rolling updates that respect PodDisruptionBudgets:
# Update AMI (triggers rolling replacement)
$ eksctl upgrade nodegroup \
--name general \
--cluster demo \
--kubernetes-version 1.29
# Scale
$ eksctl scale nodegroup --cluster demo --name general --nodes 5
Common Mistakes
| Mistake | Fix |
|---|---|
| Too few max nodes | Set maxSize high enough for scaling |
No privateNetworking: true |
Nodes get public IPs |
| Missing IAM addon policies | Pods can’t access AWS services |
| Only one instance type | Use mixed types for availability |
Quick Reference
# List node groups
$ eksctl get nodegroup --cluster demo
# Scale
$ eksctl scale nodegroup --cluster demo --name general --nodes 5
# Delete
$ eksctl delete nodegroup --cluster demo --name general
What’s Next?
For full control, see Self-Managed Nodes.