クラスタのアップグレードのロールアウトを順序付ける


このページでは、ロールアウト シーケンスを使用して GKE クラスタのアップグレードを管理する方法について説明します。詳細については、ロールアウト シーケンスを使用したクラスタのアップグレードについてをご覧ください。

始める前に

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

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

必要なロール

ロールアウト シーケンスを構成する

このドキュメントでは、フリートまたはチームスコープで編成されたクラスタのグループを使用して、ロールアウト シーケンスを作成する方法について説明します。このドキュメントでは、フリートとチームスコープの両方を「グループ」という用語で表します。ロールアウト シーケンスは、どちらのグループ化の方法でも作成できるためです。

最大 3 つのクラスタのグループのシーケンスを作成できます。1 つのグループ内でクラスタのアップグレードが完了した後のソークテスト時間(最大 30 日)を選択できます。 これには Autopilot クラスタと Standard クラスタの両方を含めることができます。

ロールアウト シーケンスを作成するには、クラスタをフリートまたはチームスコープのグループに編成する必要があります。クラスタの編成方法については、コミュニティ バンクの例をご覧ください。クラスタがグループに編成されたら、アップストリーム グループの関係と各グループのソーク時間を定義することで、ロールアウト シーケンスを作成できます。ロールアウト シーケンスにおいて、アップストリームは前のグループを指し、ダウンストリームは次のグループを指します。

クラスタをグループに編成する

ロールアウト シーケンスでは、すべてのグループ内のすべてのクラスタが同じリリース チャンネルに登録されており、同じマイナー バージョンであることが必要です。これらの要件が満たされておらず、クラスタ間でバージョンの不一致がある場合は、バージョンのロールアウトで問題が発生する可能性があります。詳しくは、ロールアウトの適格性をご覧ください。

フリート間のロールアウト シーケンス、またはチームのチームスコープ間のロールアウト シーケンス(プレビュー版)を作成できます。

ロールアウト シーケンスを使用したクラスタのアップグレードについてで説明したように、チームスコープは、フリート クラスタのサブセットを特定のアプリケーション チームに関連付けるためのエンタープライズ フリートレベルの構成です。チームスコープを使用するには、GKE Enterprise を有効にする必要があります。ロールアウト シーケンスにチームスコープを使用または作成する場合は、次の制限が適用されます。

  • チームベースのシーケンスには、単一テナンシー クラスタが必要です。つまり、個々のクラスタは 1 つのチームにのみ関連付けられます。共有クラスタ(一般的なフリートチーム管理でサポート)は、ロールアウト シーケンスではサポートされていません。

  • ロールアウト シーケンスを作成するには、チームスコープがそれぞれ異なるフリートに属している必要があります。同じフリート内の異なるチームスコープ間でロールアウト シーケンスを作成することはできません。

すでにクラスタをグループに編成している場合は、次の手順をスキップしてロールアウト シーケンスを作成するに進むことができます。

フリート

フリートベースのロールアウト シーケンスを作成するには、まずクラスタをフリートにグループ化する必要があります。フリートベースのロールアウト シーケンスの例に示すように、テスト、ステージング、本番環境などのデプロイ環境ごとにクラスタを編成できます。

選択したグループ化に基づいて、各クラスタをフリートに登録します。

チーム

チームベースのロールアウト シーケンスを作成するには、クラスタをチームスコープにグループ化する必要があります。これを行うには、まず、スコープベースのロールアウト シーケンスの例に示すように、テスト、ステージング、本番環境などのデプロイ環境ごとにクラスタをフリートに編成します。その後、クラスタをさまざまなチームのクラスタのスコープにさらに細分化できます。

  1. シーケンスの各クラスタについて、クラスタをフリートに登録します。このクラスタのチームスコープを作成するプロジェクトのフリートにクラスタを登録する必要があります。クラスタを別のホスト プロジェクトのフリートに登録する場合は、プロジェクト間の登録に必要な権限が設定されていることを確認してください。
  2. 2~3 個のチームスコープを作成して、クラスタを整理します。各スコープを、チームの各フリートのホスト プロジェクトに作成します。ロールアウト シーケンスには最大 3 つのチームスコープを設定できます。

    フラグの全一覧については、gcloud alpha container fleet scopes create のリファレンスをご覧ください。ロールアウト シーケンスを作成する手順で、これらのフラグを create コマンドで使用できます。

  3. 各クラスタをスコープに追加します

