このページでは、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
コンソール
デフォルト ノードプールの自動スケーリングが有効にされたクラスタを新しく作成するには:
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
[add_box 作成] をクリックします。
必要に応じてクラスタを構成します。
ナビゲーション ペインの [ノードプール] で [default-pool] をクリックします。
[自動スケーリングの有効化] チェックボックスをオンにします。
[ノードの最小数] フィールドと [ノードの最大数] フィールドの値を必要に応じて変更します。
[作成] をクリックします。
自動スケーリング対応のノードプールの追加
自動スケーリングを有効にしたノードプールは、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
コンソール
自動スケーリング対応のノードプールを既存のクラスタに追加するには:
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
クラスタのリストで、変更するクラスタの名前をクリックします。
[add_box ノードプールを追加] をクリックします。
必要に応じてノードプールを構成します。
[サイズ] で、[自動スケーリングの有効化] チェックボックスをオンにします。
[ノードの最小数] フィールドと [ノードの最大数] フィールドの値を必要に応じて変更します。
[作成] をクリックします。
既存のノードプールの自動スケーリングを有効にする
既存のノードプールの自動スケーリングは、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
を使用します。
コンソール
既存のノードプールの自動スケーリングを有効にするには:
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
クラスタのリストで、変更するクラスタの名前をクリックします。
[ノード] タブをクリックします。
[ノードプール] で、変更するノードプールの名前をクリックし、edit [編集] をクリックします。
[サイズ] で、[自動スケーリングの有効化] チェックボックスをオンにします。
[ノードの最小数] フィールドと [ノードの最大数] フィールドの値を必要に応じて変更します。
[保存] をクリックします。
既存のノードプールの自動スケーリングが有効になっていることを確認する
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
コンソール
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
クラスタのリストで、確認するクラスタの名前をクリックします。
[ノード] タブをクリックします。
[ノードプール] で、ノードプールが
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
特定のノードプールの自動スケーリングを無効にするには:
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
クラスタのリストで、変更するクラスタの名前をクリックします。
[ノード] タブをクリックします。
[ノードプール] で、変更するノードプールの名前をクリックし、edit [編集] をクリックします。
[サイズ] で、[自動スケーリングの有効化] チェックボックスをオフにします。
[保存] をクリックします。
ノードプールのサイズを変更する
自動スケーリングが有効なクラスタの場合、クラスタ オートスケーラーは、最小サイズ(--min-nodes
)と最大サイズ(--max-nodes
)の値、または最小サイズの合計(--total-min-nodes
)と最大サイズの合計(--total-max-nodes
)で指定された境界内で、ノードプールのサイズを自動的に変更します。これらのフラグは相互に排他的です。これらの値を変更しても、ノードプールを手動でサイズ変更することはできません。
自動スケーリングが有効になっているクラスタ内のノードプールを手動でサイズ変更する場合は、次の手順を行います。
選択したノードで 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 が実行されていることを確認するには、次の手順を行います。Google Cloud コンソールの [ログ エクスプローラ] ページに移動します。
[クエリビルダー] をクリックします。
次のクエリを使用して、すべてのネットワーク ポリシーのログレコードを検索します。
- 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"
この問題を解決するには、以下のいずれかを行う必要があります。
kube-system
Pod にPodDisruptionBudget
を追加します。kube-system
Pod にPodDisruptionBudget
を手動で追加する方法の詳細については、Kubernetes クラスタ オートスケーラーに関するよくある質問をご覧ください。- ノードプールの taint と toleration を組み合わせて使用し、
kube-system
Pod をアプリケーション Pod から分離します。詳細については、GKE でのノードの自動プロビジョニングをご覧ください。
ノードプール サイズの不一致
ノードプール サイズを構成すると、次の問題が発生します。
- 既存のノードプールのサイズが、クラスタに指定した最小ノード数を下回っている。
この動作の考えられる一般的な原因は次のとおりです。
- 既存のノード数が増えたときに、新しい最小ノード数を指定した。
- ノードプールまたは基盤となるマネージド インスタンス グループを手動でスケールダウンした。この手動オペレーションで、ノードの最小数より少ないノード数が指定した。
- ノードプール内のプリエンプトされた Spot VM をデプロイした。
- Pod にローカル ストレージがあり、GKE コントロール プレーン バージョンが 1.22 未満である。コントロール プレーン バージョン 1.22 以降の GKE クラスタでは、ローカル ストレージを使用する Pod でスケールダウンがブロックされなくなりました。
Pod にアノテーション
"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"
が付加されている。スケールダウン イベント中のトラブルシューティングの手順については、クラスタがスケールダウンされないをご覧ください。
スケールダウンする場合、クラスタ オートスケーラーは Pod の終了猶予期間(最大 10 分まで)に従います。10 分後に、Pod は強制的に終了します。
ノードプールのサイズが、クラスタで指定した最小ノード数よりも小さくなる場合があります。これは、オートスケーラーが最小ノード数のパラメータを使用するのが、スケールダウンを決定する必要がある場合に限られるためです。この現象の考えられる原因は、次のとおりです。
この問題を解決するには、手動でノードプール サイズを最小ノード数以上に拡大します。詳細については、クラスタのサイズを手動で変更する方法をご覧ください。
クラスタ オートスケーラーの詳細と停止を防ぐ方法については、Kubernetes クラスタ オートスケーラーに関するよくある質問で、以下の項目をご覧ください。
- スケールダウンの仕組み
- スケールダウン時にクラスタ オートスケーラーは PodDisruptionBudget と連携しますか?
- クラスタ オートスケーラーによるノードの削除を防ぐ Pod の種類はありますか?