Skip to content

Karpenter - About Karpenter

Karpenter (https://karpenter.sh/) はKubernetes Cluster AutoscalerとしてKubernetes ComputeResourceであるNodeのScalingやLifecycleを管理するためのアドオンです。Cluster Autoscaler が有名かと思いますがKarpenterはそちらのいくつかの課題点を解決し、かつsimpleな設定で管理することが可能になっています。

Karpenterの役割

Karpenterは以下のような役割を行います。

  1. kube-schedulerがUnschedulableとしたPodの検知
  2. Unschedulable PodのPod Scheduling constraintsの評価
    • resource requests, nodeselectors, affinities, tolerations, and topology spread constraints
  3. Node Provisioning
  4. 不要な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します。

引用元: https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Karpenter-Basic_1204_v1.pdf
Figure 1: 引用元: https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Karpenter-Basic_1204_v1.pdf

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自身が行うためオーバーヘッドが発生しません。

引用元: https://pages.awscloud.com/rs/112-TZM-766/images/AWS-36_DNB-ISV_AWS_Summit_JP_2024.pdf
Figure 2: 引用元: https://pages.awscloud.com/rs/112-TZM-766/images/AWS-36_DNB-ISV_AWS_Summit_JP_2024.pdf

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

References