AWSは最近Karpenterをリリースした。オープンソースのKubernetesクラスタオートスケーラーだ。簡単に構成できる完全に自動化されたスケジューラにより、Kubernetesクラスタオートスケーラーが改善される。Karpenterにより、スケジュールされていないポッドが監視され、新しいノードが起動したり、不要なインフラストラクチャを終了したりするできる。Karpenterは、あらゆる環境のあらゆるKubernetesクラスタで動作するように設計されている。
Karpenterは、スケジュールされていないポッドの集約リソース要求を監視できる。これにより、必要に応じて起動や終了を決定し、クラスタのパフォーマンスとコストを最適化できる。AWSの主任ディベロッパーアドボケートのChanny Yun氏によると、Karpenterは「多数の多様なコンピューティングリソースの迅速なプロビジョニングあるいはプロビジョニング解除が要求されるユースケースで特に優れたパフォーマンスを発揮する」。
Karpenterのデフォルトプロビジョナーでは、いくつかの制約を設定できる。例えば、Karpenterが作成したノードで実行できるポッドの数を制限するTaintを定義したり、ノードの有効期限のデフォルトを設定できる。プロビジョナーは、Kubernetesの用意されているラベルを使って設定することもできる。これによって、ポッドがインスタンスタイプ、アーキテクチャ、ゾーンに基づいて特定のインスタンスのみをリクエストできるようになる。リリース時点では、kubernetes.io/arch
、node.kubernetes.io/instance-type
、topology.kubernetes.io/zone
ラベルのみがKarpenterに実装されている。
Karpenterでは複数のプロビジョナーを宣言できる。Karpenterでは、構成された各プロビジョナーをループし、複数一致する場合は、使用するプロビジョナーをランダムに選択する。そのため、プロビジョナーが相互に排他的であることを確認することが推奨される。
ポッドを実行するために選択されるノードは、さまざまな方法で制限をかけることができる。Karpenterは、ノードに一定量の使用可能なメモリまたはCPUがあることの要求をサポートする。Karpenterは、ラベルに基づいてノードを選択するだけでなく、ノードアフィニティもサポートする。ノードアフィニティを使うと、キーと値のペアで表される目的の属性を持つノードを選択できる。たとえば、選択したノードが指定されたゾーン内にあり、特定の容量タイプを利用していることを確認するには、次のものを使用できる。
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "karpenter.sh/capacity-type" # AND
operator: "In"
values: ["spot"]
- key: "topology.kubernetes.io/zone" # AND
operator: "In"
values: ["us-west-2a, us-west-2b"]
Karpenterは、Kubernetesトポロジの拡散制約の使用もサポートする。これは、停止の影響を減らすために、プロビジョナーに対して使用可能なノード全体にポッドを分散させることを要求するものである。これには、maxSkew
プロパティを使用する。maxSkew
が1の場合は、ホスト間でポッド数の差が1を超えてはいけないことを示す。
Karpenterは、ポッドが空であると見なされたノードを削除したり、ノードに有効期限を設定したりするためにも使用できる。Karpenterには、プロビジョニングされたノードにファイナライザーを追加でき、kubectl delete node
の動作を変更できる。Karpenterでは、ノードがドレインされた後に、ベースになるインスタンスが削除される。
Karpenterは、GitHubからApache License2.0の下で利用できる。Helmでインストールでき、コンピューティングリソースをプロビジョニングするには、環境内にいくつかのアクセス許可が必要となる。