クラスタの自動スケーリング


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

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

クラスタ オートスケーラーの使用

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

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

自動スケーリングを有効にしたクラスタは、Google Cloud CLI または Google Cloud コンソールを使用して作成できます。

gcloud

自動スケーリングを有効にしたクラスタを作成するには、--enable-autoscaling フラグを使用して --min-nodes--max-nodes を指定します。

gcloud container clusters create CLUSTER_NAME \
    --enable-autoscaling \
    --num-nodes NUM_NODES \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --region=COMPUTE_REGION

次のように置き換えます。

  • CLUSTER_NAME: 作成するクラスタの名前。
  • NUM_NODES: 各ロケーションで作成するノードの数。
  • MIN_NODES: 指定したノードプールで自動的にスケーリングするゾーンの最小ノード数。GKE バージョン 1.24 以降でノードプール全体の最小ノード数を指定するには、--total-min-nodes を使用します。フラグ --total-min-nodes--total-max-nodes は、フラグ --min-nodes--max-nodes と相互に排他的です。
  • MAX_NODES: 指定したノードプールで自動的にスケーリングするゾーンの最大ノード数。GKE バージョン 1.24 以降でノードプール全体のノードの最大数を指定するには、--total-max-nodes を使用します。フラグ --total-min-nodes--total-max-nodes は、フラグ --min-nodes--max-nodes と相互に排他的です。
  • COMPUTE_REGION: 新しいクラスタの Compute Engine のリージョン。ゾーンクラスタの場合は、--zone=COMPUTE_ZONE を使用します。

例: ノード自動スケーリングと最小ノード数、最大ノード数を指定したクラスタの作成

次のコマンドは、90 ノードのクラスタ、またはリージョンに存在する 3 つのゾーンのそれぞれに 30 ノードを持つクラスタを作成します。ノード自動スケーリングが有効になり、クラスタの負荷に基づいてノード数が変更されます。このクラスタ オートスケーラーは、デフォルトのノードプールのサイズをゾーンあたり最小で 15 ノード、最大で 50 ノードまで変化させることができます。

gcloud container clusters create my-cluster --enable-autoscaling \
    --num-nodes=30 \
    --min-nodes=15 --max-nodes=50 \
    --region=us-central

例: ノードの自動スケーリングを有効にして合計ノードを指定したクラスタの作成

次のコマンドは、30 ノードのクラスタ、またはリージョンに存在する 3 つのゾーンのそれぞれに 10 ノードを持つクラスタを作成します。ノード自動スケーリングが有効になり、クラスタの負荷に基づいてノード数が変更されます。この例では、ゾーン間の分散に関係なく、クラスタの合計サイズを 10~60 ノードにできます。

gcloud container clusters create my-cluster --enable-autoscaling \
    --num-nodes 10 \
    --region us-central1 \
    --total-min-nodes 10  --total-max-nodes 60

コンソール

デフォルト ノードプールの自動スケーリングが有効にされたクラスタを新しく作成するには:

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. [ 作成] をクリックします。

  3. 必要に応じてクラスタを構成します。

  4. ナビゲーション ペインの [ノードプール] で [default-pool] をクリックします。

  5. [自動スケーリングの有効化] チェックボックスをオンにします。

  6. [ノードの最小数] フィールドと [ノードの最大数] フィールドの値を必要に応じて変更します。

  7. [作成] をクリックします。

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

自動スケーリングを有効にしたノードプールは、gcloud CLI または Google Cloud コンソールを使用して作成できます。

gcloud

自動スケーリング対応のノードプールを既存のクラスタに追加するには、次のコマンドを使用します。

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --enable-autoscaling \
    --min-nodes=MIN_NODES \
    --max-nodes=MAX_NODES \
    --region=COMPUTE_REGION

