ノードプールの追加と管理


このページでは、Google Kubernetes Engine(GKE)クラスタを実行するノードプールを追加して操作する方法を説明します。ノードプールの仕組みについては、ノードプールについてをご覧ください。

クラスタは、ノードの自動プロビジョニングなどのオペレーションを複数のノードプールで並行して実行できます。別のノードプールの作成、更新、削除が行われている間に、ノードプールを手動で作成、更新、削除できます。

ここで説明する手順は、GKE がノードを管理し、管理対象のノードプールがない Autopilot クラスタには適用されません。詳細については、Autopilot の概要をご覧ください。

始める前に

始める前に、次の作業が完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

Standard クラスタにノードプールを追加する

新しいノードプールを GKE Standard クラスタに追加するには、gcloud CLI、Google Cloud コンソール、または Terraform を使用します。GKE は、スケーリング要件に基づいてクラスタ内のノードプールを自動的に管理するノード自動プロビジョニングもサポートしています。

ベスト プラクティス:

ノードプール用に Compute Engine のデフォルトのサービス アカウントの代わりに使用する最小権限の Identity and Access Management(IAM)サービス アカウントを作成します。最小権限のみのサービス アカウントを作成する手順については、クラスタのセキュリティの強化をご覧ください。

gcloud

ノードプールを作成するには、gcloud container node-pools create コマンドを実行します。

gcloud container node-pools create POOL_NAME \
    --cluster CLUSTER_NAME \
    --service-account SERVICE_ACCOUNT

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

  • POOL_NAME: 新しいノードプールの名前。
  • CLUSTER_NAME: 既存のクラスタの名前。
  • SERVICE_ACCOUNT: ノードで使用する IAM サービス アカウントの名前。省略した場合、ノードプールは Compute Engine のデフォルトのサービス アカウントを使用します。
  • プライベート IP アドレスを使用してノードをプロビジョニングするには、--enable-private-nodes フラグを追加します。このフラグは、Private Service Connect を使用する一般公開クラスタで使用できます。クラスタで Private Service Connect を使用しているかどうかを確認するには、Private Service Connect を使用したクラスタをご覧ください。

指定できるオプションのフラグの完全なリストについては、gcloud container node-pools create のドキュメントをご覧ください。

出力は次のようになります。

Creating node pool POOL_NAME...done.
Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/us-central1/clusters/CLUSTER_NAME/nodePools/POOL_NAME].
NAME: POOL_NAME
MACHINE_TYPE: e2-medium
DISK_SIZE_GB: 100
NODE_VERSION: 1.21.5-gke.1302

この出力で、ノードで実行されているマシンタイプや GKE バージョンなど、ノードプールの詳細が表示されます。

ノードプールが正常に作成されても、サーバーからステータスが報告されず、gcloud コマンドがタイムアウトになる場合があります。プロビジョニングが完了していないノードプールを含め、すべてのノードプールのステータスを確認するには、次のコマンドを使用します。

gcloud container node-pools list --cluster CLUSTER_NAME

コンソール

既存の Standard クラスタにノードプールを追加するには、次の操作を行います。

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

    Google Kubernetes Engine に移動

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

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

  4. ノードプールを構成します。

  5. ナビゲーション メニューで [セキュリティ] をクリックします。

  6. [サービス アカウント] プルダウン メニューで、使用するノードプールに IAM サービス アカウントを選択します。デフォルトでは、ノードプールは Compute Engine のデフォルトのサービス アカウントを使用します。

  7. [作成] をクリックしてノードプールを追加します。

Terraform

Terraform を使用して既存の Standard クラスタにノードプールを追加するには、次の例をご覧ください。

resource "google_container_node_pool" "default" {
  name    = "gke-standard-regional-node-pool"
  cluster = google_container_cluster.default.name

  node_config {
    service_account = google_service_account.default.email
  }
}

Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。

Standard クラスタ内のノードプールを表示する

gcloud

Standard クラスタのすべてのノードプールを一覧取得するには、gcloud container node-pools list コマンドを実行します。

gcloud container node-pools list --cluster CLUSTER_NAME

特定のノードプールの詳細を表示するには、gcloud container node-pools describe コマンドを実行します。

gcloud container node-pools describe POOL_NAME \
    --cluster CLUSTER_NAME

以下を置き換えます。

  • CLUSTER_NAME: クラスタの名前。
  • POOL_NAME: 表示するノードプールの名前。

コンソール

Standard クラスタのノードプールを表示するには、次の操作を行います。

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

    Google Kubernetes Engine に移動

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

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

  4. [ノードプール] で、表示するノードプールの名前をクリックします。

ノードプールをスケーリングする

ノードプールをスケールアップまたはスケールダウンして、パフォーマンスと費用を最適化できます。GKE Standard ノードプールを使用すると、ノードプール内のノード数を変更してノードプールを水平方向にスケーリングできます。また、ノードのマシン属性構成を変更してノードプールを垂直方向にスケーリングできます。

ノード数を変更して水平方向にスケーリングする

gcloud

クラスタのノードプールのサイズを変更するには、gcloud container clusters resize コマンドを実行します。

gcloud container clusters resize CLUSTER_NAME \
    --node-pool POOL_NAME \
    --num-nodes NUM_NODES

以下を置き換えます。

  • CLUSTER_NAME: サイズを変更するクラスタの名前。
  • POOL_NAME: サイズを変更するノードプールの名前。
  • NUM_NODES: ゾーンクラスタ内のプール内のノードの数。マルチゾーン クラスタまたはリージョン クラスタを使用する場合、NUM_NODES はノードプールが存在している各ゾーンのノード数です。

各ノードプールに対してこのコマンドを繰り返します。クラスタにノードプールが 1 つしかない場合は、--node-pool フラグを省略します。

コンソール

クラスタのノードプールのサイズを変更するには、次の手順を行います。

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

    Google Kubernetes Engine に移動

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

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

  4. [ノードプール] セクションで、サイズを変更するノードプールの名前をクリックします。

  5. [サイズ変更] をクリックします。

  6. [ノード数] フィールドに、ノードプールに含めるノード数を入力し、[サイズ変更] をクリックします。

  7. 必要に応じてノードプールごとに同じ操作を繰り返します。

ノードマシンの属性を変更して垂直方向にスケーリングする

ノードプールの構成済みのマシンタイプ、ディスクタイプ、ディスクサイズを変更できます。

これらのマシン属性を編集すると、GKE はノードプールに構成されたアップグレード戦略を使用して、ノードを新しい構成に更新します。Blue/Green アップグレード戦略を構成すると、移行の失敗時に元のノードをロールバックできるようにしながら、元のノードから新しいノードにワークロードを移行できます。ノードプールのアップグレード設定を調べて、構成した戦略が必要なノードの更新方法と一致していることを確認します。

次のコマンドで、ハイライト表示されているマシン属性の少なくとも 1 つを更新します。

gcloud container node-pools update POOL_NAME \
    --cluster CLUSTER_NAME \
    --machine-type MACHINE_TYPE \
    --disk-type DISK_TYPE \
    --disk-size DISK_SIZE

変更しないマシン属性のフラグは省略します。ただし、少なくとも 1 つのマシン属性フラグを使用する必要があります。そうしないと、コマンドが失敗します。

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

  • POOL_NAME: サイズを変更するノードプールの名前。
  • CLUSTER_NAME: サイズを変更するクラスタの名前。
  • MACHINE_TYPE: ノードに使用するマシンのタイプ。詳細については、gcloud container node-pools update をご覧ください。
  • DISK_TYPE: ノード VM ブートディスクのタイプ。pd-standardpd-ssdpd-balanced のいずれかにする必要があります。
  • DISK_SIZE: ノード VM ブートディスクのサイズ(GB)。デフォルトは 100 GB です。

ノードプール間でワークロードを移行する

ノードプール間でワークロードを移行する場合は、ノードプール間でワークロードを移行するの説明に従って操作します。たとえば、既存のノードプールを新しいノードプールに置き換え、ワークロードを古いノードから新しいノードに確実に移行するには、次の操作を行います。

ノードプールをアップグレードする

