このドキュメントでは、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.advanceclouddeploy.rollouts.ignoreJobclouddeploy.rollouts.cancelclouddeploy.rollouts.retryJobclouddeploy.jobRuns.getclouddeploy.jobRuns.listclouddeploy.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 カナリアを実行する
パイプラインとターゲットを登録する: デリバリー パイプラインと Cloud Run ターゲット構成ファイルを適用します。
gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION gcloud deploy apply --file=cloudrun-targets.yaml --region=REGION配信パイプラインには、選択したランタイムの自動またはカスタムのカナリア構成が含まれます。
リリースを作成する: イメージ名を指定してデプロイを開始します。
gcloud deploy releases create RELEASE_NAME \ --delivery-pipeline=PIPELINE_NAME \ --region=REGIONPIPELINE_NAMEで識別されるデリバリー パイプラインには、このドキュメントで説明する自動カナリア構成またはカスタム カナリア構成が含まれています。カナリアを進める:
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 コンソール
デリバリー パイプラインのリストに表示されているパイプラインをクリックします。
デリバリー パイプラインの詳細ページには、デリバリー パイプラインの進行状況がグラフィカルに表示されます。
[ロールアウト] タブの [デリバリー パイプラインの詳細] で、ロールアウトの名前をクリックします。
そのロールアウトのロールアウトの詳細ページが表示されます。

この例では、ロールアウトに
canary-50フェーズとstableフェーズがあります。ロールアウトには、より多くのフェーズや異なるフェーズが含まれる場合があります。[ロールアウトを進める] をクリックします。
ロールアウトを次のフェーズに進めます。
スキップされるフェーズ
カナリアをデプロイするときに、アプリケーションがそのランタイムにデプロイされていない場合、Cloud Deploy はカナリア フェーズをスキップして安定フェーズを実行します。この理由については、初回にフェーズがスキップされるをご覧ください。
次のステップ
カナリアのロールアウトのライフサイクルを管理する方法を確認する。
詳しくは、並列デプロイをご覧ください。
Cloud Deploy のデプロイ戦略の詳細を確認する。
Cloud Run の詳細を確認する