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

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

概要

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

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

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

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

クラスタ オートスケーラーは、実際のリソース使用率ではなく、ノードプールのノードで実行されているポッドのリソース要求数に基づいて、ノードプールのサイズを自動的に調整します。ポッドとノードのステータスを定期的にチェックし、次の処理を行います。

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

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

動作条件

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

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

ゾーン間での均衡化

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

クラスタ オートスケーラーが均衡化の決定を下す仕組みについては、Kubernetes ドキュメントの自動スケーリングに関するよくある質問をご覧ください。

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

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

自動スケーリングの制限

クラスタの自動スケーリングを行う場合、ノードプールのスケーリング制限はゾーンの可用性によって決まります。

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

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

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

ポッドのスケジューリングと停止の考慮

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

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

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

詳細情報

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

制限事項

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

  • クラスタ オートスケーラーは、それぞれ 30 個のポッドを実行するノードを 1,000 個までサポートします。スケーラビリティの保証の詳細については、スケーラビリティ レポートをご覧ください。
  • スケールダウンの場合、ノードのポッドを別のノードに再スケジューリングするため、クラスタ オートスケーラーは 10 分間の猶予期間を使用します。この期間が経過すると、ノードを強制終了します。
  • 場合によっては、クラスタ オートスケーラーが完全にスケールダウンされず、スケールダウン後に余分なノードが存在することがあります。これは、必要なシステムポッドが別のノード用にスケジュールされているときに発生する可能性があります。これらのポッドを別のノードに移動するためのトリガーがないためです。使用率が低いノードがいくつかありますが、スケールダウンされません。どうしてでしょうか?をご覧ください。この制限を回避するには、ポッド停止予算を構成できます。

次のステップ