使用 Canary 部署策略

本文档介绍了如何配置和使用 Canary 部署策略。

什么是 Canary 部署?

Canary 部署是将应用拆分为 在已部署的版本与新版本之间传递流量, 在全面发布之前面向一部分用户

支持的目标类型

Cloud Deploy 中的 Canary 部署支持所有目标类型, 包括:

Canary 版还支持 多目标

为什么要使用 Canary 部署策略?

Canary 部署可以让您有机会部分发布应用。在 这样,您就可以先确保新版应用可靠,然后再 则将其分发给所有用户。

如果您要部署到 GKE 或 GKE Enterprise 您需要将应用的新版本部署到 Pod 数量旧版本将继续运行,但会提供更多 新 Pod 的流量

如果要将应用部署到 Cloud Run 流量本身会根据 配置的百分比

Canary 类型

借助 Cloud Deploy,您可以配置以下类型的 Canary 部署:

  • 自动

    使用 自动化 Canary 版 你可以为 Cloud Deploy 配置一系列 表示渐进式部署的百分比。Cloud Deploy 代表您执行其他操作,以分配流量 百分比。

  • 自定义自动化

    对于自定义自动 Canary 版,您可以提供 以下:

    • 阶段名称
    • 百分比目标
    • 用于此阶段的 Skaffold 配置文件
    • 是否包含验证作业

    但您不需要提供流量平衡信息; Cloud Deploy 按照说明创建必要的资源 此处

  • 自定义

    借助自定义 Canary,您可以单独配置每个 Canary 阶段, 包括:

    • 阶段名称
    • 百分比目标
    • 用于此阶段的 Skaffold 配置文件
    • 是否包含验证作业

    此外,对于完全自定义的 Canary 版,您需要提供 流量平衡配置 此处

Canary 部署的阶段

当您为 Canary 部署创建版本时 每个 Canary 增量对应一个阶段,以及 100% 的最后一个 stable 阶段。

例如,如果您将 Canary 版配置为 25%、50% 和 75% 的增量, 将分为以下几个阶段:

  • canary-25
  • canary-50
  • canary-75
  • stable

如需详细了解发布阶段、作业和作业运行,请参阅 管理发布

在自动化或自定义自动化 Canary 期间会发生什么

为了支持您的 Canary 部署,Cloud Deploy 包含特殊的 呈现 Kubernetes 清单或 Cloud Run 服务配置:

GKE/企业版

这里展示了 Cloud Deploy 如何在 基于网络的 GKE 和 GKE Enterprise:

  1. 您需要提供 Deployment 资源和服务资源的名称。

  2. Cloud Deploy 会创建一个额外的 Deployment 资源, 当前 Deployment 的名称加上 -canary

  3. Cloud Deploy 修改 Service,以将选择器调整为 选择当前 Deployment 和 Canary Pod 中的 Pod。

    Cloud Deploy 会计算要用于 根据上述计算公式计算得出的 此处。该计算方式会因以下因素而异: 启用或停用 Pod 超额预配功能。

    如果我们跳至 stable 阶段 Cloud Deploy 会添加用于匹配 Pod 的标签,因此 它们可用于后续的 Canary 运行

    Cloud Deploy 会创建一个 Deployment,其中包含 在特定阶段的 Pod 百分比,针对每个阶段更新此百分比。这是 计算 Pod 数量占原始 Pod 的百分比 Pod 数量这可能会导致流量分配不精确。如果您需要 确切的流量分配比例,您可以使用 Gateway API 来实现。

    此外,系统还会复制 Secret 和 ConfigMap,并将其重命名为 -canary

  4. stable 阶段,-canary Deployment 会缩减至 将原始 Deployment 替换为新的 Deployment

    Cloud Deploy 不会修改原始 Deployment,直到 stable 阶段。

Cloud Deploy 预配 Pod 以实现请求的 Canary 尽可能接近这个百分比该数据基于 Pod 数量,而非 Pod 的流量如果您希望基于流量运行 Canary 版, 需要使用 Gateway API

