ロールバック、段階的なロールアウト、トラフィックの移行

Knative serving では、トラフィックを受信するリビジョンと、リビジョンが受信するトラフィックの割合を指定できます。この機能を使用すると、以前のリビジョンへのロールバック、リビジョンの段階的なロールアウト(Blue/Green デプロイともいいます)、複数のリビジョン間でのトラフィックの分割ができます。このページでは、この機能を使用して Knative serving リビジョンへのトラフィックを管理する方法について説明します。

以前のリビジョンにロールバックする

以前のリビジョンにロールバックするには:

コンソール

  1. Google Cloud コンソールで Knative serving に移動します。

    Knative serving に移動

  2. サービスリストでサービスを見つけてクリックします。

  3. [リビジョン] タブをクリックして、そのサービスの現在のリビジョンのリストを表示します。

  4. リビジョンのリストで、ロールバックしているリビジョンの右側にある省略記号アイコンをクリックします。

  5. [トラフィックの管理] をクリックして、トラフィック管理フォームを表示します。

    1. プルダウン リストからロールバックする以前のリビジョンを選択します。
    2. 前のリビジョンのトラフィックの割合を 100 に設定します。
    3. 現在、配信されているリビジョンの割合を 0 に設定します。
    4. [保存] をクリックします。

コマンドライン

次のコマンドを使用します。

gcloud run services update-traffic SERVICE --to-revisions REVISION=100

  • SERVICE は、サービスの名前に置き換えます。
  • REVISION は、ロールバックするリビジョンの名前に置き換えます。

YAML

--format=export フラグを使用して、gcloud run services describe コマンドで既存のサービスの構成を YAML ファイルにダウンロードできます。次に YAML ファイルを変更し、gcloud run services replace コマンドを使用してこれらの変更をデプロイします。指定した属性のみを変更する必要があります。

  1. ローカル ワークスペースの service.yaml という名前のファイルにサービスの構成をダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml

    SERVICE は、Knative serving サービスの名前に置き換えます。

  2. ローカル ファイルで、spec にある traffic 属性を更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION
        percent: 100
    

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

    • REVISION は、ロールバックするリビジョンの名前に置き換えます。
  3. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml

リビジョンを段階的にロールアウトする

新しいリビジョンを段階的にロールアウト(Blue / Green デプロイメント)するには:

コンソール

  1. Google Cloud コンソールで Knative serving に移動します。

    Knative serving に移動

  2. サービスリストでサービスを見つけてクリックします。

  3. [Deploy New Revision] をクリックします。

  4. 必要に応じてデプロイ フォームに記入します。[このリビジョンをすぐに利用する] のチェックボックスは必ずオフにしてください。

  5. [デプロイ] をクリックします。

  6. [トラフィックを管理] をクリックします。

  7. 新しいリビジョンが一覧表示されますが、割合は 0 に設定され、現在はトラフィックが処理されていないことを示します。フォームで次の操作を行います。

    1. 目的の割合(たとえば 5 )に設定します。現在配信中のバージョンの割合は、自動的に同じ値が減少します。
    2. [保存] をクリックします。
    3. これらの [トラフィックの管理] 手順を繰り返します。割合を変更する場合は、新しいリビジョンに必要な割合を増やします。トラフィックの割合を変更するために再デプロイする必要はありません。

コマンドライン

  1. 初期の段階でトラフィックを受信せず、段階的にロールアウトするリビジョンをデプロイするには、--no-traffic パラメータを指定して update コマンドを実行します。

    gcloud run deploy --image IMAGE --no-traffic

    IMAGE は、デプロイするイメージに置き換えます。

  2. 新しいリビジョンに処理するトラフィックの割合(たとえば、5%)を指定します。

    gcloud run services update-traffic SERVICE --to-revisions REVISION=PERCENTAGE
    • SERVICE は、サービスの名前に置き換えます。
    • REVISION は、段階的にロールアウトするリビジョンの名前に置き換えます。最新のリビジョンを指定するには、LATEST を使用します(たとえば、LATEST=5 )。
    • PERCENTAGE は、新しいリビジョンに送信するトラフィックの割合に置き換えます。たとえば、5 ではトラフィックの 5% が送信されます。
  3. リビジョンのパフォーマンスが十分な場合は、上記の update-traffic ステップを繰り返しますが、必要に応じて割合の値を増やします。

YAML

