MIG のインスタンスを更新する

このドキュメントでは、マネージド インスタンス グループ(MIG)の仮想マシン(VM)インスタンスにインスタンス テンプレートとインスタンスごとの構成の更新を適用する方法について説明します。

次のような場合は、MIG のインスタンス テンプレートを更新することをおすすめします。

  • 各インスタンスでアプリケーションやオペレーティング システムを更新する場合
  • A/B テストを実施して、同じアプリの異なるバージョンを比較する場合。
  • 新しいバージョンをテストする際の中断を最小限に抑えるためにカナリア更新を実行する場合。
  • マシンタイプやディスク オプションなど、MIG のインスタンスの他の仕様を変更する場合。

インスタンス テンプレートの新しいバージョンは、次のいずれかの方法で適用します。

  • 自動ローリング アップデート。MIG が、インスタンス テンプレートの新しいバージョンを MIG のマネージド インスタンスのすべてまたは一部に自動的にロールアウトします。更新範囲と中断のレベルは、構成する更新ポリシーによって変ります。
  • 特定インスタンスの選択更新。選択した特定のインスタンスを対象にして更新できます。この方法は、ステートフル MIG の場合、または更新を手動でオーケストレートする場合に使用します。

ステートフル MIG がある場合、選択更新を使用してインスタンスごとの構成に加えた変更を適用することもできます。

MIG のサイズ変更のみが必要な場合は、ドキュメントで MIG でインスタンスを追加または削除する方法をご確認ください。

制限事項

  • MIG にステートフル構成がある場合、自動ローリング アップデートは使用できません。代わりに、特定のインスタンスを選択更新することにより、更新を制御して、中断を限定的なものにします。
  • カスタム インスタンス名を使用して、ステートフル ディスクやメタデータを構成しない場合は、自動更新を使用できます。ただし、インスタンス名を保持するには、置換メソッドRECREATE に設定する必要があります。

自動更新か選択更新かの選択

ステートレス MIG のインスタンスのすべてまたは一部に新しいテンプレートを自動的にロールアウトするには、MIG の更新タイプを PROACTIVE に設定します。ステートフル MIG がある場合や、自動更新が大がかりになる可能性がある場合は、MIG の更新タイプを OPPORTUNISTIC に設定してから、特定のインスタンスを選択して更新します。

自動先行型更新

MIG の更新タイプを PROACTIVE に設定すると、次に示す 2 つの主なメリットがあります。

  • 更新のロールアウトは指定に従って自動的に実行されます。最初のリクエストの後にユーザーが新たに入力する必要はありません。デプロイの速度、サービス中断のレベル、更新範囲を指定できます。
  • 部分的なロールアウトを自動化して、カナリアテストを行うことができます。

先行型ローリング アップデートが開始すると、MIG は積極的にアクションをスケジュールし、必要に応じてリクエストされた更新をインスタンスに適用します。多くの場合、これはインスタンスを先に削除して再作成することを意味します。

詳細については、MIG のインスタンスに更新を自動的にロールアウトするをご覧ください。

選択更新

特定のインスタンスを選択して更新することには、次のメリットがあります。

  • 更新するインスタンスを選択できます。
  • 更新の完了に必要な中断を最小限に抑えて更新を適用できます。たとえば、メタデータだけを更新する場合、更新を完了するためにインスタンスを再起動する必要はありません。デフォルトでは、必要最小限のアクションが自動的に実行されます。
  • 更新の適用に必要ない場合でも、インスタンスを強制的に再起動または再作成できます。たとえば、VM のメタデータのみを更新する場合でも、ゲスト ソフトウェアが VM 起動時に新しいメタデータを適用できるよう、VM を再起動できます。
  • 許容可能なレベルを超える中断が必要な場合は、更新を止めることが可能です。

先行型更新で、選択した更新と競合しないようにするには、MIG の更新タイプを OPPORTUNISTIC に設定します。

追従型更新

更新タイプが OPPORTUNISTIC に設定されている場合、MIG は、特定のインスタンスを選択して更新が適用されたとき、または MIG が新しいインスタンスを作成した場合にのみ更新を適用します。MIG が新しいインスタンスを作成するのは、自動または手動でインスタンスのサイズが変更された場合です。更新を適用するためのリクエストが Compute Engine から積極的に開始されることはありません。

システムの不安定さはできる限り避けたいものであるため、日和見更新は特定のシナリオにおいて有用です。たとえば、緊急性がなく必要に応じて適用可能な更新があり、アクティブに自動スケーリングされている MIG がある場合は、Compute Engine で更新を適用する既存のインスタンスを積極的に破棄しないように、追従型更新を行います。サイズを縮小する場合、オートスケーラーは古いテンプレートで作成されたインスタンスと、まだ RUNNING 状態でないインスタンスを優先的に解除します。

詳細については、MIG 内のインスタンスを選択して更新するをご覧ください。

追従型更新または先行型更新の設定

デフォルトでは、Cloud Console または gcloud コマンドライン ツールで開始する更新は先行型です。つまり、更新は自動的に開始します。一方、Compute Engine API で開始する更新は追従型で、既存のインスタンスに新しいテンプレートがプロアクティブに適用されません。

追従型更新か先行型更新かを選択するには、Cloud Console、gcloud コマンドライン ツール、または Compute Engine API でモードを追従型または先行型に設定します。