对于 GKE 网络的 Canary 版 启用或停用 Pod 超额预配。 以下部分介绍 Cloud Deploy 如何计算 要为 Canary 部署为每个 Canary 阶段预配的 Pod 的数量。

启用了超量预配的 Pod 预配

启用超量预配 (disablePodOverprovisioning: false) 让 Cloud Deploy 能够创建足够的额外 Pod 来运行 获得所需的 Canary 百分比 现有部署以下公式展示了 Cloud Deploy 会计算要为 Pod 预配的 Pod 数量 Canary 部署(当 Pod 超额预配时) 已启用:

math.Ceil( percentage * ReplicaCountOfDeploymentOnCluster / (100-percentage))

使用此公式,当前副本数(您已 )乘以 阶段,并将其结果除以(100 减去百分比)。

例如,如果您有 4 个 Pod,您的 Canary 版阶段为 50%,那么 Canary 版 Pod 的数量为 4。(100-percentage 的结果用作 百分比:100-50=50,视为 .50。)

Pod 超额预配是默认行为。

停用了超量预配的 Pod 预配

您可以停用超额预配 (disablePodOverprovisioning: true), 以确保 Cloud Deploy 不会增加副本数。

以下公式展示了 Cloud Deploy 如何计算 Pod 为 Canary 部署预配 Pod 时 超额预配已停用:

math.Ceil( (ReplicaCountOfDeploymentOnCluster + ReplicaCountOfCanaryDeploymentOnCluster) * percentage)

在此公式中,仅当出现以下情况时,ReplicaCountOfCanaryDeploymentOnCluster 才会存在: 已经有一个 Canary 阶段如果这是第一个 Canary 阶段 不是ReplicaCountOfCanaryDeploymentOnCluster

如果从 4 个 Pod 开始,该数字将乘以 Canary 百分比 (例如 50% 或 .5),以获取 2。原始部署现在变成了 缩减为 2 个 Pod,并且为 Canary 部署创建了 2 个新 Pod。如果 然后有 75% Canary 阶段,即有 2(原始部署)+2 (第一个 Canary 阶段)、*.75,以获取 3 个 Canary Pod 和 1 个运行 原始部署

网关 GKE/企业版

这里展示了 Cloud Deploy 如何在 使用 Gateway API 的 GKE 和 GKE Enterprise:

  1. 除了 Deployment 和 Service 参考文档之外, HTTPRoute 资源,其中具有引用 Service 的 backendRefs 规则。

  2. Cloud Deploy 会创建一个新的 Deployment,其名称为 原始 Deployment 和 -canary,以及包含原始 Deployment 的新 Service 服务名称加 -canary

    此外,Secret、ConfigMap 和 Pod 横向自动扩缩器也会被 并将其重命名为 -canary

  3. 对于每个 Canary 版阶段,Cloud Deploy 都会修改 HTTPRoute 更新原始 Deployment 的 Pod 和 Canary Deployment 的 Pod 数量。

    因为在将更改传播到 HTTPRoute 时可能会有延迟 您可以 routeUpdateWaitTime属性加入 配置,因此系统会在完成更新后等待指定时间 传播。

  4. stable 阶段,-canary Deployment 会缩减至 并且原始 Deployment 会更新为使用新版本的 部署。

    此外,HTTPRoute 现在已还原为您提供的原始状态。

    Cloud Deploy 不会修改原始 Deployment 或 服务直到 stable 阶段。

Cloud Run

Cloud Deploy 按照以下方式执行 Canary 部署: Cloud Run:

  • 对于到 Cloud Run 的 Canary 部署,请不要提供 您的服务 YAML 中的 traffic

  • 为 Canary 创建新发布时,Cloud Deploy 会拆分 已成功部署的先前修订版本之间的流量 Cloud Deploy 和新修订版本。

如果您想要了解 Canary 部署的各个阶段之间的差异, 您可以在 版本检查器。您甚至可以在 已开始部署此外,如果您使用的是 并行部署,还可以检查每个子级的 呈现的清单。

