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


このページでは、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 を実行して最新のバージョンを取得する。

GKE の IAM サービス アカウントを設定する

GKE は、ノードに接続されている IAM サービス アカウントを使用して、ロギングやモニタリングなどのシステムタスクを実行します。少なくとも、これらのノード サービス アカウントには、プロジェクトに対する Kubernetes Engine デフォルト ノード サービス アカウントroles/container.defaultNodeServiceAccount)ロールが必要です。デフォルトでは、GKE はプロジェクトで自動的に作成される Compute Engine のデフォルトのサービス アカウントをノード サービス アカウントとして使用します。

Compute Engine のデフォルト サービス アカウントに roles/container.defaultNodeServiceAccount ロールを付与する手順は次のとおりです。

console

  1. [ようこそ] ページに移動します。

    [ようこそ] に移動

  2. [プロジェクト番号] フィールドで、 [クリップボードにコピー] をクリックします。
  3. [IAM] ページに移動します。

    [IAM] に移動

  4. [ アクセスを許可] をクリックします。
  5. [新しいプリンシパル] フィールドに次の値を指定します。
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    PROJECT_NUMBER は、コピーしたプロジェクト番号に置き換えます。
  6. [ロールを選択] メニューで、[Kubernetes Engine のデフォルト ノード サービス アカウント] ロールを選択します。
  7. [保存] をクリックします。

gcloud

  1. Google Cloud プロジェクト番号を確認します。
    gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)"

    PROJECT_ID を実際のプロジェクト ID に置き換えます。

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

    12345678901
    
  2. Compute Engine のデフォルト サービス アカウントに roles/container.defaultNodeServiceAccount ロールを付与します。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/container.defaultNodeServiceAccount"

    PROJECT_NUMBER は、前の手順で取得したプロジェクト番号に置き換えます。

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 のデフォルトのサービス アカウントの代わりに、ノードで使用できる最小権限の IAM サービス アカウントを指定することを強くおすすめします。最小権限のサービス アカウントを作成する方法については、最小権限のサービス アカウントを使用するをご覧ください。

    gcloud CLI でカスタム サービス アカウントを指定するには、コマンドに次のフラグを追加します。

    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

    SERVICE_ACCOUNT_NAME は、最小権限のサービス アカウントの名前に置き換えます。

指定できるオプションのフラグの完全なリストについては、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 サービス アカウントを指定します。
    1. [詳細設定] ページで、[セキュリティ] セクションを開きます。
    2. [サービス アカウント] メニューで、目的のサービス アカウントを選択します。

    Compute Engine のデフォルトのサービス アカウントの代わりに、ノードで使用できる最小権限の IAM サービス アカウントを指定することを強くおすすめします。最小権限のサービス アカウントを作成する方法については、最小権限のサービス アカウントを使用するをご覧ください。

  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 フラグを省略します。

Console

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

  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 を構成している場合でも、この動作は適用されます。これらのシナリオではすべて、ノードの削除が行われるように、1 時間後に 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

Console

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

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

    Google Kubernetes Engine に移動

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

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

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

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

ノードを別のマシンタイプに移行する

マシンタイプ間でワークロードを移動するさまざまな方法(新しいマシンタイプに移行する方法など)については、ノードを別のマシンタイプに移行するをご覧ください。

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

ワークロードをあるノードプールから別のノードプールに移行するには、ノードプール間でワークロードを移行するをご覧ください。たとえば、既存のノードプールを新しいノードプールに置き換え、ワークロードが既存のノードから新しいノードに確実に移動するようにするには、次の操作を行います。

トラブルシューティング

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

次のステップ