Before touching Karpenter, we lay the foundation: the Kubernetes, AWS, kubectl, and Helm skills you must have, then set up an EKS environment with Karpenter 1.14.0 installation, IAM role, and controller verification.

Welcome to the Learn Karpenter series. This series is designed for Platform Engineers, DevOps Engineers, SREs, and Kubernetes Administrators who want to build fast, efficient, and cost-effective node autoscaling for Kubernetes clusters on AWS. Throughout the series we will cover architecture, NodePool and NodeClass, consolidation, drift detection, all the way to production deployment.
Episode 0 is the gateway. Before you can run Karpenter, two things must be prepared: the skills that serve as prerequisites and the environment where Karpenter runs. If either one is missing, the hands-on episodes that follow will feel heavy. That's why this episode does not go deep into Karpenter yet — its focus is on making sure your foundation is solid first.
Karpenter is a scheduling-aware controller that interacts directly with the Kubernetes API and AWS. There are three groups of skills you must possess.
Understand the pod lifecycle — from Pending, Running, to Completed — especially the Unschedulable condition, which is the main trigger for Karpenter. You should also be familiar with taints and tolerations as well as nodeSelector. Without these three, it's hard to understand how Karpenter decides what kind of node to create.
Karpenter calls the AWS API directly to launch instances. You need to understand: EKS as the control plane, EC2 instance types and AMIs, security groups, subnets inside a VPC, and IAM roles. All of these concepts will keep showing up — especially in episode 5 when we discuss EC2NodeClass.
Karpenter is installed via a Helm chart and managed with kubectl. You also need to understand how a pod is rejected by the scheduler when no matching node exists — for example, through the output of kubectl describe pod. This habit of reading events and statuses will help you a lot when debugging Karpenter.
Tip
Not confident with taints and tolerations yet? Take the time to finish the Learn Kubernetes series on this site before continuing. Karpenter relies heavily on scheduling knowledge, and both concepts will appear frequently in NodePool examples.
Here's the list of tools that must be installed on your local machine.
| Tool | Purpose |
|---|---|
| eksctl | Create and manage EKS clusters |
| aws CLI | AWS authentication and resource inspection |
| kubectl | Manage Kubernetes resources |
| Helm | Install the Karpenter chart |
| docker | Build test workload images |
Verify each one with the following commands:
eksctl version
aws --version
kubectl version --client
helm version
docker versionMake sure your AWS credentials are configured and have permission to create EKS, EC2, and IAM resources. Run aws sts get-caller-identity to confirm your session is valid before continuing.
Karpenter 1.14.0 supports Kubernetes 1.29 to 1.36. Create an EKS cluster with one small vended nodegroup — this nodegroup will only run system components, while workloads will later be handled by Karpenter.
eksctl create cluster \
--name learn-karpenter \
--version 1.32 \
--region ap-southeast-1 \
--nodegroup-name system \
--node-type m5.large \
--nodes 1 \
--managedThis process usually takes 10-15 minutes. Once finished, the kubeconfig is updated automatically. Verify with kubectl cluster-info and kubectl get nodes until all nodes report Ready.
Karpenter needs permissions to launch instances, create security groups, and manage EC2 resources. The best practice is to use IRSA (IAM Roles for Service Accounts) with a minimal policy — instead of storing AWS access keys inside the cluster.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:RunInstances",
"ec2:CreateFleet",
"ec2:TerminateInstances",
"ec2:DescribeInstances",
"ec2:DescribeSubnets"
],
"Resource": "*"
}
]
}Once the policy is created, attach it to the Karpenter service account with eksctl:
eksctl create iamserviceaccount \
--cluster learn-karpenter \
--namespace karpenter \
--name karpenter \
--role-name karpenter-irsa \
--attach-policy-arn arn:aws:iam::ACCOUNT_ID:policy/KarpenterControllerPolicy \
--approveReplace ACCOUNT_ID with your AWS account number. Terraform or CloudFormation can also be used to create this role — the key principle remains the same: least privilege.
Karpenter is installed via the karpenter Helm chart distributed from the OCI registry at ghcr.io. This chart also installs the NodePool and EC2NodeClass CRDs.
helm upgrade --install karpenter oci://ghcr.io/aws/karpenter/charts/karpenter \
--namespace karpenter \
--create-namespace \
--set serviceAccount.annotations."eks\.amazonaws\.com/role-arn"=arn:aws:iam::ACCOUNT_ID:role/karpenter-irsa \
--version 1.14.0Important
The correct order: create the IAM role first, then install the controller. Karpenter also needs a security group and subnet that it can discover via tag discovery, for example karpenter.sh/discovery: learn-karpenter. We'll cover these tags in depth in episode 5.
Make sure the controller is running and its version is correct:
kubectl get pods -n karpenter
kubectl logs -n karpenter deployment/karpenter --tail=20If healthy, you'll see the controller pod in Running status. Also confirm the CRDs are registered:
kubectl get crd nodepools.karpenter.sh
kubectl get crd ec2nodeclasses.karpenter.k8s.awsFinally, prepare a test workload for use in the upcoming episodes:
kubectl create deployment nginx --image=nginx
kubectl rollout status deployment/nginxEpisode 0 equips you with the skill and environment foundation. You've checked your local tools, created an EKS cluster with eksctl, built an IAM role on the least-privilege principle, installed Karpenter 1.14.0 via Helm, and verified that the controller and CRDs are running correctly.
Key takeaways:
kubectl get pods -n karpenter means the controller is ready to work.In episode 1 we'll step back for a moment and answer the big question: why Karpenter exists. We'll trace the history of node autoscaling, compare Cluster Autoscaler with Karpenter, and look at the latency, cost, and complexity problems it aims to solve. See you in the next episode!