Console

  1. Cloud Console で、[インスタンス グループ] ページに移動します。

    [インスタンス グループ] ページに移動

  2. 更新する MIG を選択します。

  3. ページ上部の [ROLLING UPDATE] をクリックします。

  4. [更新モード] で、先行型または追従型を選択します。

gcloud

rolling-action start-update コマンドを使用し、--type フラグを opportunistic または proactive に設定します。

gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --version=template=INSTANCE_TEMPLATE \
    --type=opportunistic|proactive \
    [--zone=ZONE | --region=REGION]

API

ゾーンまたはリージョン上の MIG リソースの patch メソッドを呼び出します。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME

{
  "updatePolicy": {
    "type": "TYPE" # Choose an opportunistic or proactive update
  },
  "versions": [{
    "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE",
    }]
}

以下を置き換えます。

  • NEW_TEMPLATE: グループの新しいテンプレートの名前
  • TYPE: 更新のタイプ(OPPORTUNISTIC または PROACTIVE

新しいテンプレートを設定してから、そのテンプレートを MIG の新しいインスタンスと既存のインスタンスに適用する方法については、次のページをご覧ください。

versions フィールドと instanceTemplate フィールドの関係

Compute Engine API を使用する場合は、instanceGroupManagers.versions フィールドと regionInstanceGroupManagers.versions フィールドを使用して、ゾーン / リージョン MIG のインスタンス テンプレートを構成することをおすすめします。

以前の instanceTemplate フィールドは、機能的に versions フィールドと重複しています。どちらのフィールドでも、MIG がインスタンスの作成に使用するインスタンス テンプレートを指定できます。ただし、高度な 2 つのテンプレート(カナリア)構成を指定できるのは、versions フィールドのみです。

下位互換性を維持するために、MIG では引き続き最上位の instanceTemplate フィールドの設定がサポートされますが、versions フィールドのみの使用に切り替えることをおすすめします。最上位の instanceTemplate フィールドと versions フィールドを同時に使用すると、あいまいさや混乱の原因となります。

update() メソッドや patch() メソッドを呼び出す際に instanceTemplateversions の両方のフィールドを指定した場合、次の 3 つの可能性が考えられます。

  • 両方のフィールドを同じ値に設定する。

    これは有効なリクエストです。この場合、あいまいさがなくなり、新しいインスタンス テンプレートが MIG に適用されます。

    たとえば、次のリクエストでは、最上位の instanceTemplate および versions フィールドに既存のテンプレートと異なるインスタンス テンプレートを指定すると、MIG は新しいインスタンス テンプレートに更新されます。

    {
     "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE",
     "versions": [
      {
       "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE"
      }
     ],
     "updatePolicy": {
       "type": "PROACTIVE"
     }
    }
    
  • 両方のフィールドの設定値が一致せず、片方が MIG 内の現在のインスタンス テンプレートと異なる。

    これは有効なリクエストです。現在の設定と異なるフィールドが、目的の値として取得されます。たとえば、update() メソッドを呼び出し、両方のフィールドを指定しますが、1 つのフィールドのみが最新の場合です。

    {
     "instanceTemplate": "global/instanceTemplates/CURRENT_TEMPLATE",
     "versions": [
      {
       "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE"
      }
     ],
     "updatePolicy": {
       "type": "PROACTIVE"
     }
    }
    
  • 両方のフィールドの設定値が一致せず、どちらも MIG 内の現在のインスタンス テンプレートと異なる。

    この設定は無効で、意図が明確でないためエラーが返されます。

    {
     "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE",
     "versions": [
      {
       "instanceTemplate": "global/instanceTemplates/A_DIFFERENT_NEW_TEMPLATE"
      }
     ],
     "updatePolicy": {
       "type": "PROACTIVE"
     }
    }
    

versions フィールド、instanceTemplate フィールドと get() メソッド

最上位の instanceTemplate フィールドと versions フィールドの一方または両方を使用して、インスタンス テンプレートを 1 つだけ指定した場合、get() メソッドはそのレスポンスに両方のフィールドを返します。これにより、新しい versions フィールドで下位互換性が維持されます。これらのフィールドのいずれかに単一のインスタンス テンプレートを指定していれば、get() メソッドで返される instanceTemplate フィールドに変更はありません。

versions フィールドに 2 つのインスタンス テンプレートが指定されている場合、get() メソッドは最上位の instanceTemplate フィールドを空の状態で返します。カナリア更新中に最上位の instanceTemplate フィールドが使用されないように、そのフィールドにカナリアの 2 つのインスタンス テンプレート構成を明確に表現する方法はありません。

versions フィールドと setInstanceTemplate() メソッド

下位互換性を確保するために、setInstanceTemplate() メソッドはこれまでと同じように動作し、MIG がインスタンスの作成に使用するテンプレートを変更できます。このメソッドを呼び出すと、versions フィールドは setInstanceTemplate() メソッドに指定されたインスタンス テンプレートでオーバーライドされます。

また、setInstanceTemplate() メソッドは updatePolicyOPPORTUNISTIC に設定します。これにより、MIG は、versions フィールドで明示的に指定されていないインスタンス テンプレートを能動的に展開しなくなります。

次のステップ