使用 Canary 部署策略

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

什么是 Canary 部署?

Canary 部署是一种渐进式应用发布方式,它会在已部署的版本和新版本之间拆分流量,先向部分用户发布,然后再全面发布。

支持的目标类型

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

Canary 也适用于多目标

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

Canary 部署让您有机会部分发布应用。这样,您就可以在向所有用户交付新版应用之前,确保其可靠性。

如果您要部署到 GKE 或 GKE Enterprise,例如,您会将新版应用部署到数量有限的 Pod。旧版本会继续运行,但会有更多流量发送到新 Pod。

如果您要部署到 Cloud Run,Cloud Run 本身会根据您配置的百分比在旧修订版本和新修订版本之间拆分流量。

Canary 的类型

Cloud Deploy 可让您配置以下类型的 Canary 部署:

  • 自动

    借助自动 Canary 部署(适用于服务联网Gateway APICloud Run),您可以为 Cloud Deploy 配置一系列百分比,以表示渐进式部署。Cloud Deploy 会代表您执行其他操作,以在旧版本和新版本之间分配流量百分比。

  • 自定义自动化

    对于自定义自动化 Canary 版(适用于服务联网Gateway APICloud Run),您可以提供以下信息:

    • 阶段名称
    • 百分比目标
    • 要用于阶段的 Skaffold 配置文件
    • 是否包含验证作业
    • 是否包含预部署作业、后部署作业或两者都包含

    不过,您无需提供流量平衡信息;Cloud Deploy 会创建必要的资源(用于服务联网网关 APICloud Run)。

  • 自定义

    对于自定义 Canary 版本(适用于服务联网Gateway APICloud Run),您可以单独配置每个 Canary 阶段,包括以下内容:

    • 阶段名称
    • 百分比目标
    • 要用于阶段的 Skaffold 配置文件
    • 是否包含验证作业
    • 是否包含预部署作业、后部署作业或两者都包含

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

Canary 部署的阶段

为 Canary 部署创建发布时,系统会为每个 Canary 增量创建一个发布阶段,并为 100% 创建一个最终的 stable 阶段。

例如,如果您将 Canary 版配置为以 25%、50% 和 75% 的增量进行发布,则发布将包含以下阶段:

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

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

使用并行部署和 Canary 部署策略

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

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

  • 与单目标 Canary 部署一样,如果您要部署到 GKE 目标,则需要在清单中包含 Kubernetes Deployment 配置和 Kubernetes Service 配置。

  • 与单目标 Canary 部署一样,您的交付流水线配置必须在适用阶段的阶段定义中包含 strategy.canary stanza。

  • 此外,您还需要配置多目标,并配置该多目标所引用的子目标

  • 创建发布版本时,系统会创建控制器发布子发布

    控制器和子级这两种类型的发布都有单独的阶段,用于所有已配置的金丝雀百分比,并且有一个 stable 阶段用于金丝雀 100%。

  • 您无法推进子发布。

    您只能推进控制器发布。当您将控制器发布推进到下一阶段时,Cloud Deploy 也会推进子发布。

  • 您无法在控制器发布过程中重试失败的作业。

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

  • 您无法忽略控制器发布中失败的作业。

    您只能忽略子发布中失败的作业。

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

  • 您只能终止子发布下的作业运行,而不能终止控制器发布下的作业运行。

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

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

  • 如果一项或多项子发布失败,但至少有一项子发布仍处于 IN_PROGRESS 状态,则控制器发布仍处于 IN_PROGRESS 状态。

  • 如果一项或多项子发布失败,但至少有一项子发布成功,则如果当前阶段之后还有其他阶段,控制器发布将处于 HALTED 状态。

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

    HALTED 让您有机会忽略重试失败的子发布中的失败作业,或取消控制器发布并阻止对子发布执行进一步操作。

  • 如果控制器发布因子发布失败而处于 HALTED 状态,并且您忽略了子发布中的失败作业,则控制器发布会恢复为 IN_PROGRESS 状态。

后续步骤