このページでは、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
- [ようこそ] ページに移動します。
- [プロジェクト番号] フィールドで、 [クリップボードにコピー] をクリックします。
- [IAM] ページに移動します。
- [ アクセスを許可] をクリックします。
- [新しいプリンシパル] フィールドに次の値を指定します。
PROJECT_NUMBER-compute@developer.gserviceaccount.com
PROJECT_NUMBER
は、コピーしたプロジェクト番号に置き換えます。 - [ロールを選択] メニューで、[Kubernetes Engine のデフォルト ノード サービス アカウント] ロールを選択します。
- [保存] をクリックします。
gcloud
- Google Cloud プロジェクト番号を確認します。
gcloud projects describe PROJECT_ID \ --format="value(projectNumber)"
PROJECT_ID
を実際のプロジェクト ID に置き換えます。出力は次のようになります。
12345678901
- 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 クラスタにノードプールを追加するには、次の操作を行います。
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
クラスタのリストで、変更する Standard クラスタの名前をクリックします。
[add_boxノードプールを追加] をクリックします。
ノードプールを構成します。
ナビゲーション メニューで [セキュリティ] をクリックします。
- 必要に応じて、ノードにカスタム IAM サービス アカウントを指定します。
- [詳細設定] ページで、[セキュリティ] セクションを開きます。
- [サービス アカウント] メニューで、目的のサービス アカウントを選択します。
Compute Engine のデフォルトのサービス アカウントの代わりに、ノードで使用できる最小権限の IAM サービス アカウントを指定することを強くおすすめします。最小権限のサービス アカウントを作成する方法については、最小権限のサービス アカウントを使用するをご覧ください。
[作成] をクリックしてノードプールを追加します。
Terraform
Terraform を使用して既存の Standard クラスタにノードプールを追加するには、次の例をご覧ください。
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 クラスタのノードプールを表示するには、次の操作を行います。
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
クラスタリストで、Standard クラスタの名前をクリックします。
[ノード] タブをクリックします。
[ノードプール] で、表示するノードプールの名前をクリックします。
ノードプールをスケーリングする
ノードプールをスケールアップまたはスケールダウンして、パフォーマンスと費用を最適化できます。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
クラスタのノードプールのサイズを変更するには、次の手順を行います。
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
クラスタのリストで、変更する Standard クラスタの名前をクリックします。
[ノード] タブをクリックします。
[ノードプール] セクションで、サイズを変更するノードプールの名前をクリックします。
edit [サイズ変更] をクリックします。
[ノード数] フィールドに、ノードプールに含めるノード数を入力し、[サイズ変更] をクリックします。
必要に応じてノードプールごとに同じ操作を繰り返します。
ノードマシンの属性を変更して垂直方向にスケーリングする
ノードプールの構成済みのマシンタイプ、ディスクタイプ、ディスクサイズを変更できます。
これらのマシン属性を編集すると、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-standard
、pd-ssd
、pd-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.2
やcluster-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 コンソールを使用してノードプールをアップグレードするには、次の手順に沿って操作します。
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
編集するクラスタの横にある [more_vert アクション] をクリックし、[edit 編集] をクリックします。
[クラスタの詳細] ページで [ノード] タブをクリックします。
[ノードプール] セクションで、アップグレードするノードプールの名前をクリックします。
[edit 編集] をクリックします。
[ノードのバージョン] で [変更] をクリックします。
[ノードのバージョン] プルダウン リストから目的のバージョンを選択し、[変更] をクリックします。
ノードのバージョンが変更されるまで数分かかることがあります。
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 アップグレード戦略を使用します。この戦略では、アップグレードが失敗した場合に、進行中のアップグレードを元のノードにロールバックできます。
- ダウングレード後に GKE によってノードプールが自動的にアップグレードされないようにするには、メンテナンスの除外をクラスタに設定します。
- ノードプールをダウングレードするには、ノードプールを手動でアップグレードするの手順に沿って、以前のバージョンを指定します。
ノードプールを削除する
ノードプールを削除すると、PodDisruptionBudget
の設定に関係なく、ノードと実行中のワークロードがすべて削除されます。ノードセレクタの操作など、ワークロードへの影響の詳細については、ノードプールの削除をご覧ください。
gcloud
ノードプールを削除するには、gcloud container node-pools delete
コマンドを実行します。
gcloud container node-pools delete POOL_NAME \
--cluster CLUSTER_NAME
Console
ノードプールを削除するには、次の手順を行います。
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
クラスタのリストで、変更する Standard クラスタの名前をクリックします。
[ノード] タブをクリックします。
[ノードプール] セクションで、削除するノードプールの横にある delete をクリックします。
確認のメッセージが表示されたら、[削除] をクリックします。
ノードを別のマシンタイプに移行する
マシンタイプ間でワークロードを移動するさまざまな方法(新しいマシンタイプに移行する方法など)については、ノードを別のマシンタイプに移行するをご覧ください。
ノードプール間でワークロードを移行する
ワークロードをあるノードプールから別のノードプールに移行するには、ノードプール間でワークロードを移行するをご覧ください。たとえば、既存のノードプールを新しいノードプールに置き換え、ワークロードが既存のノードから新しいノードに確実に移動するようにするには、次の操作を行います。
トラブルシューティング
トラブルシューティングについては、Standard ノードプールのトラブルシューティングとノード登録のトラブルシューティングをご覧ください。
次のステップ
- ノードプールの仕組みについて読む。
- ノードプールの自動プロビジョニングについて学習する
- GKE が異常なノードを自動的に修復する方法について学習する。
- ノードシステム構成を使用して
kubelet
とsysctl
を構成する方法を学習する。