次のように置き換えます。

  • POOL_NAME: 目的のノードプールの名前。
  • CLUSTER_NAME: ノードプールが作成されるクラスタの名前。
  • MIN_NODES: 指定したノードプールで自動的にスケーリングするゾーンの最小ノード数。GKE バージョン 1.24 以降でノードプール全体の最小ノード数を指定するには、--total-min-nodes を使用します。フラグ --total-min-nodes--total-max-nodes は、フラグ --min-nodes--max-nodes と相互に排他的です。
  • MAX_NODES: 指定したノードプールで自動的にスケーリングするゾーンの最大ノード数。GKE バージョン 1.24 以降でノードプール全体のノードの最大数を指定するには、--total-max-nodes を使用します。フラグ --total-min-nodes--total-max-nodes は、フラグ --min-nodes--max-nodes と相互に排他的です。
  • COMPUTE_REGION: 新しいクラスタの Compute Engine のリージョン。ゾーンクラスタの場合は、--zone=COMPUTE_ZONE を使用します。

例: ノードの自動スケーリングを有効にしてノードプールを追加する

次のコマンドは、ノードプールを最大 5 ノードと最小 1 ノードの範囲内でスケーリングするノードの自動スケーリングを使用するノードプールを作成します。

gcloud container node-pools create my-node-pool \
    --cluster my-cluster \
    --enable-autoscaling \
    --min-nodes 1 --max-nodes 5 \
    --zone us-central1-c

コンソール

自動スケーリング対応のノードプールを既存のクラスタに追加するには:

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. [ ノードプールを追加] をクリックします。

  4. 必要に応じてノードプールを構成します。

  5. [サイズ] で、[自動スケーリングの有効化] チェックボックスをオンにします。

  6. [ノードの最小数] フィールドと [ノードの最大数] フィールドの値を必要に応じて変更します。

  7. [作成] をクリックします。

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

既存のノードプールの自動スケーリングは、gcloud CLI または Google Cloud コンソールを使用して有効にできます。

gcloud

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

gcloud container clusters update CLUSTER_NAME \
    --enable-autoscaling \
    --node-pool=POOL_NAME \
    --min-nodes=MIN_NODES \
    --max-nodes=MAX_NODES \
    --region=COMPUTE_REGION

次のように置き換えます。

  • CLUSTER_NAME: 更新するクラスタの名前。
  • POOL_NAME: 目的のノードプールの名前。ノードプールが 1 つしかない場合は、値として default-pool を指定します。
  • MIN_NODES: 指定したノードプールで自動的にスケーリングするゾーンの最小ノード数。GKE バージョン 1.24 以降でノードプール全体の最小ノード数を指定するには、--total-min-nodes を使用します。フラグ --total-min-nodes--total-max-nodes は、フラグ --min-nodes--max-nodes と相互に排他的です。
  • MAX_NODES: 指定したノードプールで自動的にスケーリングするゾーンの最大ノード数。GKE バージョン 1.24 以降でノードプール全体のノードの最大数を指定するには、--total-max-nodes を使用します。フラグ --total-min-nodes--total-max-nodes は、フラグ --min-nodes--max-nodes と相互に排他的です。
  • COMPUTE_REGION: 新しいクラスタの Compute Engine のリージョン。ゾーンクラスタの場合は、--zone=COMPUTE_ZONE を使用します。

コンソール

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

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. [ノード] タブをクリックします。

  4. [ノードプール] で、変更するノードプールの名前をクリックし、 [編集] をクリックします。

  5. [サイズ] で、[自動スケーリングの有効化] チェックボックスをオンにします。

  6. [ノードの最小数] フィールドと [ノードの最大数] フィールドの値を必要に応じて変更します。

  7. [保存] をクリックします。

既存のノードプールの自動スケーリングが有効になっていることを確認する

Google Cloud CLI または Google Cloud コンソールを使用して、クラスタが自動スケーリングを使用していることを確認します。

gcloud

クラスタ内のノードプールの説明を取得します。

gcloud container node-pools describe NODE_POOL_NAME --cluster=CLUSTER_NAME |grep autoscaling -A 1

次のように置き換えます。

  • POOL_NAME: 選択した新しいノードプールの名前。
  • CLUSTER_NAME: クラスタの名前。

自動スケーリングが有効になっている場合、出力は次のようになります。

autoscaling:
  enabled: true

