Cloud Run へのカナリア デプロイ

このドキュメントでは、Cloud Deploy を使用して、カナリア デプロイを構成して使用し、Cloud Run(ジョブではなくサービスのみ)にアプリケーションをデプロイする方法について説明します。

カナリア デプロイは、アプリケーションの新しいバージョンの段階的なロールアウトです。アプリケーションのパフォーマンスをモニタリングしながら、新しいバージョンに送信されるトラフィックの割合を徐々に増やします。これにより、潜在的な問題を早期に検出し、ユーザーへの影響を最小限に抑えることができます。

Cloud Run でのカナリア デプロイの仕組み

カナリア デプロイ戦略を使用して Cloud Run にデプロイすると、Cloud Deploy は既存のサービスを新しいリビジョンで更新します。新しいリビジョンは指定された割合のトラフィックを受信し、古いリビジョンは残りのトラフィックを受信し続けます。新しいリビジョンへのトラフィック分割を時間の経過とともに徐々に増やします。

Cloud Deploy を使用すると、Cloud Run へのカナリア デプロイを 1 つのステージまたは複数のステージで構成できます。

ここでの手順には、カナリア構成に固有の内容のみが含まれています。ドキュメント Cloud Run サービスまたはジョブをデプロイするには、デプロイ パイプラインの構成と実行に関する一般的な手順が記載されています。

必要な権限があることを確認してください

Cloud Deploy の使用に必要な他の Identity and Access Management 権限に加えて、カナリア デプロイに必要な追加のアクションを実行するには、次の権限が必要です。

  • clouddeploy.rollouts.advance
  • clouddeploy.rollouts.ignoreJob
  • clouddeploy.rollouts.cancel
  • clouddeploy.rollouts.retryJob
  • clouddeploy.jobRuns.get
  • clouddeploy.jobRuns.list
  • clouddeploy.jobRuns.terminate

使用可能なロールにこれらの権限が含まれているかどうかについては、IAM のロールと権限をご覧ください。

skaffold.yaml を準備する

skaffold.yaml ファイルは、Cloud Run サービス定義のレンダリングとデプロイの方法を定義します。Cloud Run へのカナリア デプロイでは、サービス定義ファイルが正しく指定され、必要なビルド アーティファクト(コンテナ イメージなど)が定義されていることを確認します。skaffold.yaml 自体には、標準デプロイに必要な構成以外に、カナリア固有の特別な構成は必要ありません。Skaffold プロファイルを使用して、カスタム カナリア フェーズのさまざまなサービス定義バリエーションを管理できます。

サービス定義を準備する

通常の Cloud Run サービス定義ファイルで十分ですが、traffic スタンザは不要です。Cloud Deploy は、最後に成功したリビジョンと新しいリビジョンの間でトラフィックを分割する処理を管理します。

service.yaml の例(traffic スタンザなし):

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: my-cloudrun-service
spec:
  template:
    spec:
      containers:
      - image: gcr.io/my-project/my-cloudrun-app
        ports:
        - containerPort: 8080

自動カナリアを構成する

特定の Cloud Run ステージのデリバリー パイプライン定義内で、自動カナリアを直接構成します。Cloud Deploy は、指定された割合に従って、最後の安定版リビジョンと新しいリビジョン間でトラフィックを分割するように Cloud Run に自動的に指示します。

serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          cloudRun:
            automaticTrafficControl: true
        canaryDeployment:
          percentages: [PERCENTAGES]
          verify: true|false
          predeploy:
            actions: "PREDEPLOY_ACTION"
          postdeploy:
            actions: "POSTDEPLOY_ACTION"

この構成では、次の処理が行われます。

  • PERCENTAGES は、カナリア増分を表す割合値のカンマ区切りリストです(例: [25, 50, 75])。なお、これには 100 は含まれません。デプロイの 100% がカナリアで想定され、stable フェーズで処理されるためです。

  • デプロイ検証verify: true)を有効にできます。有効にすると、各カナリア フェーズに verify ジョブが追加されます。

  • PREDEPLOY_ACTION

    skaffold.yaml で使用した ACTION_NAME と同じです。これは、デプロイ前に実行するカスタム アクションを定義するために使用します。

  • POSTDEPLOY_ACTION

    skaffold.yaml で使用した ACTION_NAME と同じです。これは、デプロイ後に実行するカスタム アクションを定義するために使用します。

