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

このドキュメントでは、カナリア デプロイを構成して使用し、アプリケーションを 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

ワーカープール

worker-pool.yaml の例(instanceSplit スタンザなし):

 apiVersion: run.googleapis.com/v1
 kind: WorkerPool
 metadata:
   name: my-wp
   annotations:
     run.googleapis.com/launch-stage: BETA
 spec:
   template:
     spec:
       containers:
       - image: us-docker.pkg.dev/cloudrun/container/worker-pool

自動カナリアを構成する

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

serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          cloudRun:
            automaticTrafficControl: true
        canaryDeployment:
          percentages: [PERCENTAGES]
          verify:
            tasks: [TASKS]
          predeploy:
            tasks: [TASKS]
          postdeploy:
            tasks: [TASKS]

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

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

  • verify スタンザを構成することで、デプロイの検証を有効にできます。有効にすると、各カナリア フェーズに verify ジョブが追加されます。

  • predeploy スタンザを構成することで、事前デプロイフックを有効にできます。有効にすると、最初のカナリア フェーズに predeploy ジョブが追加されます。

  • postdeploy スタンザを構成することで、デプロイ後のフックを有効にできます。有効にすると、stable フェーズに postdeploy ジョブが追加されます。

  • verifypredeploypostdeploy の各 tasks プロパティは、そのジョブの一部として実行する 1 つ以上のタスクで構成されます。構成されたタスクは、定義された順序で順番に実行されます。

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

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

これを構成するには、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:
              tasks: [TASKS]
          - phaseId: "scaling-cr"
            percentage: 50
            profiles: ["base-config"] # Can use the same profile
            verify:
              tasks: [TASKS]
          - phaseId: "stable"
            percentage: 100
            profiles: ["base-config"]
            verify:
              tasks: [TASKS]

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 はカナリア フェーズをスキップして安定フェーズを実行します。この理由については、初回にフェーズをスキップするをご覧ください。

次のステップ