向 Cloud Run 进行 Canary 部署

本文档介绍了如何配置和使用 Canary 部署将应用部署到 Cloud Run。Cloud Deploy Canary 支持 Cloud Run 服务和工作器池,但不支持作业。

Canary 部署是指逐步发布应用的新版本,即逐渐增加发送到新版本的流量百分比,同时监控应用的性能。这有助于您及早发现潜在问题,并最大限度地减少对用户的影响。

Canary 部署在 Cloud Run 中的运作方式

当您使用 Canary 部署策略部署到 Cloud Run 时,Cloud Deploy 会使用新修订版本更新现有服务。新修订版本会收到指定百分比的流量,而旧修订版本会继续收到剩余的流量。随着时间的推移,您会逐渐增加拆分到新修订版本的流量。

借助 Cloud Deploy,您可以在单个阶段或多个阶段中将 Canary 部署配置到 Cloud Run。

此处的说明仅包含特定于 Canary 配置的内容。部署 Cloud Run 服务、作业或工作器池 文档包含用于配置和执行部署 流水线的一般说明。

确保您拥有所需的权限

除了使用 Cloud Deploy 所需的其他 Identity and Access Management 权限之外,您还需要以下权限才能执行 Canary 部署可能需要的其他操作:

  • 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 的 Canary 部署,请确保它正确指向您的服务定义文件并定义任何必要的 build 制品(例如容器映像)。除了 标准部署 所需的内容之外,skaffold.yaml 本身不需要任何特定于 Canary 的配置。您可以使用 Skaffold 配置文件来管理 自定义 Canary 阶段 的不同服务定义变体。

准备服务或工作器池定义

您的普通 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

配置自动化 Canary

直接在特定 Cloud Run 阶段的交付流水线定义中配置自动化 Canary。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 是一个逗号分隔列表,其中包含表示 Canary 增量的百分比值,例如 [25, 50, 75]。请注意,此列表不包含 100,因为在 Canary 中 假定 100% 的部署,并且由 stable 阶段处理。

  • 您可以通过配置 verify 节来启用部署验证。如果这样做,系统会将 verify 作业添加到每个 Canary 阶段。

  • 您可以通过配置 predeploy 节来启用预部署钩子。如果这样做,系统会将 predeploy 作业添加到第一个 Canary 阶段。

  • 您可以通过配置 postdeploy 节来启用 部署后钩子。如果这样做,系统会将 postdeploy 作业添加到 stable 阶段。

  • verifypredeploypostdeploy 下的每个 tasks 属性都包含 一个或多个要作为该作业的一部分运行的 任务。任何配置的任务都将按定义的顺序依次运行。

配置自定义自动化 Canary

这会将自定义阶段定义(名称、百分比、配置文件、验证、钩子)与 Cloud Deploy 的 Cloud Run 自动流量管理相结合。您定义阶段,但 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 Canary

  1. 注册流水线和目标:应用交付流水线和 Cloud Run 目标配置文件。

    
    gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION
    gcloud deploy apply --file=cloudrun-targets.yaml --region=REGION
    

    交付流水线包含所选运行时的自动化或自定义 Canary 配置。

  2. 创建版本:启动部署,并提供映像名称。

    
    gcloud deploy releases create RELEASE_NAME \
                                    --delivery-pipeline=PIPELINE_NAME \
                                    --region=REGION
    

    PIPELINE_NAME 标识的交付流水线包含本文档中介绍的自动化或自定义 Canary 配置。

  3. 推进 Canary:

    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. 点击推进发布版本

      发布版本会推进到下一阶段。

跳过的阶段

如果您部署 Canary,但您的应用尚未部署到该运行时,Cloud Deploy 会跳过 Canary 阶段并运行稳定阶段。如需了解发生这种情况的原因,请参阅首次跳过阶段

后续步骤