カスタム カナリアを構成する

Cloud Deploy が提供する自動化に完全に依存する代わりに、カナリアを手動で構成することもできます。カスタム カナリア構成では、デリバリー パイプラインの定義で次のものを指定します。

  • ロールアウト フェーズ名

    完全に自動化されたカナリアでは、Cloud Deploy がフェーズに名前を付けます(canary-25canary-75stable など)。ただし、カスタム カナリアでは、このカナリア ステージのすべてのフェーズで一意であり、リソース ID の制限を満たす限り、各フェーズに任意の名前を付けることができます。ただし、最終(100%)フェーズの名前は stable にする必要があります。

  • 各フェーズの割合の目標

    フェーズごとに割合を個別に指定します。

  • フェーズで使用する Skaffold プロファイル

    フェーズごとに個別の Skaffold プロファイルを使用することも、同じプロファイルを使用することも、任意の組み合わせを使用することもできます。プロファイルは、それぞれ異なる Cloud Run サービス定義を使用できます。特定のフェーズに複数のプロファイルを使用することもできます。Cloud Deploy はこれらを組み合わせます。

  • そのフェーズの確認ジョブがあるかどうか

    確認を有効にする場合は、確認用に skaffold.yaml構成する必要があるので注意してください。

  • そのフェーズにデプロイ前ジョブまたはデプロイ後ジョブがあるかどうか

    デプロイ前ジョブまたはデプロイ後ジョブを有効にする場合は、これらのジョブの skaffold.yaml構成する必要があります。

カスタム カナリアでは、すべてのターゲット タイプがサポートされています。

カスタム カナリアの構成要素

次の YAML は、完全にカスタムのカナリア デプロイのフェーズの構成を示しています。

strategy:
  canary:
    # Custom configuration for each canary phase
    customCanaryDeployment:
      phaseConfigs:
      - phaseId: "PHASE1_NAME"
        percentage: PERCENTAGE1
        profiles: [ "PROFILE_NAME" ]
        verify: true | false
        predeploy:
          actions: "PREDEPLOY_ACTION"
        postdeploy:
          actions: "POSTDEPLOY_ACTION"
      - 
      - phaseId: "stable"
        percentage: 100
        profiles: [ "LAST_PROFILE_NAME" ]
        verify: true|false
        predeploy:
          actions: "PREDEPLOY_ACTION"
        postdeploy:
          actions: "POSTDEPLOY_ACTION"

この YAML の内容は以下のとおりです。

  • PHASE1_NAME

    フェーズの名前です。各フェーズ名は一意である必要があります。

  • [ "PROFILE_NAME" ]

    フェーズで使用するプロファイルの名前です。フェーズごとに同じプロファイル、フェーズごとに異なるプロファイル、または任意の組み合わせで使用することもできます。複数のプロファイルを指定することもできます。Cloud Deploy では、指定したすべてのプロファイル、ステージ全体で使用されるプロファイルまたはマニフェストを使用します。

  • stable

    最終フェーズには stable という名前を付ける必要があります。

  • PERCENTAGE1

    最初のフェーズでデプロイする割合です。各フェーズは一意の割合値を持つ必要があり、その値は全体の割合である必要があります(たとえば、10.5 ではありません)。フェーズは昇順である必要があります。

  • verify: true|false

    このフェーズの確認ジョブを含めるかどうかを Cloud Deploy に指示します。確認を使用する各フェーズで、Skaffold は、そのフェーズのレンダリングとデプロイに指定された確認と同じプロファイルを使用します。

  • PREDEPLOY_ACTION

    skaffold.yaml で使用した ACTION_NAME と同じです。これは、デプロイ前に実行するカスタム アクションを定義するために使用されます。

  • POSTDEPLOY_ACTION

    skaffold.yaml で使用した ACTION_NAME と同じです。これは、デプロイ後に実行するカスタム アクションを定義するために使用されます。

最終フェーズの割合は 100 にする必要があります。フェーズは、この customCanaryDeployment スタンザで構成した順序に従って実行されますが、割合の値が昇順でない場合は、デリバリー パイプラインを登録するコマンドはエラーで失敗します。