ロールアウト シーケンスを作成する

ロールアウト シーケンスは、最大 3 つの要素を持つリンクされたリストとして編成されます。

ロールアウト シーケンスを作成するときは、クラスタのグループ(フリートまたはチームスコープ)ごとに次のプロパティを設定します。

  • アップストリーム グループ: ダウンストリーム グループの新しいバージョンの対象となるアップストリーム フリートまたはチームスコープ。シーケンスの最初のグループにアップストリーム グループは設定しません。
  • ソーク時間: グループのソーク時間は、アップグレードの完了(または 30 日後のロールアウト)から、ダウンストリーム グループでアップグレードが開始されるまでの時間です。詳細については、ロールアウト シーケンスでのバージョン認定の仕組みをご覧ください。

次の各コマンドで、SOAK_TIME は更新するグループのソーク時間に置き換えます。

フリート - gcloud

次の手順では gcloud container fleet clusterupgrade update コマンドを使用しますが、gcloud container fleet clusterupgrade create コマンドでも同じプロパティを設定できます。

ロールアウト シーケンスを作成します。

  1. シーケンスの最初のフリートのソーク時間を設定します。

    gcloud container fleet clusterupgrade update \
        --default-upgrade-soaking=SOAK_TIME \
        --project=FIRST_FLEET_PROJECT_ID
    

    FIRST_FLEET_PROJECT_ID は、フリート ホスト プロジェクトのプロジェクト ID に置き換えます。

  2. シーケンスの 2 番目のフリートのアップストリーム フリートとソーク時間を設定します。

    gcloud container fleet clusterupgrade update \
        --upstream-fleet=FIRST_FLEET_PROJECT_ID \
        --default-upgrade-soaking=SOAK_TIME \
        --project=SECOND_FLEET_PROJECT_ID
    

    FIRST_FLEET_PROJECT_ID は、最初のフリートのホスト プロジェクトのプロジェクト ID に置き換え、SECOND_FLEET_PROJECT_ID は、フリートのホスト プロジェクトのプロジェクト ID に置き換えます。

  3. 省略可: ロールアウト シーケンスで 3 つのフリートが必要な場合は、シーケンスの 3 番目のフリートのアップストリーム フリートを設定します。

    gcloud container fleet clusterupgrade update \
        --upstream-fleet=SECOND_FLEET_PROJECT_ID \
        --default-upgrade-soaking=SOAK_TIME \
        --project=THIRD_FLEET_PROJECT_ID
    

    SECOND_FLEET_PROJECT_ID は、2 番目のフリートのホスト プロジェクトのプロジェクト ID に置き換え、THIRD_FLEET_PROJECT_ID は、フリートのホスト プロジェクトのプロジェクト ID に置き換えます。

フリート - Terraform

このセクションでは、Terraform を使用してフリートベースのシーケンスを作成する方法について説明します。このリソースを使用してシーケンスを更新することもできます。詳細については、google_gke_hub_feature のリファレンス ドキュメントをご覧ください。

