クラスタ オートスケーラー

このページでは、ワークロードの需要に応じて、Standard Google Kubernetes Engine(GKE)クラスタのノードプールのサイズを自動的に変更する方法について説明します。需要が高い場合、クラスタのオートスケーラーはノードプールにノードを追加します。需要が少ない場合、クラスタのオートスケーラーは指定した最小サイズにスケールダウンします。これにより、ワークロードの可用性が向上し、コストも抑えられます。クラスタ オートスケーラーの構成方法については、クラスタの自動スケーリングをご覧ください。

Autopilot クラスタを使用すると、ノードプールがノード自動プロビジョニングによって自動的にプロビジョニングされ、またワークロードの要件に合わせて自動的にスケーリングされるため、ノードのプロビジョニングやノードプールの管理について心配する必要はありません。

概要

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

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

クラスタ オートスケーラーのパフォーマンスを向上させるには、イメージ ストリーミングを使用します。これにより、対象となるコンテナ イメージから必要なイメージデータがリモートでストリーミングされると同時に、イメージがローカルのキャッシュに保存され、新しいノードのワークロードが迅速に開始できるようにします。

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

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

クラスタ オートスケーラーは、ノードプールの基盤となる Compute Engine マネージド インスタンス グループ(MIG)で仮想マシン(VM)インスタンスを追加または削除して、ノードプールのサイズを自動的に調整します。クラスタ オートスケーラーは、実際のリソース使用率ではなくノードプールのノードで実行されている Pod のリソース リクエスト数に基づいてスケーリングを決定します。Pod とノードのステータスを定期的にチェックし、次の処理を行います。

  • ノードプール内のノード数が不足しているためにポッドのスケジューリングができない場合、クラスタ オートスケーラーはノードプールの最大サイズまでノードを追加します。
  • ノードの使用率が低く、ノードプール内のノード数を少なくしてもすべてのポッドのスケジューリングが可能な場合、クラスタ オートスケーラーはノードプールの最小サイズになるまでノードを削除します。クラスタ内の他のノードに移動できないノードに Pod がある場合、クラスタ オートスケーラーはそのノードをスケールダウンしません。Pod を他のノードに移動できるが、タイムアウト期間(現在は 10 分)の経過後にノードを正常にドレインできない場合、ノードは強制終了されます。GKE クラスタの猶予期間は構成できません。スケールダウンの仕組みについて詳しくは、クラスタ オートスケーラーのドキュメントをご覧ください。

ポッドがリクエストするリソースが少なすぎる場合(あるいは、実際の要件に対して過小なデフォルト値をそのまま使用している場合)、ノードでリソース不足が発生しても、クラスタ オートスケーラーで状況を改善することができません。クラスタ オートスケーラーが正常に動作するように、すべてのワークロードに明示的なリソース リクエストを行う必要があります。

動作条件

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

  • 複製対象のすべてのポッドを、他のノードで再起動できるものとします。これにより、短い中断が発生する可能性があります。サービスの中断が許可されない場合、クラスタ オートスケーラーの使用はおすすめしません。
  • ユーザーまたは管理者がノードを手動で管理しないものとします。手動で行ったノード管理オペレーションは無効になる可能性があります。
  • 1 つのノードプール内のすべてのノードは同じラベルセットを持つものとします。
  • クラスタ オートスケーラーは、各プール内のインスタンス タイプの相対的なコストを考慮し、最もコストのかからないノードプールを拡張しようとします。コストを削減するために、ノードプールに Spot VM を使用することも考慮されます。
  • 最初のクラスタまたはノードプールの作成後に手動で追加されたラベルは追跡されません。クラスタ オートスケーラーによって作成されたノードには、ノードプールの作成時に --node-labels で指定されたラベルが割り当てられます。
  • GKE バージョン 1.21 以前では、クラスタ オートスケーラーはノードプールの既存のノードの taint 情報をノードプール全体を表すものと見なします。GKE バージョン 1.22 以降、クラスタ オートスケーラーは、クラスタ内の既存のノードとノードプールからの情報を結合します。クラスタ オートスケーラーは、ノードとノードプールのスケールアップの手動変更を検出します。

ゾーン間での均衡化

ノードプールに同じインスタンス タイプを持つ複数のマネージド インスタンス グループが含まれている場合、クラスタ オートスケーラーは、スケールアップ時にこうしたマネージド インスタンス グループのサイズの均衡化を図ります。これにより、ノードプールの複数のゾーン内にあるマネージド インスタンス グループ間でノードの分配が不均一になる事態を回避できます。

クラスタ オートスケーラーが均衡化の決定を下す仕組みについては、クラスタ オートスケーラーのドキュメントをご覧ください。

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