コンソール

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、確認するクラスタの名前をクリックします。

  3. [ノード] タブをクリックします。

  4. [ノードプール] で、ノードプールが Autoscalling の状態であることを確認します。

未使用の予約の最適化を優先するノードプールを作成する

ノードプールを作成するときに --location_policy=ANY フラグを使用して、未使用の予約の使用を優先するようにクラスタ オートスケーラーに指示します。

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location_policy=ANY

次のように置き換えます。

  • POOL_NAME: 選択した新しいノードプールの名前。
  • CLUSTER_NAME: クラスタの名前。

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

既存のノードプールの自動スケーリングは、gcloud CLI または Google Cloud コンソールを使用して無効にできます。

gcloud

特定のノードプールの自動スケーリングを無効にするには、--no-enable-autoscaling フラグを使用します。

gcloud container clusters update CLUSTER_NAME \
    --no-enable-autoscaling \
    --node-pool=POOL_NAME \
    --region=COMPUTE_REGION

次のように置き換えます。

  • CLUSTER_NAME: 更新するクラスタの名前。
  • POOL_NAME: 目的のノードプールの名前。
  • COMPUTE_REGION: 新しいクラスタの Compute Engine のリージョン。ゾーンクラスタの場合は、--zone=COMPUTE_ZONE を使用します。

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

Console

特定のノードプールの自動スケーリングを無効にするには:

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. [ノード] タブをクリックします。

  4. [ノードプール] で、変更するノードプールの名前をクリックし、 [編集] をクリックします。

  5. [サイズ] で、[自動スケーリングの有効化] チェックボックスをオフにします。

  6. [保存] をクリックします。

ノードプールのサイズを変更する

自動スケーリングが有効なクラスタの場合、クラスタ オートスケーラーは、最小サイズ(--min-nodes)と最大サイズ(--max-nodes)の値、または最小サイズの合計(--total-min-nodes)と最大サイズの合計(--total-max-nodes)で指定された境界内で、ノードプールのサイズを自動的に変更します。これらのフラグは相互に排他的です。これらの値を変更しても、ノードプールを手動でサイズ変更することはできません。

自動スケーリングが有効になっているクラスタ内のノードプールを手動でサイズ変更する場合は、次の手順を行います。

  1. ノードプールの自動スケーリングを無効にする
  2. クラスタを手動でサイズ変更する
  3. 自動スケーリングを再び有効にし、ノードプールの最小サイズと最大サイズを指定する

選択したノードで Pod のスケジューリングを禁止する

ユースケースに応じて、startup または status taint を使用して、選択したノードで Pod がスケジューリングされないようにします。

この機能は、バージョン 1.28 以降の GKE で使用できます。

Startup taint

startup taint は、Pod をノードで実行する前に完了しなければならないオペレーションがある場合に使用します。たとえば、ノードへのドライバのインストールが完了するまで Pod は実行されません。

クラスタ オートスケーラーは、startup taint が設定されたノードを準備中として扱いますが、スケールアップ ロジックではすぐに準備完了になると想定しています。

Startup taint は、接頭辞 startup-taint.cluster-autoscaler.kubernetes.io/ が付いたすべての taint として定義されます

Status taint

GKE が特定のノードを使用して Pod を実行すべきでない場合は、status taint を使用します。

クラスタ オートスケーラーは、status taint が設定されたノードを準備完了として扱いますが、スケールアップ ロジックでは無視されます。この taint のノードの準備ができていても、Pod は実行されません。Pod でさらにリソースが必要な場合、GKE はクラスタをスケールアップし、この taint のノードを無視します。

Status taint は、接頭辞が status-taint.cluster-autoscaler.kubernetes.io/ のすべての taint として定義されます。

Ignore taint

Ignore taint は、ignore-taint.cluster-autoscaler.kubernetes.io/ という接頭辞を持つすべての taint として定義されます。

トラブルシューティング

発生している問題の原因がクラスタ オートスケーラーの制限のいずれかであるかどうかを確認します。該当しない場合は、クラスタ オートスケーラーに関する次のトラブルシューティング情報をご覧ください。