配置 Canary 部署

本部分介绍如何为 Cloud Storage 存储分区配置交付流水线和目标, Canary 部署

此处的说明仅包含特定于 Canary 配置的内容。通过 部署您的应用一文中介绍了 有关如何配置和执行部署流水线的一般说明。

确保您拥有所需的权限

除了使用服务账号所需的其他 Identity and Access Management 权限外 Cloud Deploy,您需要以下权限才能 执行 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

与标准部署一样,您的 Canary 版需要 skaffold.yaml 文件, 定义了清单和服务定义如何呈现和部署。

您为 Canary 部署创建的 skaffold.yaml 没有任何特殊 标准以外的要求 部署。

准备清单或服务定义

与标准部署一样,Canary 版需要 Kubernetes 清单或 Cloud Run 服务定义。

GKE 和 GKE Enterprise

对于 Canary,您的清单必须包含以下内容:

  • Deployment 和 Service。

  • Service 必须定义一个 app 选择器,并且必须选择 已指定部署。

  • 如果您使用的是基于 Gateway API 的 Canary,则清单还必须包含 HTTPRoute

Cloud Run

对于 Cloud Run 上的 Canary 版 使用 Cloud Run 服务定义文件就足够了 没有 traffic 节。Cloud Deploy 管理拆分 上次成功的修订版本与新修订版本之间传输的流量。

配置自动化 Canary

以下说明适用于 Cloud Run 和 基于 GKE 和 GKE Enterprise 服务的网络 目标。如果您要将 Kubernetes Gateway API 与 GKE 或 GKE Enterprise,请参阅此文档

您可以在交付流水线定义中配置自动化 Canary:

GKE 和 GKE Enterprise

在流水线阶段,添加 strategy 属性,如下所示:

serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          kubernetes:
            serviceNetworking:
              service: "SERVICE_NAME"
              deployment: "DEPLOYMENT_NAME"
        canaryDeployment:
          percentages: [PERCENTAGES]
          verify: true|false

在此配置中...

  • SERVICE_NAME 是 Kubernetes Service 的名称。 定义的所有资源

  • DEPLOYMENT_NAME 是 Kubernetes 的名称 Deployment,在清单中定义。

  • PERCENTAGES 是以英文逗号分隔的百分比列表 表示 Canary 增量的值,例如 [5, 25, 50]

    此外,这不包括 100,因为 100% 部署 假设在 Canary 中,并由 stable 阶段

  • 您可以启用部署验证 (verify: true).如果您这样做,系统会在每个阶段启用 verify 作业。

Cloud Run

在流水线阶段,添加 strategy 属性,如下所示:

serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          cloudRun:
            automaticTrafficControl: true
        canaryDeployment:
          percentages: [PERCENTAGES]
          verify: true|false

在此配置中...

  • PERCENTAGES 是以英文逗号分隔的百分比列表 表示 Canary 增量的值,例如 [25, 50, 75]。注意事项 这不包括 100,因为 100% 部署 假设在 Canary 中,并由 stable 阶段
  • 您可以启用部署验证 (verify: true).如果这样做,则系统会为每个容器添加一个 verify 作业。 Canary 阶段。

配置自定义 Canary

您可以手动配置 Canary 版,而无需完全依赖 由 Cloud Deploy 提供的自动化功能使用自定义 Canary 配置,可以在交付流水线定义中指定以下内容:

  • 发布阶段名称

    在完全自动化的 Canary 中,Cloud Deploy 会为您命名阶段 (例如 canary-25canary-75stable)。借助自定义 Canary 策略 但您可以给每个阶段指定任意名称,只要该名称在所有 此 Canary 阶段的几个阶段 资源名称限制。但最后一个 (100%) 阶段名称必须为 stable

  • 每个阶段的目标百分比

    请为每个阶段单独指定百分比。

  • 用于此阶段的 Skaffold 配置文件

    您可以为每个阶段使用单独的 Skaffold 配置文件,也可以使用相同的配置文件 或任意组合。每个配置文件可以使用不同的 Kubernetes 清单 或 Cloud Run 服务定义您还可以使用 一个配置文件。Cloud Deploy 将它们组合在一起。

  • 此阶段是否有验证作业

    请注意,如果您要启用验证功能 配置您的skaffold.yaml 验证。