クラスタ内の各ノードプールに最小サイズと最大サイズをそれぞれ指定できます。クラスタ オートスケーラーは、この範囲内で再スケーリングを決定します。自動スケーリングを有効にした場合は、現在のノードプール サイズが指定された最小サイズを下回るか、最大サイズを上回ると、ノードプールに新しいノードが必要になるか、ノードプールからノードを安全に削除できるようになるまで、オートスケーラーは反映を待機します。

自動スケーリングの制限

クラスタ オートスケーラーがノードプールをスケーリングするときに使用するノードの最小数と最大数を設定できます。クラスタのノードが複数のゾーンにある場合、ノードの最小数と最大数はそれぞれのゾーンに適用されます。

たとえば、次のコマンドでは、6 ノードから構成される自動スケーリングのマルチゾーン クラスタを 3 つのゾーンに作成します。各ゾーンの最小ノード数は 1、最大ノード数は 4 になります。

gcloud container clusters create example-cluster \
  --num-nodes 2 \
  --zone us-central1-a \
  --node-locations us-central1-a,us-central1-b,us-central1-f \
  --enable-autoscaling --min-nodes 1 --max-nodes 4

この例では、クラスタの合計サイズは 3~12 ノードで、これらのノードは 3 つのゾーンに分散しています。いずれかのゾーンで障害が発生すると、クラスタの合計サイズは 2~8 ノードになります。

指定可能なフラグの一覧については、gcloud container clusters create のドキュメントをご覧ください。

自動スケーリング プロファイル

ノードを削除するタイミングを決定することは、使用率の最適化とリソースの可用性とのトレードオフです。使用率の低いノードを削除するとクラスタの使用率は向上しますが、新しいワークロードの実行の際に、リソースが再度プロビジョニングされるのを待機しなければならない状況が生じる可能性があります。

このような決定を行うときに使用する自動スケーリング プロファイルを指定できます。 現在使用できるプロファイルは次のとおりです。

  • balanced: デフォルトのプロファイル。
  • optimize-utilization: クラスタ内で余剰リソースを保持するよりも使用率の最適化を優先させます。選択すると、クラスタ オートスケーラーはクラスタをより積極的にスケールダウンします。つまり、ノードをより多く、より迅速に削除できます。

GKE バージョン 1.18 以降では、optimize-utilization 自動スケーリング プロファイルを有効にすると、すでに CPU またはメモリがすでに潤沢に割り当てられているノードで Pod をスケジューリングします。GKE バージョン 1.22 以降では、optimize-utilization 自動スケーリング プロファイルを有効にすると、Pod をスケジュールする際に GPU の割り当て量の多さも考慮されます。

optimize-utilization 自動スケーリング プロファイルを使用すると、クラスタ オートスケーラーが使用率の低いノードを特定して削除しやすくなります。この最適化を実現するために、GKE により Pod 仕様のスケジューラ名が gke.io/optimize-utilization-scheduler に設定されます。カスタム スケジューラを指定する Pod は影響を受けません。

次のコマンドを使用すると、既存のクラスタで optimize-utilization 自動スケーリング プロファイルが有効になります。

gcloud container clusters update CLUSTER_NAME \
    --autoscaling-profile optimize-utilization

Pod のスケジューリングと停止の考慮

スケールダウンする場合、クラスタ オートスケーラーは、ポッドに設定されているスケジューリング ルールとエビクション ルールを考慮します。この制限により、オートスケーラーによってノードが削除されるのを防ぐことができます。次のいずれかの条件を持つポッドが含まれていると、ノードの削除を防ぐことができます。

  • ポッドのアフィニティまたは反アフィニティ ルールにより、再スケジューリングが防止される。
  • ポッドが、Deployment、StatefulSet、Job、ReplicaSet などのコントローラによって管理されていない。
  • Pod にローカル ストレージがあり、GKE コントロール プレーン バージョンが 1.22 未満である。コントロール プレーン バージョン 1.22 以降の GKE クラスタでは、ローカル ストレージを使用する Pod でスケールダウンがブロックされなくなりました。

アプリケーションの PodDisruptionBudget でも、自動スケーリングを防止できます。ノードを削除すると予算を超過する場合、クラスタはスケールダウンされません。

クラスタ オートスケーラーの詳細と中断を防ぐ方法については、クラスタ オートスケーラーに関するよくある質問をご覧ください。

詳細情報

クラスタ オートスケーラーの詳細については、オープンソースの Kubernetes プロジェクトの自動スケーリングに関する FAQ をご覧ください。

制限事項

クラスタ オートスケーラーには次の制限があります。

既知の問題

  • GKE コントロール プレーンのバージョンが 1.22 より前の場合、GKE クラスタ オートスケーラーは空の(ゼロノード)クラスタですべてのノードプールのスケールアップを停止します。この動作は GKE バージョン 1.22 以降では発生しません。

次のステップ