ロールアウト シーケンスを作成します。

  1. Terraform 構成に次のブロックを追加して、シーケンスの最初のフリートのソーク時間を設定します。

    resource "google_gke_hub_feature" "feature" {
      name = "clusterupgrade"
      location = "global"
      spec {
        clusterupgrade {
          upstream_fleets = []
          post_conditions {
            soaking = "SOAK_TIME"
          }
        }
      }
      project = "FIRST_FLEET_PROJECT_ID"
    }
    

    FIRST_FLEET_PROJECT_ID は、フリート ホスト プロジェクトのプロジェクト ID に置き換えます。

  2. 次のブロックを Terraform 構成に追加して、シーケンスの 2 番目のフリートのアップストリーム フリートとソーク時間を設定します。

    resource "google_gke_hub_feature" "feature" {
      name = "clusterupgrade"
      location = "global"
      spec {
        clusterupgrade {
          upstream_fleets = ["FIRST_FLEET_PROJECT_ID"]
          post_conditions {
            soaking = "SOAK_TIME"
          }
        }
      }
      project = "SECOND_FLEET_PROJECT_ID"
    }
    

    FIRST_FLEET_PROJECT_ID は、最初のフリートのホスト プロジェクトのプロジェクト ID に置き換え、SECOND_FLEET_PROJECT_ID は、フリートのホスト プロジェクトのプロジェクト ID に置き換えます。

  3. 省略可: ロールアウト シーケンスで 3 つのフリートが必要な場合は、Terraform 構成に次のブロックを追加して、シーケンス内のフリートにアップストリーム フリートを設定します。

    resource "google_gke_hub_feature" "feature" {
      name = "clusterupgrade"
      location = "global"
      spec {
        clusterupgrade {
          upstream_fleets = ["SECOND_FLEET_PROJECT_ID"]
          post_conditions {
            soaking = "SOAK_TIME"
          }
        }
      }
      project = "THIRD_FLEET_PROJECT_ID"
    }
    

    SECOND_FLEET_PROJECT_ID は、2 番目のフリートのホスト プロジェクトのプロジェクト ID に置き換え、THIRD_FLEET_PROJECT_ID は、フリートのホスト プロジェクトのプロジェクト ID に置き換えます。

チーム - gcloud

これらのプロパティは、チームスコープを作成または更新するときに設定できます。次の手順では gcloud alpha container fleet scopes update コマンドを使用しますが、gcloud alpha container fleet scopes create コマンドを使用してチームスコープを作成するときに、同じプロパティを設定できます。

これらのコマンドごとに、変数を、それぞれのチームスコープの名前またはチームスコープのフリート ホスト プロジェクト ID に置き換えます。

ロールアウト シーケンスを作成します。

  1. シーケンスの最初のスコープのソーク時間を設定します。

    gcloud alpha container fleet scopes update projects/FIRST_SCOPE_PROJECT_ID/locations/global/scopes/FIRST_SCOPE_NAME \
        --default-upgrade-soaking=SOAK_TIME \
        --project=FIRST_SCOPE_PROJECT_ID
    
  2. シーケンスの 2 番目のスコープのアップストリーム スコープとソーク時間を設定します。

    gcloud alpha container fleet scopes update projects/SECOND_SCOPE_PROJECT_ID/locations/global/scopes/SECOND_SCOPE_NAME \
        --upstream-scope=projects/FIRST_SCOPE_PROJECT_ID/locations/global/scopes/FIRST_SCOPE_NAME \
        --default-upgrade-soaking=SOAK_TIME \
        --project=SECOND_SCOPE_PROJECT_ID
    
  3. 省略可: ロールアウトのシーケンスで 3 つのチームスコープを使用する場合は、シーケンスの 3 番目のスコープにアップストリーム スコープを設定します。

    gcloud alpha container fleet scopes update projects/THIRD_SCOPE_PROJECT_ID/locations/global/scopes/THIRD_SCOPE_NAME \
        --upstream-scope=projects/SECOND_SCOPE_PROJECT/locations/global/scopes/SECOND_SCOPE_NAME \
        --default-upgrade-soaking=SOAK_TIME \
        --project=THIRD_SCOPE_PROJECT_ID
    

ロールアウト シーケンスのステータスを確認する

次のセクションでこれらのコマンドを使用して、ロールアウト シーケンスでアップグレードの進行状況を確認します。提供される詳細情報については、ロールアウト シーケンスのステータス情報をご覧ください。

これらのコマンドを実行するには、各フリート ホスト プロジェクトに必要な権限が付与されていることを確認してください。たとえば、シーケンスが異なるフリートにプロジェクト間スコープがある場合、シーケンスを記述するために、各プロジェクトの権限が必要です。

次のコマンドで、シーケンス内の 1 つのフリートまたはスコープに関する情報のみが必要な場合は、--show-linked-cluster-upgrade フラグを --show-cluster-upgrade に置き換えます。

フリート

フリートベースのロールアウト シーケンスのステータスを確認します。

gcloud container fleet clusterupgrade describe \
    --show-linked-cluster-upgrade --project=FLEET_PROJECT_ID

FLEET_PROJECT_ID は、シーケンスの任意のフリートのホスト プロジェクトのプロジェクト ID に置き換えます。