デフォルトでは、クラスタのノードで自動アップグレードが有効になっています。ノードの自動アップグレードにより、クラスタのコントロール プレーンとノードのバージョンが同期されており、Kubernetes バージョン スキュー ポリシーに準拠していることが保証されます。これにより、コントロール プレーンはそのコントロール プレーンの 2 つ前までのマイナー バージョンのノードと互換性が保証されています。たとえば、Kubernetes 1.29 コントロール プレーンは Kubernetes 1.27 ノードと互換性があります。

ベスト プラクティス:

ノードの自動アップグレードを無効にしないでください。有効にしておくことで、クラスタは前の段落で説明したアップグレードのメリットを享受できます。

GKE ノードプールのアップグレードでは、サージ アップグレードBlue/Green アップグレードの 2 つの構成可能なアップグレード戦略を選択できます。

クラスタ環境のニーズに最適な戦略を選択し、戦略を調整するパラメータを使用します。

ノードのアップグレードの仕組み

ノードがアップグレードされている間、GKE は新しい Pod のスケジュールを停止し、実行中の Pod を他のノードにスケジュールします。これは、ノードプールで機能を有効または無効にする場合など、ノードの再作成を行う他のイベントも同様です。

ノードの自動アップグレード中または手動アップグレード中、PodDisruptionBudgets(PDB)Pod の停止猶予期間は、最大 1 時間使用されます。ノードで実行中の Pod を 1 時間後に新しいノードにスケジュールできない場合でも、GKE はアップグレードを開始します。maxUnavailable フィールドを 0 または 0% に設定するか、minAvailable フィールドを 100% またはレプリカ数に設定して、すべてのレプリカを常に使用できるように PDB を構成している場合でも、この動作は適用されます。これらのシナリオではすべて、GKE によって 1 時間後に Pod が削除されることでノードが削除されるようになっています。

ベスト プラクティス:

ワークロードを正常に終了する際に柔軟性が必要な場合は、Blue/Green アップグレードを使用すると、デフォルトの 1 時間を超えて PDB チェックを行うために追加のソーク時間が設定されます。

ノードの停止中の一般的な動作については、Pod に関するトピックをご覧ください。

ワークロードを正常に終了する際に柔軟性が必要な場合は、Blue/Green アップグレードを使用することをおすすめします。これにより、デフォルトの 1 時間を超えて PDB チェックを行うために追加のソーク時間が設定されます。ノードの停止中の一般的な動作については、Pod に関するトピックをご覧ください。

アップグレードは、すべてのノードが再作成され、クラスタが望ましい状態になったときにはじめて完了します。新しくアップグレードされたノードがコントロール プレーンに登録されると、GKE ではノードがスケジューリング可能であるとマークされます。

新しいノード インスタンスでは、目的の Kubernetes バージョンと次のものが実行されます。

ノードプールの手動アップグレード

手動でアップグレードできるノードプールのバージョンは、コントロール プレーンと同じバージョンか、引き続き使用可能でコントロール プレーンと互換性のある以前のバージョンです。複数のノードプールを同時に手動でアップグレードできますが、GKE が自動で一度にアップグレードするノードプールは 1 つだけです。

ノードプールを手動でアップグレードすると、kubectl を使用して個々のノードに追加したラベルが削除されます。これを回避するには、ノードプールにラベルを適用します

ノードプールを手動でアップグレードする前に、次の条件を検討してください。

  • 注: ノードプールをアップグレードすると、そのノードプールで実行中のワークロードが中断される可能性があります。これを回避するには、目的のバージョンで新しいノードプールを作成しワークロードを移行します。移行後、古いノードプールは削除できます。
  • 注: エラー状態の Ingress でノードプールをアップグレードすると、インスタンス グループは同期しません。この問題を回避するには、まず、kubectl get ing コマンドでステータスを確認します。インスタンス グループが同期されていない場合は、Ingress の作成に使用したマニフェストを再適用して問題を回避します。

ノードプールは、Google Cloud コンソールか Google Cloud CLI を使用して、コントロール プレーンと互換性のあるバージョンに手動でアップグレードできます。

gcloud

