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

このページでは、Google Kubernetes Engine のクラスタ オートスケーラー機能について説明します。クラスタを自動スケーリングする方法については、クラスタの自動スケーリングをご覧ください。

概要

GKE のクラスタ オートスケーラーは、実行するワークロードの量に基づいてクラスタのサイズを自動的に変更します。自動スケーリングを有効にすると、新しく作成したポッドを実行するのに十分な容量がない場合に、GKE がクラスタに新しいノードを自動的に追加します。反対に、クラスタ内のノードが十分に活用されておらず、そのポッドを他のノードで実行できる場合には、GKE はそのノードを削除できます。

クラスタの自動スケーリングを使用すると、需要が増えたときに新しいリソースが自動的に追加されるようにしつつ、各時間帯において必要となったリソースの分だけを支払うことができるようになります。

クラスタの自動スケーリングでは、リソースの削除や移動が発生します。これにより、サービスが一時的に中断する可能性があります。たとえば、サービスが 1 つのコントローラから構成され、1 つのレプリカが存在する場合、現在のノードが削除されると、レプリカのポッドが別のノードで再起動する可能性があります。自動スケーリングを有効にする前に、サービスで一時的な中断が許容されるかどうか確認してください。

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

クラスタ オートスケーラーはノードプール単位で機能します。オートスケーラーは各ノードプールにおいて、空きリソースのあるノードを待っているが、スケジュールされていないポッドがあるかどうかを定期的に確認します。このようなポッドが存在し、オートスケーラーがノードプールのサイズ変更によって待機中のポッドがスケジュールされると判断した場合、オートスケーラーはノードプールを拡張します。

また、ノードプール全体の容量需要に対する各ノードの利用状況を測定します。一定期間ノードにスケジュールされた新しいポッドが存在せず、そのノードで実行中のすべてのポッドをプール内の他のノードにスケジュール可能であれば、オートスケーラーはそれらのポッドを移動しノードを削除します。ノードが 10 分後に正常にドレインされなかった場合、ノードは強制終了されます。GKE クラスタの猶予期間は構成できません。

クラスタ オートスケーラーは、ポッドのリソース リクエストに基づいて機能します。つまり、ポッドがリクエストしたリソースの量に応じて処理を行います。クラスタ オートスケーラーは、ポッドが現在使用しているリソースを考慮しません。クラスタ オートスケーラーは、ポッドのリソース リクエストが正確で、これに基づいてポッドがスケジュールされることを前提としています。

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

動作条件

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

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

ゾーン間での均衡化

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

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

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

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

自動スケーリングの制限

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

たとえば、次のコマンドは 3 つのゾーンにまたがる 6 つのノードで自動スケーリングを行うマルチゾーン クラスタを作成し、ゾーンごとのノード数は 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 分です。これより長い猶予期間がポッドに構成されていても、10 分が経過するとポッドは常に強制終了させられます。
  • 場合によっては、クラスタ オートスケーラーが完全にスケールダウンされず、スケールダウン後に余分なノードが存在することがあります。これは、必要なシステムポッドが別のノード用にスケジュールされているときに発生する可能性があります。これらのポッドを別のノードに移動するためのトリガーがないためです。使用率が低いノードがいくつかありますが、スケールダウンされません。どうしてでしょうか?をご覧ください。この制限を回避するには、ポッド停止予算を構成できます。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント