クラスタ オートスケーラーについて

このドキュメントでは、ノードプールのサイズを自動的に制御するクラスタ オートスケーラーについて説明します。クラスタ オートスケーラーは、ノードプール内のノード数の最小値と最大値を指定すると有効になります。これらの値は、ノードプールの作成またはノードプールの更新時に指定します。

ノードプールの自動スケーリング

クラスタ オートスケーラーは、ワークロードの需要に基づいて、特定のノードプール内のノード数を自動的に変更します。ノードを手動で追加または削除する必要はありません。また、ノードプールを過剰にプロビジョニングする必要もありません。ノードプールの最小サイズと最大サイズを指定するだけで、あとは自動的に設定されます。

クラスタの自動スケーリング中にリソースを削除または移動する必要がある場合は、ワークロードが一時的に中断する可能性があります。たとえば、ワークロードが 1 つのレプリカを持つコントローラで構成されている場合、現在のノードを削除すると、レプリカの Pod は別のノードに再スケジュールされる可能性があります。このため、一時的な中断が発生する可能性を許容するようにワークロードを設計するか、重要な Pod で割り込みが発生しないように設計する必要があります。

クラスタ オートスケーラーの仕組み

クラスタ オートスケーラーはノードプール単位で機能します。クラスタ オートスケーラーを使用してノードプールを構成する場合は、ノードプールの最小サイズと最大サイズを指定します。ノードプールの作成またはノードプールの更新時に、最小サイズと最大サイズを変更できます。

クラスタ オートスケーラーは、実際のリソース使用率ではなく、ノードプール内のリソース要求に基づいて、ノードプールのサイズを自動的に増減します。クラスタ オートスケーラーは、Pod オブジェクトがスケジュール不可能であり、リクエストに対応するためのノードプール内の容量が不足している場合にノードを追加します。

クラスタ オートスケーラーは、ノードが十分に活用されておらず、すべての Pod オブジェクトが少数のノードでスケジュールされる可能性がある場合にも、ノードを削除します。ノードが 10 分後に正常にドレインされなかった場合、ノードは強制終了されます。この期間は構成できません。

Pod がリクエストするリソースが少なすぎる場合(たとえば、デフォルト値が過小な場合)、クラスタ オートスケーラーは状況を改善できません。クラスタ オートスケーラーが正常に動作するように、すべてのワークロードで適切なリソース リクエストを行う必要があります。詳細については、コンテナのリソースの管理をご覧ください。

動作条件

クラスタ オートスケーラーは、次のことを前提としてノードプールのサイズを変更します。

  • 複製対象のすべての Pod オブジェクトを、他のノードで再起動できるものとします。これにより、短い中断が発生する可能性があります。ワークロードが中断を許容しない場合は、自動スケーリングを無効にしてノードプールで実行するようにワークロードを構成します。詳細については、ノード taint を使用してスケジューリングを制御するをご覧ください。
  • クラスタ オートスケーラーは、手動で行ったノード管理オペレーションをオーバーライドできます。
  • 1 つのノードプール内のすべてのノードは同じラベルセットを持つものとします。
  • クラスタ オートスケーラーは、スケールアップ後にアイドル状態の CPU または未使用のメモリを持つ最小限のノードグループを選択します。この動作は、同じクラスタ内に異なるサイズのノード(たとえば、ハイ CPU やハイメモリ ノード)がある場合に、どのノードプールがスケールアップされるかに影響します。

ノードプールの最小サイズと最大サイズ

min-nodes フラグと max-nodes フラグを使用して、クラスタ内の各ノードプールの最小サイズと最大サイズを指定できます。 自動スケーリングを無効にするには、min-nodesmax-nodes を同じ値に設定します。クラスタ オートスケーラーは、このサイズの範囲内でスケーリングの決定を実行します。

ノードプールの最大サイズを設定する際には、すべてのワークロードを実行するのに十分な大きさであることを確認してください。クラスタ内のノードプールにすべてのワークロードを実行するのに十分なメモリと CPU がない場合、停止する可能性があります。

PodDisruptionBudget を使用してワークロードを保護する

PodDisruptionBudget を使用すると、GKE on AWS を構成してワークロードの中断を防ぐことができます。PodDisruptionBudget を作成するときは、使用可能な Pod レプリカの最小数、または特定のタイミングで使用できない可能性がある Pod レプリカの最大数を指定します。詳細については、アプリケーションの停止予算を指定するをご覧ください。

ゼロノードからスケールアップする

次の GKE on AWS バージョン以降では、クラスタ オートスケーラーはゼロノードからのノードプールのスケールアップをサポートしています。

  • バージョン 1.29 以降
  • 1.28.8-gke.800 以降のバージョン 1.28
  • 1.27.12-gke.800 以降のバージョン 1.27

これらバージョンより前のバージョンを使用している場合、この機能を使用するには、クラスタを上記のバージョンのいずれかにアップグレードする必要があります。既存のクラスタでこの機能を有効にするには、クラスタをサポート対象バージョンに更新してから、Kubernetes バージョンを更新することでノードプールのローリング アップデートを実行します。ノードプールの更新の詳細については、ノードプールを更新するをご覧ください。

クラスタ オートスケーラーは、参照できるノードがない場合でも、スケーリングの決定時にノードプールで定義したラベルと taint を使用します。GKE on AWS は、ノードプールの基盤となる AWS Auto Scaling グループに必要なラベルと taint タグを自動的に設定します。これらのタグの詳細については、AWS のクラスタ オートスケーラー構成について説明している GitHub ページで自動検出の設定をご覧ください。

これらのラベルと taint タグを設定すると、GKE on AWS は、クラスタ オートスケーラーによって正確なノード テンプレートを作成できます。ノード テンプレートは、ノードプールに物理ノードが存在しない場合でも、正しいノード構成、ラベル、taint を含むノードの仮想表現です。このような正確なノード テンプレートを使用すると、クラスタ オートスケーラーは正しいスケールアップの判断を行うことができます。

ノードプールで taint を構成する場合、AWS Auto Scaling グループには制限が課せられます。つまり、キーが同一で値と効果の組み合わせが違う複数の taint を適用する場合、クラスタ オートスケーラーは、重複キーを持ち、最後に適用された taint のみを考慮します。

次のステップ