このセクションのコマンドでは、次の変数を使用します。

  • CLUSTER_NAME: アップグレードするノードプールのクラスタの名前。
  • NODE_POOL_NAME: アップグレードするノードプールの名前。
  • VERSION: ノードのアップグレード先の Kubernetes バージョン。たとえば、--cluster-version=1.7.2cluster-version=latest です。

ノードプールをアップグレードします。

gcloud container clusters upgrade CLUSTER_NAME \
  --node-pool=NODE_POOL_NAME

ノードで GKE の別のバージョンを指定するには、オプションの --cluster-version フラグを使用します。

gcloud container clusters upgrade CLUSTER_NAME \
  --node-pool=NODE_POOL_NAME \
  --cluster-version VERSION

バージョンの指定の詳細については、バージョニングに関する記事をご覧ください。

詳細については、gcloud container clusters upgrade のドキュメントをご覧ください。

コンソール

Google Cloud コンソールを使用してノードプールをアップグレードするには、次の手順に沿って操作します。

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

    Google Kubernetes Engine に移動

  2. 編集するクラスタの横にある [ アクション] をクリックし、[ 編集] をクリックします。

  3. [クラスタの詳細] ページで [ノード] タブをクリックします。

  4. [ノードプール] セクションで、アップグレードするノードプールの名前をクリックします。

  5. [ 編集] をクリックします。

  6. [ノードのバージョン] で [変更] をクリックします。

  7. [ノードのバージョン] プルダウン リストから目的のバージョンを選択し、[変更] をクリックします。

ノードのバージョンが変更されるまで数分かかることがあります。

Pod を特定のノードプールにデプロイする

Pod マニフェストで nodeSelector を使用して、Pod を特定のノードプールに明示的にデプロイできます。nodeSelector は、ラベルが一致するノードに Pod のスケジュールを設定します。

すべての GKE ノードプールには、cloud.google.com/gke-nodepool: POOL_NAME という形式のラベルがあります。次の例に示すように、このラベルを Pod の nodeSelector フィールドに追加します。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    cloud.google.com/gke-nodepool: POOL_NAME

詳細は、ノードに Pod を割り当てるをご覧ください。

ノードセレクタの代わりに、ノード アフィニティを使用できます。Pod が制約を満たそうと試みる一方で、制約を満たせない場合でも Pod のスケジュールが設定される「ソフト」ルールを適用したい場合は、ノード アフィニティを使用します。詳細は、ノード アフィニティをご覧ください。コンテナのリソース リクエストを指定することもできます。

ノードプールをダウングレードする

たとえば、ノードプールのアップグレードの失敗の可能性を軽減するために、ノードプールをダウングレードできます。ノードプールをダウングレードする前に、制限事項を確認してください。

ベスト プラクティス:

ワークロードに影響するノードプールのアップグレードのリスク軽減を最適化する必要がある場合は、ノードの Blue/Green アップグレード戦略を使用します。この戦略では、アップグレードが失敗した場合に、進行中のアップグレードを元のノードにロールバックできます。

  1. ダウングレード後に GKE によってノードプールが自動的にアップグレードされないようにするには、メンテナンスの除外をクラスタに設定します。
  2. ノードプールをダウングレードするには、ノードプールを手動でアップグレードするの手順に沿って、以前のバージョンを指定します。

ノードプールを削除する

ノードプールを削除すると、PodDisruptionBudget の設定に関係なく、ノードと実行中のワークロードがすべて削除されます。ノードセレクタの操作など、ワークロードへの影響の詳細については、ノードプールの削除をご覧ください。

gcloud

ノードプールを削除するには、gcloud container node-pools delete コマンドを実行します。

gcloud container node-pools delete POOL_NAME \
    --cluster CLUSTER_NAME

コンソール

ノードプールを削除するには、次の手順を行います。

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

    Google Kubernetes Engine に移動

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

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

  4. [ノードプール] セクションで、削除するノードプールの横にある をクリックします。

  5. 確認のメッセージが表示されたら、[削除] をクリックします。

トラブルシューティング

トラブルシューティングについては、Standard ノードプールのトラブルシューティングノード登録のトラブルシューティングをご覧ください。

次のステップ