Cluster Autoscaler

このページでは、Kubernetes Engine のクラスタ オートスケーラー機能について説明します。

概要

Kubernetes Engine のクラスタ オートスケーラーは、実行するワークロードの負荷に基づいてクラスタのサイズを自動的に変更します。自動スケーリングを有効にすると、実行に必要な容量のない新しいポッドを作成したときに、Kubernetes Engine がクラスタに新しいノードを自動的に追加します。逆に、クラスタ内のノードの使用率が低く、ノードのポッドを他のノードで実行できる場合、Kubernetes Engine はこのノードを削除します。

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

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

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

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

また、ノードプール全体の容量需要に対する各ノードの利用状況を測定します。一定期間ノードにスケジュールされた新しいポッドが存在せず、そのノードで実行中のすべてのポッドをプール内の他のノードでスケジュール可能であれば、オートスケーラーはそれらのポッドを移動しノードを削除します。

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

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

動作条件

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

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

ゾーン間での均衡化

クラスタ内に同じインスタンス タイプのノードプールが複数存在する場合、クラスタ オートスケーラーはスケールアップ時に、ノードプールのサイズが均等になるように調整します。複数のゾーンにノードプールが存在する場合、これにより、ゾーン間でのノードプール サイズの不均衡を回避できます。

プールサイズの均衡化から除外したいノードプールがある場合には、そのノードプールにカスタムラベルを付けます。

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

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

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

制限事項

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

  • クラスタ オートスケーラーは、それぞれ 30 個のポッドを実行するノードを 1,000 個までサポートします。スケーラビリティの保証の詳細については、スケーラビリティ レポートを参照してください。
  • スケールダウンの場合、クラスタ オートスケーラーがサポートするポッド停止の最大猶予期間は 10 分です。これより長い猶予期間がポッドに設定されていても、10 分が経過するとポッドは常に強制終了させられます。

その他の情報

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

クラスタ オートスケーラーの使い方

以下では、クラスタ オートスケーラーの使い方を説明します。

自動スケーリングを使用したクラスタの作成

Console

デフォルト ノードプールの自動スケーリングが有効にされたクラスタを作成する手順は次のとおりです。

  1. GCP Console で [Kubernetes Engine] メニューにアクセスします。
  2. [クラスタを作成] をクリックします。
  3. 必要に応じてクラスタを設定してから、メニューの下部にある [詳細] をクリックします。
  4. [自動スケーリング] プルダウン メニューから、[オン] をクリックします。
  5. 必要に応じて [最小サイズ] と [最大サイズ] の値を変更します。
  6. [作成] をクリックします。

gcloud

次のコマンドでは、サイズが 30 で、クラスタの負荷に基づいて最大 50 ノードから最小 15 ノードの間でデフォルト ノードプールを自動スケーリングするクラスタが作成されます。

gcloud container clusters create [CLUSTER_NAME] --num-nodes=30 \
--enable-autoscaling --min-nodes=15 --max-nodes=50 [--zone=[COMPUTE_ZONE] --project=[PROJECT_ID]]

コマンドの内容:

  • --enable-autoscaling により、自動スケーリングが有効になります。
  • --min-nodes には、デフォルト ノードプール内のノード数の下限を指定します。
  • --max-nodes には、デフォルト ノードプール内のノード数の上限を指定します。
  • --zone には、オートスケーラーが新しいノードを作成するコンピューティング ゾーンを指定します。

自動スケーリング対応のノードプールの追加

Console

自動スケーリング対応のノードプールを既存のクラスタに追加する手順は次のとおりです。

  1. GCP Console で [Kubernetes Engine] メニューにアクセスします。
  2. 目的のクラスタをクリックしてから、[編集] をクリックします。
  3. ページ下部にある [ノードプール] メニューで、[ノードプールの追加] をクリックします。
  4. 必要に応じてノードプールを構成してから、[自動スケーリング] プルダウン メニューで [オン] を選択します。
  5. [保存] をクリックします。

gcloud

次のコマンドは、サイズが 3(デフォルト)のノードプールを作成します。ノードの自動スケーリングは、クラスタの負荷に基づいて行われ、ノードプールを最大 5 ノードと最小 1 ノードの範囲内でスケーリングします。

gcloud container node-pools create [POOL_NAME] --cluster=[CLUSTER_NAME] \
--enable-autoscaling --min-nodes=1 --max-nodes=5 [--zone=[COMPUTE_ZONE] --project=[PROJECT_ID]]

コマンドの内容:

  • --cluster には、ノードが作成されるクラスタを指定します。
  • --enable-autoscaling により、自動スケーリングが有効になります。
  • --min-nodes には、ノードプール内のノード数の下限を指定します。
  • --max-nodes には、ノードプール内のノード数の上限を指定します。
  • --zone には、オートスケーラーが新しいノードを作成するコンピューティング ゾーンを指定します。

既存のノードプールの自動スケーリングを有効にする

Console

特定のノードプールの自動スケーリングを有効にする手順は次のとおりです。

  1. GCP Console で [Kubernetes Engine] メニューにアクセスします。
  2. 目的のクラスタをクリックしてから、[編集] をクリックします。
  3. ページ下部にある [ノードプール] メニューで、目的のノードプールの横にある [編集] ボタンをクリックしてノードプールを選択します。
  4. [自動スケーリング] プルダウン メニューから、[オン] をクリックします。
  5. 必要に応じて [最小サイズ] と [最大サイズ] の値を変更します。
  6. [保存] をクリックします。

gcloud

既存のノードプールの自動スケーリングを有効にするには、次のコマンドを実行します。

gcloud container clusters update [CLUSTER_NAME] --enable-autoscaling \
--min-nodes=1 --max-nodes=10 --zone=[COMPUTE_ZONE] --node-pool=default-pool

コマンドの内容:

  • --enable-autoscaling により、自動スケーリングが有効になります。
  • --node-pool には、自動スケーリングを有効にするノードプールを指定します。
  • --min-nodes には、ノードプール内のノード数の下限を指定します。
  • --max-nodes には、ノードプール内のノード数の上限を指定します。
  • --zone には、クラスタのコンピューティング ゾーンを指定します。
  • --node-pool には、目的のノードプールを指定します。ノードプールが 1 つしかない場合は、このフラグに default-pool を指定します。

既存のノードプールの自動スケーリングを無効にする

Console

特定のノードプールの自動スケーリングを無効にする手順は次のとおりです。

  1. GCP Console で [Kubernetes Engine] メニューにアクセスします。
  2. 必要なクラスタの名前をクリックします。
  3. [編集] をクリックします。
  4. ページ下部にある [ノードプール] メニューで、目的のノードプールの横にある [編集] ボタンをクリックしてノードプールを選択します。
  5. [自動スケーリング] プルダウン メニューから、[オフ] をクリックします。
  6. [保存] をクリックします。

gcloud

特定のノードプールの自動スケーリングを無効にするには、次のコマンドを実行します。

gcloud container clusters update [CLUSTER_NAME] --no-enable-autoscaling --node-pool=[POOL_NAME] [--zone=[COMPUTE_ZONE] --project=[PROJECT_ID]]

このコマンドでは、--no-enable-autoscaling により、クラスタの自動スケーリングが無効になります。

クラスタのサイズは、クラスタの現在のデフォルト ノードプールのサイズに固定されます。このサイズは手動で更新できます。

次のステップ

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