このドキュメントでは、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-25
、canary-75
、stable
など)。ただし、カスタム カナリアでは、このカナリア ステージのすべてのフェーズで一意であり、リソース 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 カナリアを実行する
パイプラインとターゲットを登録する: デリバリー パイプラインと 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=REGION
PIPELINE_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 の詳細を確認する