AWS instance types offer varying resources and can be selected by labels in your NodePool spec.template.spec.requirements. The values provided in this reference reflect resources available after instance overhead has been subtracted, with the following assumptions:
blockDeviceMappings are not configured
amiFamily is set to AL2023
How Karpenter discovers instance types
Karpenter calls the EC2 DescribeInstanceTypes and DescribeInstanceTypeOfferings APIs to discover the available instance types and their offerings (availability zone, capacity type) in your AWS region. This information is cached and periodically refreshed.
Karpenter uses this data to:
- Match NodePool requirements against available instance types
- Estimate instance costs for optimized bin-packing
- Select the best-fit instance type for each batch of pending pods
Karpenter filters out instance types that are incompatible with your NodePool requirements before considering them as candidates. Instance types in unsupported availability zones or without the requested capacity type (on-demand or spot) are automatically excluded.
Well-known labels
Karpenter annotates every node it launches with a rich set of labels describing the instance type’s properties. You can use these labels in nodeSelector, nodeAffinity, or NodePool requirements to influence scheduling.
Core labels
| Label | Description | Example |
|---|
node.kubernetes.io/instance-type | Full EC2 instance type name | m5.xlarge |
kubernetes.io/arch | CPU architecture | amd64, arm64 |
kubernetes.io/os | Operating system | linux |
topology.kubernetes.io/zone | Availability zone | us-east-1a |
karpenter.sh/capacity-type | Capacity type | on-demand, spot |
Karpenter AWS instance labels
| Label | Description | Example values |
|---|
karpenter.k8s.aws/instance-category | High-level instance category | a, c, m, r, g, p, inf, trn |
karpenter.k8s.aws/instance-family | Instance family | m5, c6g, p4d |
karpenter.k8s.aws/instance-generation | Generation number | 5, 6, 7 |
karpenter.k8s.aws/instance-size | Instance size | large, xlarge, 2xlarge, metal |
karpenter.k8s.aws/instance-cpu | vCPU count | 2, 4, 8, 96 |
karpenter.k8s.aws/instance-cpu-manufacturer | CPU manufacturer | aws, intel, amd |
karpenter.k8s.aws/instance-cpu-sustained-clock-speed-mhz | Sustained CPU clock speed in MHz | 3400, 2500 |
karpenter.k8s.aws/instance-memory | Total memory in MiB | 4096, 32768 |
karpenter.k8s.aws/instance-ebs-bandwidth | EBS bandwidth in Mbps | 4750, 19000 |
karpenter.k8s.aws/instance-network-bandwidth | Network bandwidth in Mbps | 1250, 25000 |
karpenter.k8s.aws/instance-hypervisor | Hypervisor type | nitro, xen, “ (bare metal) |
karpenter.k8s.aws/instance-encryption-in-transit-supported | Supports encryption in transit | true, false |
karpenter.k8s.aws/instance-local-nvme | Local NVMe storage in GB (if present) | 75, 900, 3800 |
karpenter.k8s.aws/instance-capability-flex | Flex capacity support | true, false |
GPU and accelerator labels
For GPU and accelerator instances (e.g., p, g, inf, trn families), Karpenter also surfaces:
| Label | Description | Example |
|---|
karpenter.k8s.aws/instance-gpu-name | GPU model name | a100, v100, t4 |
karpenter.k8s.aws/instance-gpu-manufacturer | GPU manufacturer | nvidia, aws |
karpenter.k8s.aws/instance-gpu-count | Number of GPUs | 1, 4, 8 |
karpenter.k8s.aws/instance-gpu-memory | GPU memory in MiB | 16384, 40960 |
karpenter.k8s.aws/instance-accelerator-name | Accelerator name (e.g. for Inferentia/Trainium) | inferentia, trainium |
karpenter.k8s.aws/instance-accelerator-manufacturer | Accelerator manufacturer | aws |
karpenter.k8s.aws/instance-accelerator-count | Number of accelerators | 1, 16 |
Architecture options
Karpenter supports both x86-64 (amd64) and ARM (arm64) architectures. The architecture is surfaced on the standard kubernetes.io/arch label.
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: arm64-pool
spec:
template:
spec:
requirements:
- key: kubernetes.io/arch
operator: In
values: ["arm64"]
- key: karpenter.k8s.aws/instance-category
operator: In
values: ["c", "m", "r"]
ARM-based Graviton instances (arm64) typically offer better price/performance for compute-intensive workloads. Look for instance families ending in g (e.g., c6g, m7g, r8g) for Graviton instances.
Filtering instance types in NodePools
Use spec.template.spec.requirements to constrain which instance types Karpenter can select. Requirements use standard Kubernetes label selectors with In, NotIn, Exists, DoesNotExist, Gt, and Lt operators.
Select by family
spec:
template:
spec:
requirements:
- key: karpenter.k8s.aws/instance-family
operator: In
values: ["m5", "m6i", "m7i"]
Select by category and minimum CPU
spec:
template:
spec:
requirements:
- key: karpenter.k8s.aws/instance-category
operator: In
values: ["c", "m"]
- key: karpenter.k8s.aws/instance-cpu
operator: Gt
values: ["7"] # more than 7 vCPUs (i.e., 8+)
Exclude specific sizes
spec:
template:
spec:
requirements:
- key: karpenter.k8s.aws/instance-size
operator: NotIn
values: ["nano", "micro", "small", "medium", "large"]
Require local NVMe storage
spec:
template:
spec:
requirements:
- key: karpenter.k8s.aws/instance-local-nvme
operator: Exists
GPU workloads
To schedule GPU workloads, express the GPU resource requirement on your pod and add a matching NodePool:
# Pod spec requesting a GPU
resources:
limits:
nvidia.com/gpu: "1"
# NodePool for GPU instances
spec:
template:
spec:
requirements:
- key: karpenter.k8s.aws/instance-gpu-manufacturer
operator: In
values: ["nvidia"]
- key: karpenter.k8s.aws/instance-category
operator: In
values: ["g", "p"]
Instance family reference
The following tables give a representative overview of the instance families Karpenter can discover. This list is not exhaustive — Karpenter queries the EC2 API dynamically and will include all types available in your region.
Compute-optimized (c family)
| Family | Architecture | Manufacturer | Notes |
|---|
c1 | amd64 | intel | Previous generation |
c3 | amd64 | intel | Previous generation |
c4 | amd64 | intel | Previous generation |
c5 | amd64 | intel | Nitro hypervisor |
c5a | amd64 | amd | Nitro, encryption-in-transit |
c5ad | amd64 | amd | Nitro, local NVMe |
c5d | amd64 | intel | Nitro, local NVMe |
c5n | amd64 | intel | Enhanced networking |
c6a | amd64 | amd | 6th gen AMD |
c6g | arm64 | aws | AWS Graviton2 |
c6gd | arm64 | aws | Graviton2, local NVMe |
c6i | amd64 | intel | 6th gen Intel |
c7g | arm64 | aws | AWS Graviton3 |
c7i | amd64 | intel | 7th gen Intel |
General-purpose (m family)
| Family | Architecture | Manufacturer | Notes |
|---|
m1, m2, m3 | amd64 | intel | Previous generation |
m4 | amd64 | intel | Previous generation |
m5, m5a, m5d | amd64 | intel/amd | Nitro |
m6a | amd64 | amd | 6th gen AMD |
m6g | arm64 | aws | AWS Graviton2 |
m6i | amd64 | intel | 6th gen Intel |
m7g | arm64 | aws | AWS Graviton3 |
m7i | amd64 | intel | 7th gen Intel |
Memory-optimized (r family)
| Family | Architecture | Notes |
|---|
r3, r4 | amd64 | Previous generation |
r5, r5a, r5d | amd64 | Nitro |
r6a | amd64 | 6th gen AMD |
r6g | arm64 | AWS Graviton2 |
r6i | amd64 | 6th gen Intel |
r7g | arm64 | AWS Graviton3 |
r7i | amd64 | 7th gen Intel |
x1, x1e, x2 | amd64 | High memory |
GPU and accelerator instances
| Family | GPU/Accelerator | Use case |
|---|
g4dn, g5 | NVIDIA T4 / A10G | ML inference, graphics |
p3, p4d, p5 | NVIDIA V100 / A100 / H100 | ML training |
inf1, inf2 | AWS Inferentia | ML inference |
trn1 | AWS Trainium | ML training |
GPU instance types require you to use an AMI that includes the appropriate GPU drivers (e.g., the NVIDIA driver for NVIDIA GPUs). Ensure your EC2NodeClass amiSelectorTerms selects an AMI with the correct drivers installed.
Available resources per node
The resources reported per node reflect allocatable capacity after Karpenter subtracts instance overhead. The key resources are:
| Resource | Description |
|---|
cpu | Allocatable CPU in millicores |
memory | Allocatable memory in MiB |
ephemeral-storage | Ephemeral storage (default 17Gi) |
pods | Maximum number of pods supported |
vpc.amazonaws.com/pod-eni | ENI-based pod IPs (Nitro instances only) |
For example, a c5.xlarge reports:
| Resource | Quantity |
|---|
| cpu | 3920m |
| ephemeral-storage | 17Gi |
| memory | 6584Mi |
| pods | 58 |
| vpc.amazonaws.com/pod-eni | 18 |
Allocatable CPU and memory are lower than the raw instance specs because Karpenter accounts for Kubernetes system overhead (kubelet, OS processes) and the VM memory overhead percent configured via VM_MEMORY_OVERHEAD_PERCENT.