How to Migrate from Cluster Autoscaler to Karpenter According to the Cast AI 2026 State of Kubernetes Optimization report, which analyzed 23,000+ clusters, the median CPU utilization across autoscaled EKS clusters is 8%, with 69% of Kubernetes clusters over-provisioning CPU. Cast AI's guide details how to migrate from Cluster Autoscaler to Karpenter, which provisions nodes in 45-90 seconds versus 3-5 minutes for Cluster Autoscaler, and supports running both tools simultaneously during cutover with a rollback path at every step. 8% average CPU utilization across autoscaled EKS clusters. That is the median, per the Cast AI 2026 State of Kubernetes Optimization report covering 23,000+ clusters. Fixed node groups drive the gap: provisioned for worst-case instance size, not actual pod demand. Karpenter replaces that model with just-in-time provisioning, sizes nodes to actual resource requests, and consolidates continuously. This guide covers the full migration: install Karpenter alongside Cluster Autoscaler, map node groups to NodePools, shift workloads incrementally, then remove the old stack. A rollback path exists at every step.Key takeaways Key takeaways - Karpenter provisions nodes in 45-90 seconds versus 3-5 minutes for Cluster Autoscaler varies by AMI caching, region, and instance type; AL2023 with warm pools can provision faster; times reflect typical EKS deployment without prewarming - You can run both tools simultaneously during cutover with proper workload isolation to prevent double-provisioning - Each node group maps to a NodePool plus EC2NodeClass pair - Rollback is possible at every step: keep Cluster Autoscaler installed throughout - Large enterprises including major SaaS companies have migrated to Karpenter at scale — AWS has documented multiple large-scale EKS migrations in their Architecture Blog Why teams migrate from Cluster Autoscaler to Karpenter The case for migrating comes down to three things: speed, flexibility, and waste reduction. Each has a direct production impact, and together they add up to a meaningful operational difference. Speed Karpenter provisions new nodes in 45-90 seconds varies by AMI caching, region, and instance type; AL2023 with warm pools can provision faster; times reflect typical EKS deployment without prewarming . Cluster Autoscaler typically takes 3-5 minutes. That gap compounds during traffic spikes when your cluster needs capacity quickly. Cluster Autoscaler works by scaling existing Auto Scaling Groups. It polls the Kubernetes API, identifies pending pods, and triggers ASG scale-out. The EC2 instance then needs time to register and join the cluster. Karpenter bypasses the ASG layer entirely. Instead, it calls the EC2 API directly and watches pod events in real time. Flexibility Cluster Autoscaler requires a separate node group for each combination of instance type and capacity type. Managing multiple groups with overlapping configurations adds operational overhead. Karpenter handles spot and on-demand in a single NodePool and selects across hundreds of instance types based on availability and cost. For a full comparison of both approaches and their trade-offs, see Karpenter vs Cluster Autoscaler https://cast.ai/blog/karpenter-vs-cluster-autoscaler/ . Waste reduction The Cast AI 2026 State of Kubernetes Optimization report, based on data from 23,000+ clusters, found that 69% of Kubernetes clusters over-provision CPU. Average CPU utilization across autoscaled clusters sits at 8%. Fixed node groups contribute to this problem because you provision for the largest expected node size, not for actual pod bin-packing needs. Karpenter’s consolidation policy actively removes underutilized nodes and repacks pods onto fewer, better-sized instances. This reduces the idle capacity you would otherwise pay for. For background on how Cluster Autoscaler handles scaling before you compare the two, see the Cluster Autoscaler guide https://cast.ai/blog/kubernetes-cluster-autoscaler/ . Prerequisites Before starting the migration, confirm you have everything below. Missing any one item causes silent provisioning failures that are frustrating to debug. EKS cluster requirements - EKS cluster running Kubernetes 1.27 or later - AWS CLI and kubectl configured with appropriate permissions - Helm 3.x installed locally IAM requirements - Karpenter controller IAM role using IRSA or EKS Pod Identity - Node IAM role: KarpenterNodeRole-${CLUSTER NAME} - Required managed policies: AmazonEKSWorkerNodePolicy, AmazonEKS CNI Policy, AmazonEC2ContainerRegistryReadOnly, AmazonSSMManagedInstanceCore Infrastructure tagging Tag your VPC subnets and security groups before installing Karpenter. Karpenter uses these tags to auto-discover networking resources through your EC2NodeClass configuration. karpenter.sh/discovery: ${CLUSTER NAME} Also check whether existing node groups use custom AMIs, GPU instances, or arm64 workloads. Each of these requires explicit configuration in your EC2NodeClass. For a broader introduction to how Karpenter selects instances and manages node lifecycles, see What is Karpenter https://cast.ai/blog/what-is-karpenter/ . Step by step: migrating from Cluster Autoscaler to Karpenter Install Karpenter Parallel-run isolation required. Cluster Autoscaler and Karpenter do not conflict by design. CA only manages nodes in ASGs it is explicitly configured to watch. Karpenter calls the EC2 API directly and registers nodes outside any CA-managed ASG, so CA cannot scale down or manage Karpenter nodes. The real isolation risk is at the pod level: pending pods without explicit routing may be scheduled to either autoscaler’s capacity. To guarantee which autoscaler handles which workloads: Option A — Taints + Tolerations recommended : Add a taint to your NodePool template: spec: template: spec: taints: - key: karpenter-managed value: "true" effect: NoSchedule Then add a toleration to pods that should run on Karpenter nodes: tolerations: - key: karpenter-managed value: "true" effect: NoSchedule Pods without this toleration will not schedule onto Karpenter nodes. Option B — NodeSelector: Add nodeSelector to your Karpenter NodePool template labels, then target that label in pod specs. Install Karpenter using Helm without removing Cluster Autoscaler first. Cluster Autoscaler continues managing its existing node groups. Karpenter only provisions nodes for pods that match its NodePool selectors. export CLUSTER NAME=