Karpenter - About Karpenter
Karpenter (https://karpenter.sh/) はKubernetes Cluster AutoscalerとしてKubernetes ComputeResourceであるNodeのScalingやLifecycleを管理するためのアドオンです。Cluster Autoscaler が有名かと思いますがKarpenterはそちらのいくつかの課題点を解決し、かつsimpleな設定で管理することが可能になっています。
Karpenterの役割
Karpenterは以下のような役割を行います。
- kube-schedulerがUnschedulableとしたPodの検知
- Unschedulable PodのPod Scheduling constraintsの評価
- resource requests, nodeselectors, affinities, tolerations, and topology spread constraints
- Node Provisioning
- 不要なNodeの削除
Kubernetes Cluster Autoscalerの課題
Karpenterは Cluster Autoscaler のいくつかの課題点を解決するためにAWSによって開発され今はkubernetes-sigs projectに
課題とKarpenterの機能紹介についてはAWS Summit 2024の Amazon EKS + Karpenter で始めるスケーラブルな基盤作り がとても参考になりました。
Kubernetes Nodeを柔軟にSchedulingできない
Info
Karpenterでは NodePool CRDのrequirements section で必要と想定されるEC2 Instance Type, Zone, Architecture, Operating System, Capacity Type(spot or on-demand) などを指定します。Pod Scheduling constraintsを評価した結果、これらの条件に当てはまるNodeをProvisioningします。

Cluster AutoscalerはNode Groupに対してスケーリングを行いますが、AWSでは "Node Group = ASG" となります。ASGは (Kubernetes Nodeではなく)EC2のスケーリングに特化しています。
ASGでは柔軟にインスタンスタイプやZONEを指定できません。複数のインスタンスタイプを指定できますがどのインスタンスタイプで起動するのかはASGで決めます。そのためPod Scheduling constraintsを満たすインスタンスタイプを指定して起動することができません。
https://docs.aws.amazon.com/autoscaling/ec2/userguide/allocation-strategies.html
Amazon EC2 Auto Scaling launches whichever instance types have the lowest price per your assigned weight values (for example, per vCPU) at the time of fulfillment.
複数のWorkloadsをサポートするためには様々InstanceTypeをサポートする必要があります。Kubernetes Cluster Autoscalerでは複数のNode Groupを作成・管理する必要があり煩雑になってしまいます。
Kubernetes NodeのProvisioningに時間がかかる
Info
Karpenterでは直接EC2 Fleet APIを呼び出してProvisioningします。EC2の管理をASGではなくKarpenter自身が行うためオーバーヘッドが発生しません。

Cluster AutoscalerはUnschedulable Podを検知したらNode group、つまりASGのDesired Capacityの値を変更します。NodeのProvisioningはASGが実施します。そのためEC2 Provisioningまでにオーバーヘッドが存在します。