Open15
Karpenter Best Practices

karpenterの機能
Karpenterは、Kubernetesクラスタ内のノードライフサイクル管理を強化するために設計されたオープンソースプロジェクトです。 Podの特定のスケジューリングニーズに基づいてノードのプロビジョニングとデプロビジョニングを自動化し、効率的なスケーリングとコストの最適化を可能にする。 主な機能は次のとおりです。
- リソースによりk8sクラスタにデプロイできないpodを監視
- そのpodをどのようにスケジューリングするか評価
- 要件に合うノードをプロビジョニング
- 不要なノードを削除する

karpenterを使う理由
- 従来のように多くのノードグループを作成する必要がなく、シンプルで柔軟なノード管理が可能(nodepool)
- CASのように特定のKubernetesバージョンに密接に依存せず、AWSとKubernetes API間の煩雑な操作が不要
- ノードの起動がより早い

karpenterベストプラクティス
WIP

変動するキャパシティが必要なワークロードにkarpenterを使う
- Karpenterは、需要が急増する期間や多様なコンピュート要件を持つワークロードを持つクラスタに最適
- MNGとASGは、より静的で一貫性のあるワークロードを実行するクラスタに適している
- 要件に応じて、動的に管理されるノードと静的に管理されるノードを混在させることができる

他のスケーラーが望ましい場合
- karpenterは比較的新しいプロジェクトである
- karpenterにない機能が必要であれば他の手段を検討するのが望ましい

karpenterのコントローラはEKS Fargate or NodeGroup Nodeで動かす
- karpenterが管理するノードでkarpenter controllerを動かさない
- ダウンするため

karpenter v1以上ではカスタム起動テンプレートを使わない
- v1以降ではカスタム起動テンプレートが利用できない
- 代わりにnodeclassで定義する

ワークロードに合わないインスタンスタイプを除外する
node.kubernetes.io/instance-typeキーで利用しないインスタンスタイプを選択する
こんな感じ
- key: node.kubernetes.io/instance-type
operator: NotIn
values:
- m6g.16xlarge
- m6gd.16xlarge
- r6g.16xlarge
- r6gd.16xlarge
- c6g.16xlarge

スポット使用時の中断処理を有効にする
- karpenterはspotインスタンスの中断処理をサポートしている
- 中断処理を利用する場合はNode Termination Handlerの利用は推奨されない
- データの保存や状態の記録が必要なpod、Graceful Drainingが必要なpodはスポットインスタンスの中断通知を利用して安全な中断を行う

外部に出れないEKSクラスタでのkarpenter利用
- 必要なVPCエンドポイントを用意する必要がある

nodepool作成
WIP

nodepoolを複数作成するパターン
各チームがクラスタを共有している、異なるworker nodeでワークロードを実行したい、OSやインスタンスタイプの要件が異なる場合などのときはnodepoolを複数作成する
複数のNodePoolsを使用することで、各チームに最適なworker nodeが利用できる

nodepoolを指定できるようにする
- taintやnodeaffinityなどが必要なノードプールを作成する
- 複数のノードグループがマッチした場合、予期しないノードを利用する可能性があるため

タイマー(TTL)を使用してクラスタからノードを自動的に削除する
- TTLを利用して、以下の場合にノードを削除する
- ワークロードを動かすpodがない(バッチジョブなど)
- 有効期限に達した
- 有効期限を設定することで、不要なノードをなくす、新バージョンのノードを使う
などが可能

spotインスタンスを利用する場合、インスタンスタイプの過度な制限は避ける
- KarpenterがSpotを使用する際は多様なインスタンスタイプを使用できるようにするのが望ましい
- karpenterがspotを調達する戦略は「price-capacity-optimized」が用いられる
- 短期的に中断する可能性が最も低いと思われるプールからスポットインスタンスをリクエスト
- これらのプールのうち最も価格の低いプールからスポットインスタンスを要求する