所有目标类型 支持自定义 Canary

自定义 Canary 配置元素

以下 YAML 显示了完全自定义 Canary 的各个阶段的配置 部署:

strategy:
  canary:
    # Custom configuration for each canary phase
    ​customCanaryDeployment:
      phaseConfigs:
      - phaseId: "PHASE1_NAME"
        percentage: PERCENTAGE1
        profiles: [ "PROFILE_NAME" ]
        verify: true | false
      - …
      - phaseId: "stable"
        percentage: 100
        profiles: [ "LAST_PROFILE_NAME" ]
        verify: true|false

在此 YAML 中,

  • PHASE1_NAME

    是阶段的名称。每个阶段名称都必须是唯一的。

  • [ "PROFILE_NAME" ]

    是阶段要使用的配置文件的名称。您可以使用同一付款资料 也可以为每个阶段使用不同的代码此外,您还可以 指定多个配置文件。Cloud Deploy 使用 以及 阶段。

  • PERCENTAGE1

    为第一阶段部署的百分比。每个阶段必须具有唯一的 百分比值,并且该值必须是整数(对于 10.5, 示例),且阶段必须按升序排列。

  • verify: true|false

    告知 Cloud Deploy 是否为该阶段添加验证作业。 请注意,对于要使用 Verify 的每个阶段,Skaffold 会使用相同的配置文件 验证已为该阶段的渲染和部署指定 。

  • stable

    最终阶段必须命名为 stable

最后一个阶段的百分比必须为 100。阶段根据 它们的顺序与您在此 ​customCanaryDeployment 节中配置它们的顺序相同,但如果 百分比值并非按升序排列,则 注册交付流水线 失败并显示错误。

请注意,自定义 Canary 的配置不包含 runtimeConfig 节。如果包含 runtimeConfig,则将被视为 自定义自动化 Canary

配置自定义自动化 Canary

自定义自动化 Canary 与自定义 Canary 类似 因为您指定了单独的 Canary 阶段 以及自定义阶段名称 百分比值、Skaffold 配置文件和验证作业。但使用自定义 Canary 策略时 您不提供配置 (定义流量分配)Cloud Deploy 会执行 但您仍然需要提供 Skaffold 配置文件 每个阶段使用的值

如需配置自定义自动 Canary,请添加一个 runtimeConfig 节,如 此处所示, 并添加 customCanaryDeployment 节,如下所示: 此处

使用 Kubernetes Gateway API 服务网格配置 Canary 部署

虽然您可以使用 Cloud Deploy Canary 部署 将您的应用部署到基于 Kubernetes 服务的网络中, 另一种方法是使用 Kubernetes Gateway API 服务网格。 本部分介绍了如何执行此操作。

您可以将 Gateway API 与 Istio 或任何 支持的实现方式

  1. 设置 Gateway API 资源:

    这些仅为示例。

  2. 在 Kubernetes 清单中,当您执行以下操作时提供给 Cloud Deploy : 创建版本时,添加以下内容:

    • HTTPRoute 引用您的网关资源的

    • 部署

    • 服务

  3. 配置交付流水线以及将进行 Canary 部署的目标 更改为:

    • 目标的配置与任何目标的配置相同。

    • 交付流水线配置,在 包括一个 gatewayServiceMesh 节,用于引用您的 Kubernetes Gateway API HTTPRoute 配置以及您的 Deployment 和 Service。

      strategy:
       canary:
         runtimeConfig:
           kubernetes:
             gatewayServiceMesh:
               httpRoute: "ROUTE"
               service: "SERVICE"
               deployment: "DEPLOYMENT"
               routeUpdateWaitTime: "WAIT_TIME"
         canaryDeployment:
           percentages:
           - 50
      

      其中...

      • ROUTE 是您的 httpRoute 配置,用于定义路由 行为

      • SERVICE 是您的 Service 配置, Canary 部署需要 GKE 和 GKE Enterprise

      • DEPLOYMENT 是您的 Deployment 配置, Canary 部署需要 GKE 和 GKE Enterprise

      • WAIT_TIME 是 Cloud Deploy 部署到 等待对 HTTPRoute 资源的更改完成传播, 避免丢弃请求例如:routeUpdateWaitTime: 60s

        如果您使用没有 Istio 的 Gateway API 以及 Gateway API 连接到 Google Cloud 负载均衡器后, Canary 实例缩容时流量可能会丢失。您可以 如果您观察到此行为,请配置此设置。

