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

このページでは、VMware で Google Distributed Cloud(ソフトウェアのみ)を使用して作成されたユーザー クラスタで、コントロール プレーンとノードプールを個別にアップグレードする方法について説明します。このページは、基盤となる技術インフラストラクチャのライフサイクルを管理する IT 管理者と運用担当者を対象としています。Google Cloud のコンテンツで参照する一般的なロールとタスク例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。このドキュメントを読む前に、次で説明されている Google Distributed Cloud のアップグレードの計画と実行について理解しておいてください。

コントロール プレーンとは別にノードプールをアップグレードする方法は、Ubuntu ノードプールと COS ノードプールではサポートされていますが、Windows ノードプールではサポートされていません。

コントロール プレーンとノードプールを個別にアップグレードする理由

  • クラスタのバージョンが 1.16 以降の場合は、ノードプールをアップグレードするときにマイナー バージョンをスキップできます。バージョン スキップ アップグレードを実行すると、ノードプールを 2 つのバージョンを順番にアップグレードするのにかかる時間が半分になります。また、バージョンをスキップするアップグレードでは、サポートされているバージョンを維持するために必要なアップグレード間隔を長くできます。アップグレードの数を減らすと、ワークロードの中断と検証時間が短縮されます。詳細については、ノードプールのアップグレードでバージョンをスキップするをご覧ください。

  • 状況によっては、ユーザー クラスタ内のすべてのノードプールではなく、一部のノードプールをアップグレードすることをおすすめします。たとえば、次のような状況です。

    • 最初に、トラフィックが少ないノードプールや、重要度の低いワークロードを実行するノードプールをアップグレードできます。ワークロードが新しいバージョンで正しく実行されることを確認したら、最終的にすべてのノードプールがアップグレードされるまで、追加のノードプールをアップグレードします。

    • クラスタのアップグレードに 1 つの大きなメンテナンスの時間枠を使用する代わりに、複数のメンテナンスの時間枠でクラスタをアップグレードできます。メンテナンスの時間枠の見積もりについては、所要時間を見積もり、メンテナンスの時間枠を計画するをご覧ください。

始める前に

  1. バージョン 1.29 以降では、サーバーサイドのプリフライト チェックはデフォルトで有効になっています。ファイアウォール ルールを確認して、必要な変更を加えてください。

  2. バージョン 1.28 以降にアップグレードするには、kubernetesmetadata.googleapis.com を有効にして、logging-monitoring サービス アカウントkubernetesmetadata.publisher IAM ロールを付与する必要があります。詳細については、Google API と IAM の要件をご覧ください。

  3. クラスタの現在のバージョンが 1.14 以降であることを確認します。

コントロール プレーンと選択したノードプールをアップグレードする

ワーカーノードプールとは別にユーザー クラスタのコントロール プレーンをアップグレードすることは、gkectl、Google Cloud CLI、Terraform でサポートされています。Terraform を使用してアップグレードできるのは、Terraform を使用してユーザー クラスタを作成した場合だけです。

gkectl

  1. 次のプレースホルダ変数で、ソース バージョンとターゲット バージョンを定義します。すべてのバージョンは、1.16.11-gke.25 など、x.y.z-gke.N 形式の完全なバージョン番号にする必要があります。

    バージョン 説明
    SOURCE_VERSION 現在のクラスタ バージョン。
    TARGET_VERSION ターゲット バージョンを選択します。ターゲット マイナー バージョンから 推奨パッチを選択します。
  2. ターゲット バージョンに管理ワークステーションをアップグレードします。アップグレードが正常に完了したことを示すメッセージが表示されるまで待ちます。

  3. 対応する OS イメージを vSphere にインポートします。

    gkectl prepare \
      --bundle-path /var/lib/gke/bundles/gke-onprem-vsphere-TARGET_VERSION.tgz \
      --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

    ADMIN_CLUSTER_KUBECONFIG は、管理クラスタの kubeconfig ファイルのパスに置き換えます。

  4. ユーザー クラスタ構成ファイルで次の変更を行います。

    • gkeOnPremVersion フィールドをターゲット バージョン TARGET_VERSION に設定します。

    • アップグレードするノードプールごとに、nodePools.nodePool[i].gkeOnPremVersion フィールドを空の文字列に設定します。

    • アップグレードしないノードプールごとに、nodePools.nodePool[i].gkeOnPremVersion をソース バージョン SOURCE_VERSION に設定します。

    次の例は、ユーザー クラスタ構成ファイルの一部を示しています。コントロール プレーンと pool-1TARGET_VERSION にアップグレードされるように指定していますが、pool-2SOURCE_VERSION のままです。

    gkeOnPremVersion: TARGET_VERSION
    ...
    nodePools:
    - name: pool-1
      gkeOnPremVersion: ""
      ...
    - name: pool-2
      gkeOnPremVersion: SOURCE_VERSION
      ...
    
  5. コントロール プレーンと選択したノードプールをアップグレードします。

    gkectl upgrade cluster \
      --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
      --config USER_CLUSTER_CONFIG_FILE
    

    USER_CLUSTER_CONFIG は、ユーザー クラスタ構成ファイルのパスに置き換えます。

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

