このドキュメントでは、カナリア デプロイを構成して使用し、アプリケーションを 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.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
ワーカープール
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ジョブが追加されます。verify、predeploy、postdeployの各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 カナリアを実行する
パイプラインとターゲットを登録する: 配信パイプラインと 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 の詳細を確認する