本文档介绍了如何使用 Cloud Deploy 配置和使用 Canary 部署,以将应用部署到 Cloud Run(仅限服务,不包括作业)。
Canary 部署是指逐步发布应用的新版本,即在监控应用性能的同时,逐渐增加发送到新版本的流量百分比。这有助于您及早发现潜在问题,并尽可能减少对用户的影响。
Canary 部署在 Cloud Run 中的运作方式
使用 Canary 部署策略部署到 Cloud Run 时,Cloud Deploy 会使用新修订版本更新现有服务。新修订版本会接收指定百分比的流量,而旧修订版本会继续接收剩余的流量。随着时间的推移,您会逐渐增加流向新修订版本的流量拆分比例。
借助 Cloud Deploy,您可以在单个阶段或多个阶段中配置向 Cloud Run 进行的金丝雀部署。
此处的说明仅包含特定于 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
您可以手动配置 Canary,而不是完全依赖 Cloud Deploy 提供的自动化功能。借助自定义 Canary 版配置,您可以在交付流水线定义中指定以下内容:
发布阶段名称
在全自动 Canary 版本中,Cloud Deploy 会为您命名阶段(例如
canary-25
、canary-75
、stable
)。不过,借助自定义 Canary,您可以为每个阶段指定任意名称,只要该名称在相应 Canary 阶段的所有阶段中是唯一的,并且符合资源 ID 限制即可。但最终 (100%) 阶段名称必须为stable
。各阶段的目标百分比
分别指定每个阶段的百分比。
要用于阶段的 Skaffold 配置文件
您可以为每个阶段使用单独的 Skaffold 配置文件,也可以使用同一配置文件,或者使用任意组合。每个配置文件都可以使用不同的 Cloud Run 服务定义。您还可以为给定阶段使用多个配置文件。Cloud Deploy 将它们结合在一起。
相应阶段是否存在验证作业
请注意,如果您要启用验证,还需要配置
skaffold.yaml
以进行验证。阶段是否有部署前作业或部署后作业
如果您要启用部署前作业或部署后作业,则需要为这些作业配置
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
predeploy:
actions: "PREDEPLOY_ACTION"
postdeploy:
actions: "POSTDEPLOY_ACTION"
- …
- phaseId: "stable"
percentage: 100
profiles: [ "LAST_PROFILE_NAME" ]
verify: true|false
predeploy:
actions: "PREDEPLOY_ACTION"
postdeploy:
actions: "POSTDEPLOY_ACTION"
在此 YAML 中
PHASE1_NAME
是阶段的名称。每个阶段名称都必须是唯一的。
[ "PROFILE_NAME" ]
是用于阶段的配置文件的名称。您可以为每个阶段使用同一配置文件,也可以为每个阶段使用不同的配置文件,还可以进行任意组合。此外,您还可以指定多个个人资料。Cloud Deploy 会使用您指定的所有配置文件,以及整个阶段使用的配置文件或清单。
stable
最终阶段必须命名为
stable
。PERCENTAGE1
是第一阶段的部署百分比。每个阶段都必须具有唯一的百分比值,并且该值必须是整数百分比(例如,不能是
10.5
),并且阶段必须按升序排列。verify: true|false
告知 Cloud Deploy 是否为阶段添加验证作业。请注意,为了让每个阶段都使用验证,Skaffold 会使用为相应阶段的渲染和部署指定的同一配置文件进行验证。
PREDEPLOY_ACTION
与您在
skaffold.yaml
中用于定义要在部署之前运行的自定义操作的 ACTION_NAME 相同。POSTDEPLOY_ACTION
与您在
skaffold.yaml
中用于定义部署后要运行的自定义操作的 ACTION_NAME 相同。
最后一个阶段的百分比必须为 100
。阶段的执行顺序与您在此 customCanaryDeployment
stanza 中配置的顺序一致,但如果百分比值不是升序,则用于注册交付流水线的命令会因错误而失败。
请注意,自定义 Canary 的配置不包含 runtimeConfig
stanza。如果您添加了 runtimeConfig
,则会被视为自定义自动化 Canary。
配置自定义自动化 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
注册流水线和目标:应用交付流水线和 Cloud Run 目标配置文件。
gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION gcloud deploy apply --file=cloudrun-targets.yaml --region=REGION
交付流水线包含所选运行时的自动化或自定义 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
。这是必填项。如需详细了解
gcloud deploy rollouts advance
命令,请参阅 Google Cloud SDK 参考文档。Google Cloud 控制台
点击交付流水线列表中显示的流水线。
交付流水线详情页面显示交付流水线进展的图形表示。
在发布标签页的交付流水线详情下,点击相应发布的名称。
系统会显示相应发布的发布详情页面。
请注意,在此示例中,发布包含
canary-50
阶段和stable
阶段。您的分阶段发布可能包含更多阶段或不同的阶段。点击推进发布。
发布作业推进到下一阶段。
已跳过的阶段
如果您部署的是 Canary 版本,但您的应用尚未部署到该运行时,Cloud Deploy 会跳过 Canary 阶段,直接运行稳定版阶段。如需了解发生此问题的原因,请参阅首次跳过阶段。
后续步骤
不妨试试灰度部署快速入门。
了解如何管理 Canary 版推出的生命周期。
详细了解并行部署。
详细了解 Cloud Deploy 部署策略。
详细了解 Cloud Run。