本文档介绍了如何配置和使用 Canary 部署策略。
什么是 Canary 部署?
Canary 部署是将应用拆分为 在已部署的版本与新版本之间传递流量, 在全面发布之前面向一部分用户
支持的目标类型
Cloud Deploy 中的 Canary 部署支持所有目标类型, 包括:
- Google Kubernetes Engine
- Cloud Run(仅适用于服务,而非 jobs.)
- GKE Enterprise
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:
您需要提供 Deployment 资源和服务资源的名称。
Cloud Deploy 会创建一个额外的 Deployment 资源, 当前 Deployment 的名称加上
-canary
。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
。在
stable
阶段,-canary
Deployment 会缩减至 将原始 Deployment 替换为新的 DeploymentCloud 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:
除了 Deployment 和 Service 参考文档之外, HTTPRoute 资源,其中具有引用 Service 的
backendRefs
规则。Cloud Deploy 会创建一个新的 Deployment,其名称为 原始 Deployment 和
-canary
,以及包含原始 Deployment 的新 Service 服务名称加-canary
。此外,Secret、ConfigMap 和 Pod 横向自动扩缩器也会被 并将其重命名为
-canary
。对于每个 Canary 版阶段,Cloud Deploy 都会修改 HTTPRoute 更新原始 Deployment 的 Pod 和 Canary Deployment 的 Pod 数量。
因为在将更改传播到
HTTPRoute
时可能会有延迟 您可以 将routeUpdateWaitTime
属性加入 配置,因此系统会在完成更新后等待指定时间 传播。在
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
在此配置中...
Cloud Run
在流水线阶段,添加 strategy
属性,如下所示:
serialPipeline:
stages:
- targetId: prod
profiles: []
strategy:
canary:
runtimeConfig:
cloudRun:
automaticTrafficControl: true
canaryDeployment:
percentages: [PERCENTAGES]
verify: true|false
在此配置中...
配置自定义 Canary
您可以手动配置 Canary 版,而无需完全依赖 由 Cloud Deploy 提供的自动化功能使用自定义 Canary 配置,可以在交付流水线定义中指定以下内容:
发布阶段名称
在完全自动化的 Canary 中,Cloud Deploy 会为您命名阶段 (例如
canary-25
、canary-75
、stable
)。借助自定义 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 或任何 支持的实现方式。
设置 Gateway API 资源:
这些仅为示例。
在 Kubernetes 清单中,当您执行以下操作时提供给 Cloud Deploy : 创建版本时,添加以下内容:
HTTPRoute
引用您的网关资源的部署
服务
配置交付流水线以及将进行 Canary 部署的目标 更改为:
目标的配置与任何目标的配置相同。
交付流水线配置,在 包括一个
gatewayServiceMesh
节,用于引用您的 Kubernetes Gateway APIHTTPRoute
配置以及您的 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 部署,请执行以下操作:
注册已配置的交付流水线和目标。
gcloud deploy apply --file=PIPELINE
交付流水线包括自动或自定义 Canary 配置, 。
此命令假定您的目标在同一文件中定义了,或者具有 否则已被注册。如果没有,请务必注册您的目标 。
创建版本:
gcloud deploy releases create RELEASE_NAME \ --delivery-pipeline=PIPELINE_NAME \ --region=REGION
由
PIPELINE_NAME
标识的交付流水线 包含本文章中介绍的自动或自定义 Canary 配置, 文档。推进 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 控制台
点击交付流水线列表中显示的流水线。
“交付流水线详细信息”页面以图形方式显示了 交付流水线的进展情况
在发布标签页的交付流水线详情下,点击 发布的名称
系统会显示该发布的发布详情页面。
请注意,在此示例中,发布包含
canary-50
阶段和stable
阶段。您的发布可能有多个阶段 阶段。点击推进发布。
发布将推进到下一阶段。
跳过的阶段
如果您部署了 Canary 版,但您的应用尚未部署到该 Canary 版 但对于运行时,Cloud Deploy 会跳过 Canary 阶段,运行稳定版 阶段。请参阅首次跳过阶段 找出发生这种情况的原因
后续步骤
尝试 Canary 部署快速入门。
了解如何管理 Canary 版发布的生命周期。
详细了解并行部署。