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

次のステップ