クラスタがダウンスケーリングされない

クラスタが適切にスケールアップされ、スケールダウンを試行した後、使用率の低いノードは引き続き有効のままになり、クラスタがスケールダウンされなくなります。このエラーは、次のいずれかの原因で発生します。

  • この制限により、オートスケーラーによってノードが削除されるのを防ぐことができます。次のいずれかの条件を持つ Pod がノードに含まれている場合、GKE はノードの削除を防止できます。

    • Pod のアフィニティまたは反アフィニティ ルールにより、再スケジューリングが防止される。
    • GKE バージョン 1.21 以前では、Pod にローカル ストレージがある。
    • Pod が、Deployment、StatefulSet、Job、ReplicaSet などのコントローラによって管理されていない。

    この問題を解決するには、クラスタ オートスケーラーのスケジューリング ルールとエビクション ルールを Pod に設定します。詳細については、Pod のスケジューリングと中断をご覧ください。

  • システム Pod がノードで実行されています。ノードで kube-system Pod が実行されていることを確認するには、次の手順を行います。

    1. Google Cloud コンソールの [ログ エクスプローラ] ページに移動します。

      [ログ エクスプローラ] に移動

    2. [クエリビルダー] をクリックします。

    3. 次のクエリを使用して、すべてのネットワーク ポリシーのログレコードを検索します。

        - resource.labels.location="CLUSTER_LOCATION"
        resource.labels.cluster_name="CLUSTER_NAME"
        logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fcluster-autoscaler-visibility"
        jsonPayload.noDecisionStatus.noScaleDown.nodes.node.mig.nodepool="NODE_POOL_NAME"
      

      次のように置き換えます。

      • CLUSTER_LOCATION: クラスタが配置されているリージョン。
      • CLUSTER_NAME: クラスタの名前。
      • PROJECT_ID: クラスタが作成されるプロジェクトの ID。
      • NODE_POOL_NAME: ノードプールの名前。

        ノードプールで実行されている kube-system Pod がある場合、出力には次が含まれます。

        "no.scale.down.node.pod.kube.system.unmovable"
        

    この問題を解決するには、以下のいずれかを行う必要があります。

ノードプール サイズの不一致

ノードプール サイズを構成すると、次の問題が発生します。

  • 既存のノードプールのサイズが、クラスタに指定した最小ノード数を下回っている。

この動作の考えられる一般的な原因は次のとおりです。

  • 既存のノード数が増えたときに、新しい最小ノード数を指定した。
  • ノードプールまたは基盤となるマネージド インスタンス グループを手動でスケールダウンした。この手動オペレーションで、ノードの最小数より少ないノード数が指定した。
  • ノードプール内のプリエンプトされた Spot VM をデプロイした。
  • Pod にローカル ストレージがあり、GKE コントロール プレーン バージョンが 1.22 未満である。コントロール プレーン バージョン 1.22 以降の GKE クラスタでは、ローカル ストレージを使用する Pod でスケールダウンがブロックされなくなりました。
  • Pod にアノテーション "cluster-autoscaler.kubernetes.io/safe-to-evict": "false" が付加されている。

    スケールダウン イベント中のトラブルシューティングの手順については、クラスタがスケールダウンされないをご覧ください。

  • スケールダウンする場合、クラスタ オートスケーラーは Pod の終了猶予期間(最大 10 分まで)に従います。10 分後に、Pod は強制的に終了します。

  • ノードプールのサイズが、クラスタで指定した最小ノード数よりも小さくなる場合があります。これは、オートスケーラーが最小ノード数のパラメータを使用するのが、スケールダウンを決定する必要がある場合に限られるためです。この現象の考えられる原因は、次のとおりです。

この問題を解決するには、手動でノードプール サイズを最小ノード数以上に拡大します。詳細については、クラスタのサイズを手動で変更する方法をご覧ください。

クラスタ オートスケーラーの詳細と停止を防ぐ方法については、Kubernetes クラスタ オートスケーラーに関するよくある質問で、以下の項目をご覧ください。

次のステップ