カスタム カナリアの構成には runtimeConfig スタンザは含まれません。runtimeConfig を含めると、カスタム自動カナリアと見なされます。

カスタム自動カナリアを構成する

これにより、カスタム フェーズの定義(名前、割合、プロファイル、検証、フック)と Cloud Run の Cloud Deploy の自動トラフィック管理が組み合わされます。フェーズはユーザーが定義しますが、Cloud Run にトラフィックを割合に基づいてシフトするよう指示するのは Cloud Deploy です。

これを構成するには、strategy.canary ブロック内に runtimeConfig.cloudRun.automaticTrafficControl: true 設定と customCanaryDeployment セクション(phaseConfigs を定義)の両方を含めます。Cloud Deploy は、指定された Skaffold プロファイルを使用してサービス定義をレンダリングします(このサービス定義には traffic スタンザは含まれません)。ただし、フェーズの割合に従ってトラフィックを自動的に管理します。

serialPipeline:
  stages:
  - targetId: cloudrun-prod
    profiles: []
    strategy:
      canary:
        # Include runtimeConfig for automatic traffic management
        runtimeConfig:
          cloudRun:
            automaticTrafficControl: true
        # Include customCanaryDeployment for phase customization
        customCanaryDeployment:
          phaseConfigs:
          - phaseId: "warmup-cr"
            percentage: 10
            profiles: ["base-config"] # Profile rendering service def (no traffic stanza)
            verify: true
          - phaseId: "scaling-cr"
            percentage: 50
            profiles: ["base-config"] # Can use the same profile
            verify: true
          - phaseId: "stable"
            percentage: 100
            profiles: ["base-config"]
            verify: true

Cloud Run カナリアを実行する

  1. パイプラインとターゲットを登録する: デリバリー パイプラインと Cloud Run ターゲット構成ファイルを適用します。

    
    gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION
    gcloud deploy apply --file=cloudrun-targets.yaml --region=REGION
    

    配信パイプラインには、選択したランタイムの自動またはカスタムのカナリア構成が含まれます。

  2. リリースを作成する: イメージ名を指定してデプロイを開始します。

    
    gcloud deploy releases create RELEASE_NAME \
                                    --delivery-pipeline=PIPELINE_NAME \
                                    --region=REGION
    

    PIPELINE_NAME で識別されるデリバリー パイプラインには、このドキュメントで説明する自動カナリア構成またはカスタム カナリア構成が含まれています。

  3. カナリアを進める:

    gcloud CLI

    gcloud deploy rollouts advance ROLLOUT_NAME \
                                --release=RELEASE_NAME \
                                --delivery-pipeline=PIPELINE_NAME \
                                --region=REGION
    

    ここで

    ROLLOUT_NAME は、次のフェーズに進める現在のロールアウトの名前です。

    RELEASE_NAME は、このロールアウトが属するリリースの名前です。

    PIPELINE_NAME は、このリリースのデプロイを管理するために使用するデリバリー パイプラインの名前です。

    REGION は、リリースが作成されたリージョンの名前です(例: us-central1)。必須入力項目です。

    gcloud deploy rollouts advance コマンドの詳細については、Google Cloud SDK リファレンスをご覧ください。

    Google Cloud コンソール

    1. [デリバリー パイプライン] ページを開く

    2. デリバリー パイプラインのリストに表示されているパイプラインをクリックします。

      デリバリー パイプラインの詳細ページには、デリバリー パイプラインの進行状況がグラフィカルに表示されます。

    3. [ロールアウト] タブの [デリバリー パイプラインの詳細] で、ロールアウトの名前をクリックします。

      そのロールアウトのロールアウトの詳細ページが表示されます。

       Google Cloud コンソールでのロールアウトの詳細

      この例では、ロールアウトに canary-50 フェーズと stable フェーズがあります。ロールアウトには、より多くのフェーズや異なるフェーズが含まれる場合があります。

    4. [ロールアウトを進める] をクリックします。

      ロールアウトを次のフェーズに進めます。

スキップされるフェーズ

カナリアをデプロイするときに、アプリケーションがそのランタイムにデプロイされていない場合、Cloud Deploy はカナリア フェーズをスキップして安定フェーズを実行します。この理由については、初回にフェーズがスキップされるをご覧ください。

次のステップ