フラグの全一覧については、gcloud container fleet clusterupgrade describe のリファレンスをご覧ください。

チーム

チームベースのロールアウト シーケンスのステータスを確認します。

gcloud alpha container fleet scopes describe SCOPE_NAME \
    --show-linked-cluster-upgrade
    --project=SCOPE_PROJECT_ID

SCOPE_NAME はロールアウト シーケンスの任意のスコープ名に置き換え、SCOPE_PROJECT_ID はこのチームスコープのプロジェクト ID に置き換えます。

フラグの全一覧については、gcloud alpha container fleet scopes describe のリファレンスをご覧ください。

フリートまたはチームスコープ内の個別のクラスタのステータスを確認するには、フリート ホスト プロジェクトで次のコマンドを実行して、membershipStates セクションを表示します。

gcloud container fleet features describe clusterupgrade

ロールアウト シーケンスのステータス情報

バージョンのロールアウトのステータスをチェックすると、各グループとグループ内のクラスタの進捗状況を確認できます。

クラスタまたはグループの想定されるステータスについては、次の表をご覧ください。

ステータス クラスタ グループ
INELIGIBLE(不適格) このクラスタはこのアップグレードの対象ではありません このグループ内の 1 つ以上のクラスタはこのアップグレードの対象外です。
PENDING(保留中) アップグレードが開始していないか、クラスタのアップグレードが進行中です。 グループ内のどのクラスタでもアップグレードが開始されていません。
IN_PROGRESS(進行中) なし アップグレードが少なくとも 1 つのクラスタで開始されていますが、一部のクラスタで完了していません。
SOAKING(ソーク処理中) アップグレードはクラスタで完了し、ソーク処理がまだ完了していません。 アップグレードはすべてのクラスタで終了し、ソーキングはまだ完了していません。
FORCED_SOAKING(強制ソーク処理中) アップグレードに最長アップグレード時間(30 日間)を超える期間を要していたため、アップグレードを強制的にソークフェーズに移行しました。アップグレードはクラスタ内で続行できます。 アップグレードに最長アップグレード時間(30 日間)を超える期間を要していたため、アップグレードを強制的にソークフェーズに移行しました。アップグレードはクラスタ内で続行できます。
COMPLETE(完了) アップグレードは「完了」として扱われます。つまり、このクラスタではアップグレードにおけるソーク処理が完了しています。 アップグレードは「完了」として扱われ、ダウンストリーム グループで使用できます。つまり、アップグレードにおけるソーク処理が完了しています。

これらのコマンドの出力では、clusterUpgrade(s).spec 属性と clusterUpgrade(s).state 属性に、ソーク処理時間、クラスタのアップグレード オーバーライド、アップグレード ステータスなど、クラスタのアップグレードに関する追加情報が含まれます。

ロールアウト シーケンスを管理する

以下の各セクションで説明するように、ロールアウト シーケンスを使用してクラスタの自動アップグレードを制御する方法はいくつかあります。

グループのソーク時間を変更する

グループのデフォルトのソーク時間や、そのグループが特定のバージョンにアップグレードするソーク時間を変更できます。

デフォルトのソーク時間を更新する

グループのデフォルトのソーク時間を変更するには、ロールアウト シーケンスを作成するの手順のコマンドを使用して、アップストリーム グループを設定するフラグを省略します。

デフォルトのソーク時間をオーバーライドする

特定のバージョン ロールアウトのソーク時間を、グループのデフォルトのソーク時間とは異なるものに変更できます。たとえば、すでに新しいバージョンを認定しており、次のグループでアップグレードを開始する準備ができている場合、ソーク時間を 0 に設定できます。また、デフォルトのソーク時間を長くして特定のバージョンを認定する場合にも使用できます。

ソーク時間はグループ単位で設定されるため、このシーケンスの他のグループのソーク時間をオーバーライドする場合は、同じコマンドを使用して、シーケンスのタイプに応じてフリートまたはスコープ名を置き換えて更新します。

このセクションの手順では、次の変数を置き換えます。

  • SOAK_TIME: デフォルト以外で使用するソーク時間(例: 1 つのバージョンのロールアウトのソーク時間をスキップする場合は「0d」)。
  • UPGRADE_NAME: アップグレードのタイプ。コントロール プレーンのアップグレードの場合は k8s_control_plane、ノードのアップグレードの場合は k8s_node です。
  • VERSION: バージョン(1.25.2-gke.400 など)がこのグループにロールアウトされた後、デフォルトのソーク時間をオーバーライドする GKE バージョン。

フリート - gcloud

特定のバージョンのバージョン ロールアウトに使用されるソーク時間をオーバーライドするフリートのホスト プロジェクトで、次のコマンドを実行します。

フリートのソーク時間を変更します。

gcloud container fleet clusterupgrade update
    --add-upgrade-soaking-override=SOAK_TIME \
    --upgrade-selector=name=UPGRADE_NAME,version=VERSION

フリート - Terraform

Terraform 構成の clusterupgrade ブロック内に次の gke_upgrades_overrides ブロックを追加して、特定のバージョンのバージョン ロールアウトに使用されるソーク時間をオーバーライドします。

gke_upgrade_overrides {
    upgrade {
      name = "UPGRADE_NAME"
      version = "VERSION"
    }
    post_conditions {
      soaking = "SOAK_TIME"
    }
  }

チーム - gcloud

このコマンドは、チームスコープのフリートのホスト プロジェクトで実行します。SCOPE_NAME は、特定のバージョンのバージョン ロールアウトに使用されるソーク時間をオーバーライドするチームスコープの名前に置き換えます。

チームスコープのソーク時間を変更します。

gcloud alpha container fleet scopes update SCOPE_NAME \
    --add-upgrade-soaking-override=SOAK_TIME \
    --upgrade-selector=name=UPGRADE_NAME,version=VERSION

シーケンスの順序を変更する

シーケンスの順序を変更する場合は、ロールアウト シーケンスを作成するための手順のコマンドを使用して、アップストリーム グループを更新します。

グループのバージョン ロールアウトの完了を遅らせる

スコープがクラスタへの新しいバージョンのロールアウトを完了することを一時的に防止する必要がある場合は、メンテナンスの除外をターゲット バージョンにアップグレードされていないクラスタに追加できます。これにより、グループがソーク時間またはダウンストリーム グループに進むのを、最長 30 日間停止できます。30 日後にグループのソーク処理が開始されます。

そのグループのソーク時間を 30 日に変更することもできます。これにより、次のグループに進む前に、ロールアウト シーケンスの待機時間を最大化できます。

次のグループでアップグレードの開始をさらに遅らせる必要がある場合は、次のグループのクラスタにメンテナンスの除外を使用します。

フリートベースとチームベースのロールアウト シーケンスを切り替える

フリートベースのシーケンスからチームベースのシーケンスに、またはチームベースのシーケンスからフリートベースのシーケンスに切り替えることができます。以下の手順は、サンプル図に示されているように、シーケンス間を移動していることを前提としています。

フリートからチーム

クラスタをフリートベースのロールアウト シーケンスからチームベースのロールアウト シーケンスに変更するには、次の手順を行います。

  1. 各フリートのすべてのクラスタにメンテナンスの除外を構成し、構成の変更中にアップグレードが実施されないようにします。
  2. フリート ホスト プロジェクトGKE Enterprise が有効になっていることを確認します。
  3. 各フリートで、フリート内のクラスタのグループを分割する 1 つ以上のチームスコープを作成します。
  4. 各フリートの一致するチームスコープ間に 1 つ以上のロールアウト シーケンスを作成します。
  5. クラスタを新しいチームスコープに追加します
  6. この変更に構成したメンテナンスの除外を削除します。

チームからフリート

クラスタをチームベースのロールアウト シーケンスからフリートベースのロールアウト シーケンスに変更するには、次の手順を行います。

  1. 各フリートのすべてのクラスタにメンテナンスの除外を構成し、構成の変更中にアップグレードが実施されないようにします。
  2. フリート間のロールアウト シーケンスを作成します。
  3. クラスタをチームスコープから削除します。これで、これらのクラスタは、前のステップでロールアウト シーケンスに参加したスコープのそれぞれのフリートにのみ登録されます。
  4. チームスコープを削除します
  5. この変更に構成したメンテナンスの除外を削除します。

シーケンスを削除する

シーケンスを削除するには、2 番目と 3 番目のグループのアップストリームの関連付けを削除します(ロールアウト シーケンスに 3 つのグループがある場合)。

フリートの場合

ロールアウト シーケンスの 2 番目のフリートと 3 番目のフリートのフリート ホスト プロジェクトで次のコマンドを実行します。

gcloud container fleet clusterupgrade update --reset-upstream-fleet

チームの場合

ロールアウト シーケンスの 2 番目のスコープと 3 番目のチームスコープのフリート ホスト プロジェクトで次のコマンドを実行します。

gcloud alpha container fleet scopes update SCOPE_NAME --reset-upstream-scope

SCOPE_NAME は、それぞれ 2 番目と 3 番目のスコープの名前に置き換えます。

トラブルシューティング

ロールアウトの適格性に関するトラブルシューティング

ロールアウト シーケンス内のすべてのクラスタでアップグレード ターゲットが同じでない場合、GKE はクラスタのアップグレードを続行できない可能性があります。アップストリーム グループがダウンストリーム グループに渡す 1 つのアップグレード ターゲットに認定されない場合、自動アップグレードを続行できません。アップストリーム グループ内のクラスタがダウンストリーム グループのクラスタに対して無効なアップグレード ターゲットになった場合も、自動アップグレードを続行できません。

ロールアウト シーケンスにロールアウトの適格性の問題があるかどうかを確認するには、ロールアウト シーケンスのステータスを確認します。グループが適格でない場合は、手順に沿ってグループ内の個々のクラスタのステータスを確認します。

クラスタのアップグレードをすぐに進めるには、部分的に適格なロールアウトを進めるの手順に沿って INELIGIBLE ステータスのクラスタを削除します。

グループ内の適格性を修正する

グループ内で、クラスタが以前のバージョンであるために不適格である場合(たとえば、グループ内のほとんどのクラスタが 1.23 から 1.24 にアップグレードされ、クラスタがバージョン 1.22 である場合)、手動でクラスタを 1.24 にアップグレードし、バージョンの不一致を解決します。

グループ内で、クラスタが以降のバージョンであるために不適格である場合(たとえば、グループ内のほとんどのクラスタが 1.23 から 1.24 にアップグレードされ、クラスタがバージョン 1.25 の場合)、バージョンの不一致を解決するためにクラスタを手動でダウングレードできないため、クラスタを削除する必要があります。

グループ間の適格性を修正する

グループ間で、ダウンストリーム グループが新しいバージョンであるアップグレード ターゲットで不一致がある場合(たとえば、アップストリーム グループが 1.23 から 1.24 にアップグレードされ、ダウンストリーム グループのクラスタが 1.25 の場合)、アップストリーム グループ内のクラスタを 1.25 に手動でアップグレードして、アップグレードを確実に続行します。

グループ間で、ダウンストリーム グループが以前のバージョンであるアップグレード ターゲットで不一致がある場合(たとえば、アップストリーム グループが 1.24 から 1.25 にアップグレードされ、ダウンストリーム グループのクラスタが 1.23 の場合)、ダウンストリーム グループ内のクラスタを 1.24 または 1.25 に手動でアップグレードして、アップグレードを確実に続行します。

部分的に適格なロールアウトを進める

ロールアウトの適格性に関する問題(たとえばグループ内のバージョンの違いなど)のために、グループ内のクラスタ アップグレードが完了しない場合は、グループのアップグレード ターゲットに不適格なクラスタをグループから削除して、バージョンのロールアウトを完了し、ソーク時間を開始するか、ロールアウト シーケンス内の次のグループに進みます。また、他の理由(たとえば、このクラスタの使用状況がグループ内の他のクラスタに関連していない場合)のために、グループからクラスタを削除することもできます。

ロールアウト シーケンスの種類に応じて、フリートからクラスタの登録を解除する、またはチームスコープからクラスタを削除するの手順に沿って操作します。

グループのバージョンのロールアウトが完了しない原因となっているクラスタをすべて削除すると、グループのバージョンのロールアウトが完了します。バージョンのロールアウトのステータスを確認するの手順に沿って、これを確認します。

次のステップ