将并行部署与 Canary 部署策略搭配使用

您可以使用并行部署来运行 Canary 部署。 这意味着要逐步部署到的目标可以包含两个或更多个目标 子目标。例如,您可以逐步部署到 多个区域。

并行 Canary 版与单目标 Canary 版有何不同

  • 与单目标 Canary 部署一样 您需要一个 Kubernetes Deployment 配置 在清单中添加 Kubernetes Service 配置

  • 与单目标 Canary 部署一样,您的交付流水线配置 必须在以下对象的阶段定义内包含一个 strategy.canary 节 适用阶段。

  • 此外,您还需要 配置多目标 您需要 配置子级目标 多目标引用的标识符

  • 当您创建版本时,系统会进行控制器发布 以及子发布

    这两种发布类型(控制器发布和子级发布)具有不同的阶段 stable 阶段,用于测试所有已配置的 Canary 百分比, Canary 100%。

  • 您无法继续 子发布

    您只能推进控制器发布。推进控制器时 子发布也会提前 Cloud Deploy。

  • 您无法重试 失败的作业数。

    您只能在子发布中重试作业。

  • 你不能忽略 失败的作业数。

    您可以仅忽略子发布中失败的作业。

  • 您可以取消控制器发布、 但无法取消子发布。

  • 您可以 终止作业运行 在子发布(而非控制器发布)下执行。

如果 Canary 中的并行发布失败,该怎么办

当子发布失败时,控制器发布可以转换为不同的 状态,具体取决于子发布的情况:

  • 一个或多个子发布失败,但至少有一个子发布仍处于 IN_PROGRESS 时,控制器发布保持 IN_PROGRESS

  • 如果一个或多个子发布失败,但至少有一个子发布成功, 如果当前阶段之后还有更多阶段,则控制器发布为 HALTED 一个。

    如果这是 stable 阶段,则控制器发布为 FAILED

    HALTED为您提供了 ignore重试 失败的子发布中失败的作业,或者 取消控制器发布 并防止对子级发布采取进一步操作。

  • 如果由于子项失败而导致控制器发布处于 HALTED 状态 并且忽略了子发布中失败的作业,即控制器 发布还原为 IN_PROGRESS 状态。

执行配置的 Canary

如需运行 Canary 部署,请执行以下操作:

  1. 注册已配置的交付流水线和目标。

    gcloud deploy apply --file=PIPELINE
    

    交付流水线包括自动或自定义 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。这是必填项。

    请参阅 Google Cloud SDK 参考文档,详细了解 gcloud deploy rollouts advance 命令

    Google Cloud 控制台

    1. 打开“交付流水线”页面

    2. 点击交付流水线列表中显示的流水线。

      “交付流水线详细信息”页面以图形方式显示了 交付流水线的进展情况

    3. 发布标签页的交付流水线详情下,点击 发布的名称

      系统会显示该发布的发布详情页面。

      Google Cloud 控制台中的发布详情

      请注意,在此示例中,发布包含 canary-50 阶段和 stable 阶段。您的发布可能有多个阶段 阶段。

    4. 点击推进发布

      发布将推进到下一阶段。

跳过的阶段

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

后续步骤