上記の例を使用して、すべてが pool-1 で正常に動作しており、pool-2 をアップグレードするとします。

  1. ユーザー クラスタの構成ファイルの pool-2 で、gkeOnPremVersion を空の文字列に設定します。

    gkeOnPremVersion: TARGET_VERSION
    ...
    nodePools:
    - name: pool-1
      gkeOnPremVersion: ""
      ...
    - name: pool-2
      gkeOnPremVersion: ""
      ...
    
  2. gkectl update cluster を実行して変更を適用します。

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
      --config USER_CLUSTER_CONFIG
    

gcloud CLI

ユーザー クラスタをアップグレードするには、管理クラスタにいくつかの変更を加える必要があります。gcloud container vmware clusters upgrade コマンドは、自動的に次の処理を行います。

  • 管理クラスタを GKE On-Prem API に登録します(まだ登録されていない場合)。

  • コンポーネントのバンドルをダウンロードして管理クラスタにデプロイします。コンポーネントのバージョンが、アップグレードに指定したバージョンと一致します。これらのコンポーネントを使用すると、管理クラスタがそのバージョンのユーザー クラスタを管理できるようになります。

コントロール プレーンをアップグレード

ユーザー クラスタのコントロール プレーンをアップグレードするには、次の手順を行います。

  1. Google Cloud CLI のコンポーネントを更新します。

    gcloud components update
    
  2. クラスタのアップグレード ポリシーを変更します。

    gcloud container vmware clusters update USER_CLUSTER_NAME \
      --project=PROJECT_ID \
      --location=REGION \
      --upgrade-policy control-plane-only=True
    

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

    • USER_CLUSTER_NAME: アップグレードするユーザー クラスタの名前。

    • PROJECT_ID: ユーザー クラスタがメンバーであるフリート ホスト プロジェクトの ID。これは、クラスタの作成時に指定したプロジェクトです。gkectl を使用してクラスタを作成した場合、これはクラスタ構成ファイルの gkeConnect.projectID フィールドのプロジェクト ID です。

    • REGION: GKE On-Prem API が稼働しメタデータを保存する Google Cloud リージョン。GKE On-Prem API クライアントを使用してクラスタを作成した場合、これはクラスタの作成時に選択したリージョンです。gkectl を使用してクラスタを作成した場合、これは GKE On-Prem API にクラスタを登録したときに指定したリージョンです。

  3. クラスタのコントロール プレーンをアップグレードします。

    gcloud container vmware clusters upgrade USER_CLUSTER_NAME \
      --project=PROJECT_ID \
      --location=REGION \
      --version=TARGET_VERSION
    

    TARGET_VERSION は、アップグレードするバージョンに置き換えます。ターゲット マイナー バージョンから推奨パッチを選択します。

    このコマンドからの出力は、次のようになります。

    Waiting for operation [projects/example-project-12345/locations/us-west1/operations/operation-1679543737105-5f7893fd5bae9-942b3f97-75e59179] to complete.
    

    この出力例では、operation-1679543737105-5f7893fd5bae9-942b3f97-75e59179 という文字列は長時間実行オペレーションの OPERATION_ID です。 オペレーションのステータスを確認するには、別のターミナル ウィンドウで次のコマンドを実行します。

    gcloud container vmware operations describe OPERATION_ID \
      --project=PROJECT_ID \
      --location=REGION
    

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