--format=export フラグを使用して、gcloud run services describe コマンドで既存のサービスの構成を YAML ファイルにダウンロードできます。次に YAML ファイルを変更し、gcloud run services replace コマンドを使用してこれらの変更をデプロイします。指定した属性のみを変更する必要があります。

  1. ローカル ワークスペースの service.yaml という名前のファイルにサービスの構成をダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml

    SERVICE は、Knative serving サービスの名前に置き換えます。

  2. さまざまな構成に関するページで説明されている手順に沿ってサービスに必要な構成の変更を行い、新しいリビジョンのリビジョン名を指定します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    template:
      metadata:
        annotations:
          ...
        name: REVISION-NAME
     ```
    
    Replace
    
    • REVISION-NAME は、新しいリビジョンに付ける名前に置き換えます。
  3. spec 属性の下にある traffic 属性を見つけて、新しいリビジョンが少量のトラフィックのみを処理するように更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION-NEW
        percent: PERCENT-NEW
      - revisionName: REVISION-FORMER
        percent: PERCENT-FORMER
    

    割合を合計すると 100 になる必要があります。次のように置き換えます。

    • REVISION-NEW は、段階的にロールアウトするリビジョンの名前に置き換えます。
    • REVISION-FORMER は、現在トラフィックを処理しているリビジョンの名前に置き換えます。
    • PERCENT-NEW は、新しいリビジョンに送信するトラフィックの割合に置き換えます。たとえば、10 を使用すると、新しいリビジョンにトラフィックの 10% が送信されます。
    • PERCENT-FORMER は、古いリビジョンに送信するトラフィックの割合に置き換えます。

複数のリビジョン間でトラフィックを分割する

2 つ以上のリビジョン間でトラフィックを分割するには:

コンソール

  1. Google Cloud コンソールで Knative serving に移動します。

    Knative serving に移動

  2. サービスリストでサービスを見つけてクリックします。

  3. [トラフィックを管理] をクリックします。

  4. 現在、配信されている新しいリビジョンが一覧表示されます。フォームで次の操作を行います。

    1. 現在、配信されているリビジョンの割合を目的の値に分割します。
    2. プルダウン リストを使用して以前のリビジョンの 1 つを選択し、割合を目的の分割に設定します。
    3. 他のリビジョン間でトラフィックを分割するには、[リビジョンを追加] をクリックして目的のリビジョンを選択し、割合を目的の分割に設定します。
    4. [保存] をクリックします。

コマンドライン

各リビジョンのリビジョンとトラフィックの割合をカンマ区切りリストで指定します。

gcloud run services update-traffic SERVICE --to-revisions LIST

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

  • SERVICE は、サービスの名前に置き換えます。
  • LIST には、トラフィックを受信するリビジョンとそのリビジョンが受信するトラフィックの割合をカンマ区切りのリストで指定します。割合は合計が 100% になるように設定します。
    REVISION1=PERCENTAGE1,REVISION2=PERCENTAGE2,REVISIONn=PERCENTAGEn
    例: hello2-00005-red=25,hello2-00001-bod=25,hello2-00002-nan=50

YAML

--format=export フラグを使用して、gcloud run services describe コマンドで既存のサービスの構成を YAML ファイルにダウンロードできます。次に YAML ファイルを変更し、gcloud run services replace コマンドを使用してこれらの変更をデプロイします。指定した属性のみを変更する必要があります。

  1. ローカル ワークスペースの service.yaml という名前のファイルにサービスの構成をダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml

    SERVICE は、Knative serving サービスの名前に置き換えます。

  2. 新しいリビジョンが少量のトラフィックのみを処理するように、ローカル ファイルで traffic 属性を更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION-A
        percent: PERCENT-A
      - revisionName: REVISION-B
        percent: PERCENT-B
      - revisionName: REVISION-C
        percent: PERCENT-C
    

    割合の合計は 100 にする必要があります。次のように置き換えます。

    • REVISION-AREVISION-BREVISION-C は、トラフィックを割り当てるリビジョンに置き換えます。
    • PERCENT-APERCENT-BPERCENT-C は、対応するリビジョンに送信するトラフィックの割合に置き換えます。
  3. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml

すべてのトラフィックを最新のリビジョンに送信する

新しいリビジョンをデプロイすると、このリビジョンを作成でき、将来のすべてのリビジョンがトラフィックの 100% をできるだけ早く処理し、確立されたトラフィック分割を上書きします。

コンソール

  1. Google Cloud コンソールで Knative serving に移動します。

    Knative serving に移動

  2. サービスリストでサービスを見つけてクリックします。

  3. [新しいリビジョンをデプロイする] をクリックします。

  4. 必要に応じてデプロイ フォームに記入します。[このリビジョンをすぐに利用する] のチェックボックスは必ずオンにしてください。これにより、既存のトラフィック分割が上書きされ、新しいリビジョンがトラフィックの 100% を処理します。

  5. [デプロイ] をクリックします。

コマンドライン

すべてのトラフィックを最近デプロイされたリビジョンに送信するには:

gcloud run services update-traffic SERVICE --to-latest

SERVICE は、サービスの名前に置き換えます。

YAML

--format=export フラグを使用して、gcloud run services describe コマンドで既存のサービスの構成を YAML ファイルにダウンロードできます。次に YAML ファイルを変更し、gcloud run services replace コマンドを使用してこれらの変更をデプロイします。指定した属性のみを変更する必要があります。

  1. ローカル ワークスペースの service.yaml という名前のファイルにサービスの構成をダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml

    SERVICE は、Knative serving サービスの名前に置き換えます。

  2. ローカル ファイルで、spec にある traffic 属性を更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - latestRevision: true
        percent: 100
    
  3. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml

テスト、トラフィックの移行、ロールバックにタグを使用する

サービスをデプロイすると、新しいリビジョンを作成して、トラフィックを処理せずに特定の URL のリビジョンにアクセスできるようにタグを割り当てることができます。このタグを使用して、タグ付きリビジョンにトラフィックを段階的に移行し、タグ付きリビジョンをロールバックできます。

この機能の一般的な使用例は、新しいサービス リビジョンをトラフィックの処理前にテストして確認することです。一般的なシーケンスは次のとおりです。

  1. 開発中にコンテナで統合テストを行います。
  2. ステージングにのみ使用する Google Cloud プロジェクトにコンテナをデプロイし、トラフィックを処理せずに、タグ付きリビジョンをテストします。
  3. トラフィックを処理せずに本番環境にデプロイし、本番環境でタグ付けされたリビジョンに対してテストします。
  4. タグ付きリビジョンにトラフィックを移行します。

新しいタグ付きリビジョンをデプロイする

既存のサービスの新しいリビジョンを本番環境にデプロイするには:

gcloud run deploy myservice --image IMAGE_URL  --no-traffic --tag TAG_NAME

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

  • IMAGE_URL は、イメージの URL に置き換えます。
  • TAG_NAME は、小文字のタグ名に置き換えます。

このタグを使用すると、トラフィックを処理することなく、特定の URL で新しいリビジョンを直接テストできます。テスト URL は、指定したタグ名で始まります。 http://{TAG_NAME}---{SERVICE_NAME}.{NAMESPACE}.kuberun.{EXTERNAL_IP}.nip.io

たとえば、サービス myservice でタグ名 green を使用した場合、URL https://green---myservice.default.kuberun.11.111.11.111.nip.io でタグ付きリビジョンをテストします。

トラフィックをタグ付きリビジョンに移行する

新しいリビジョンが適切に機能していることを確認したら、Google Cloud コンソール、gcloud コマンドライン、または YAML ファイルを使用してトラフィックの移行を開始できます。

コンソール

  1. Google Cloud コンソールで Knative serving に移動します。

    Knative serving に移動

  2. サービスリストでサービスを見つけてクリックします。

  3. トラフィックの送信先となるタグ付きリビジョンを選択します。

  4. [トラフィックを管理] をクリックします。

  5. タグ付けされているリビジョン名を見つけます。割合は 0 に設定されています。これは、現在トラフィックが処理されていないことを示します。トラフィックの管理* フォームの場合:

    1. 目的の割合(たとえば 5 )に設定します。現在配信中のバージョンの割合は、自動的に同じ値が減少します。
    2. [保存] をクリックします。
    3. 必要に応じて、このトラフィックの管理手順を数時間または数日繰り返します。ただし、割合を変更した場合は、必要に応じてタグ付けされたリビジョンに割合を増やします。トラフィックの割合を変更するために再デプロイする必要はありません。

コマンドライン

トラフィックを特定のリビジョンタグに移行するには:

gcloud run deploy update-traffic myservice --tag TAG_NAME=TRAFFIC_PERCENT

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

  • TAG_NAME は、トラフィックの移行先のタグの名前で置き換えます。
  • TRAFFIC_PERCENT は、タグ付きリビジョンで処理するトラフィックの割合で置き換えます(たとえば、1)。

YAML

--format=export フラグを使用して、gcloud run services describe コマンドで既存のサービスの構成を YAML ファイルにダウンロードできます。次に YAML ファイルを変更し、gcloud run services replace コマンドを使用してこれらの変更をデプロイします。指定した属性のみを変更する必要があります。

  1. ローカル ワークスペースの service.yaml という名前のファイルにサービスの構成をダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml

    SERVICE は、Knative serving サービスの名前に置き換えます。

  2. さまざまな構成に関するページで説明されている手順に沿って、サービスに必要な構成の変更を行います。

  3. spec 属性の下で、タグ付きリビジョンの traffic 属性を見つけて更新します。これにより、タグ付きリビジョンが少数のトラフィックのみを処理するようになります。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION
        tag: TAG_NAME
        percent: PERCENT-NEW
      - revisionName: REVISION-FORMER
        percent: PERCENT-FORMER
    

    割合を合計すると 100 になる必要があります。次のように置き換えます。

    • REVISION は、タグ付きリビジョンの名前に置き換えます。
    • TAG_NAME は、段階的にロールアウトするタグの名前に置き換えます。
    • PERCENT-NEW は、タグ付きリビジョンに送信するトラフィックの割合に置き換えます。たとえば、10 を使用して、そのリビジョンにトラフィックの 10% を送信します。
    • REVISION-FORMER は、現在トラフィックを処理しているリビジョンの名前に置き換えます。
    • PERCENT-FORMER は、古いリビジョンに送信するトラフィックの割合に置き換えます。
  4. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml