向 Cloud Run 进行 Canary 部署

本文档介绍了如何使用 Cloud Deploy 配置和使用 Canary 部署,以将应用部署到 Cloud Run(仅限服务,不包括作业)。

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

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

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

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

此处的说明仅包含特定于 Canary 版配置的内容。部署 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 进行的金丝雀部署,请确保它正确指向您的服务定义文件,并定义任何必要的 build 工件(例如容器映像)。除了标准部署所需的配置之外,skaffold.yaml 本身不需要任何特殊的 Canary 版专用配置。您可以使用 Skaffold 配置文件来管理自定义 Canary 阶段的不同服务定义变体。

准备服务定义

正常的 Cloud Run 服务定义文件就足够了,但不需要 traffic stanza。Cloud Deploy 会为您管理上次成功修订版本与新修订版本之间的流量拆分。

示例 service.yaml(不含 traffic stanza):

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

配置自动化 Canary

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

  • 您可以启用部署验证 (verify: true)。如果启用,系统会向每个 Canary 阶段添加一个 verify 作业。

  • PREDEPLOY_ACTION

    与您在 skaffold.yaml 中用于定义要在部署之前运行的自定义操作的 ACTION_NAME 相同。

  • POSTDEPLOY_ACTION

    与您在 skaffold.yaml 中用于定义部署后要运行的自定义操作的 ACTION_NAME 相同。

配置自定义自动化 Canary

此功能将自定义阶段定义(名称、百分比、配置文件、验证、钩子)与 Cloud Deploy 的 Cloud Run 自动流量管理功能相结合。您定义阶段,但 Cloud Deploy 会根据百分比指示 Cloud Run 转移流量。

如需进行配置,请在 strategy.canary 块中同时包含 runtimeConfig.cloudRun.automaticTrafficControl: true 设置和 customCanaryDeployment 部分(用于定义 phaseConfigs)。Cloud Deploy 将使用指定的 Skaffold 配置文件来呈现服务定义(该定义仍不应包含 traffic stanza),但会根据阶段百分比自动管理流量。

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 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 阶段,直接运行稳定版阶段。如需了解发生此问题的原因,请参阅首次跳过阶段

后续步骤