ユーザー クラスタのコントロール プレーンをアップグレードした後、次の手順に沿ってノードプールをアップグレードします。

  1. ユーザー クラスタのノードプールのリストを取得します。

    gcloud container vmware node-pools list
      --cluster=USER_CLUSTER_NAME  \
      --project=PROJECT_ID \
      --location=REGION
    
  2. アップグレードするノードプールごとに、次のコマンドを実行します。

    gcloud container vmware node-pools update NODE_POOL_NAME \
      --cluster=USER_CLUSTER_NAME  \
      --project=PROJECT_ID \
      --location=REGION \
      --version=TARGET_VERSION
    

Terraform

  1. Google Cloud CLI のコンポーネントを更新します。

    gcloud components update
    
  2. まだ行っていない場合は、GKE On-Prem API に管理クラスタを登録します。クラスタが GKE On-Prem API に登録された後は、この手順を繰り返す必要はありません。

  3. 新しいバージョンのコンポーネントをダウンロードして、管理クラスタにデプロイします。

    gcloud vmware admin-clusters update ADMIN_CLUSTER_NAME \
      --project=PROJECT_ID \
      --location=REGION \
      --required-platform-version=TARGET_VERSION
    

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

    • USER_CLUSTER_NAME: アップグレードするユーザー クラスタの名前。

    • PROJECT_ID: ユーザー クラスタがメンバーであるフリート ホスト プロジェクトの ID。これは、クラスタの作成時に指定したプロジェクトです。gkectl を使用してクラスタを作成した場合、これはクラスタ構成ファイルの gkeConnect.projectID フィールドのプロジェクト ID です。

    • REGION: GKE On-Prem API が稼働しメタデータを保存する Google Cloud リージョン。GKE On-Prem API クライアントを使用してクラスタを作成した場合、これはクラスタの作成時に選択したリージョンです。gkectl を使用してクラスタを作成した場合、これは GKE On-Prem API にクラスタを登録したときに指定したリージョンです。

    • TARGET_VERSION: アップグレードするバージョン。ターゲット マイナー バージョンから推奨パッチを選択します。

    このコマンドは、--required-platform-version で指定したバージョンのコンポーネントを管理クラスタにダウンロードし、そのコンポーネントをデプロイします。これらのコンポーネントを使用すると、管理クラスタがそのバージョンのユーザー クラスタを管理できるようになります。

  4. ユーザー クラスタの作成に使用した main.tf ファイルで、クラスタ リソースの on_prem_version を新しいバージョンに変更します。

  5. コントロール プレーンのみがアップグレードされるように、クラスタ リソースに次のコードを追加します。

    upgrade_policy {
      control_plane_only = true
    }
    
  6. Terraform プランを初期化して作成します。

    terraform init
    

    Terraform によって、Google Cloud プロバイダなどの必要なライブラリがインストールされます。

  7. 構成を確認し、必要に応じて変更を加えます。

    terraform plan
    
  8. Terraform プランを適用して、ユーザー クラスタを作成します。

    terraform apply
    

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

ユーザー クラスタのコントロール プレーンをアップグレードした後、次の手順でノードプールをアップグレードします。

  1. アップグレードする各ノードプールのリソースの main.tf に、次の行を追加します。

    on_prem_version = "TARGET_VERSION"
    

    次に例を示します。

    resource "google_gkeonprem_vmware_node_pool" "nodepool-basic" {
    name = "my-nodepool"
    location = "us-west1"
    vmware_cluster = google_gkeonprem_vmware_cluster.default-basic.name
    config {
      replicas = 3
      image_type = "ubuntu_containerd"
      enable_load_balancer = true
    }
    on_prem_version = "1.16.0-gke.0"
    }
    
  2. Terraform プランを初期化して作成します。

    terraform init
    
  3. 構成を確認し、必要に応じて変更を加えます。

    terraform plan
    
  4. Terraform プランを適用して、ユーザー クラスタを作成します。

    terraform apply
    

トラブルシューティング

ノードプールのアップグレード後に問題が発生した場合は、前のバージョンにロールバックできます。詳細については、アップグレード後にノードプールをロールバックするをご覧ください。