本文档介绍了如何配置和使用 Canary 部署,以使用 Cloud Deploy 和基于服务的网络将应用部署到 GKE 或 GKE Enterprise。
Canary 部署是指逐步发布应用的新版本,即在监控应用性能的同时,逐渐增加发送到新版本的流量百分比。这有助于您及早发现潜在问题,并尽可能减少对用户的影响。
在基于服务的网络中,金丝雀部署如何适用于 GKE 和 GKE Enterprise
您需要提供 Deployment 资源和 Service 资源的名称。
Cloud Deploy 会创建一个额外的 Deployment 资源,其名称为当前 Deployment 的名称加上
-canary
。
Secret 和 ConfigMap 也会复制并使用 -canary
重命名。
Cloud Deploy 会修改服务,以调整选择器来选择当前部署中的 Pod 和 Canary Pod。
Cloud Deploy 会根据pod 配置部分中所述的计算方式来计算要用于 Canary 的 pod 数量。此计算因您是启用还是停用 Pod 过量配置而异。
如果我们跳过到
stable
阶段,Cloud Deploy 会添加用于匹配 pod 的标签,以便在后续 Canary 运行中使用。Cloud Deploy 会创建一个 Deployment,其中包含特定阶段的 pod 百分比,并针对每个阶段进行更新。为此,系统会计算出 Pod 数量占原始 Pod 数量的百分比。这可能会导致流量分配不精确。如果您需要精确的流量拆分,可以使用 Gateway API 来实现。
在
stable
阶段,-canary
部署会缩减为零,并且原始部署会被新部署替换。在
stable
阶段之前,Cloud Deploy 不会修改原始 Deployment,除非您停用过度预配。
Cloud Deploy 会预配 pod,以尽可能接近所请求的金丝雀百分比。此值基于 Pod 的数量,而不是 Pod 的流量。如果您希望 Canary 版本基于流量,则需要使用 Gateway API。
对于基于 GKE 网络的 Canary,您可以启用或停用 Pod 过量配置。以下部分介绍了 Cloud Deploy 如何计算在每个 Canary 阶段为 Canary 部署配置的 Pod 数量。
启用超额预配的 Pod 预配
启用过度配置 (disablePodOverprovisioning: false
) 后,Cloud Deploy 可以根据运行现有部署的 pod 数量,创建足够多的额外 pod 来运行所需的 Canary 百分比。以下公式展示了在启用 pod 过度配置的情况下,Cloud Deploy 如何计算每个 Canary 阶段要为 Canary 部署配置的 pod 数量:
math.Ceil( percentage * ReplicaCountOfDeploymentOnCluster / (100-percentage))
根据此公式,当前副本数(在执行此 Canary 版本之前您已拥有的 pod 数量)会乘以相应阶段的 Canary 百分比,然后将结果除以(100 减去该百分比)。
例如,如果您已有 4 个 pod,并且您的 Canary 阶段为 50%,则 Canary pod 的数量为 4。(100-percentage
的结果用作百分比:100-50=50
,视为 .50
。)
Pod 过量配置是默认行为。
在停用超额预配的情况下预配 Pod
您可以停用过度预配 (disablePodOverprovisioning: true
),以确保 Cloud Deploy 不会增加您的副本数量。
以下公式展示了在停用 Pod 过度预配的情况下,Cloud Deploy 如何针对每个 Canary 版阶段计算 Canary 版部署的 Pod 预配:
math.Ceil( (ReplicaCountOfDeploymentOnCluster + ReplicaCountOfCanaryDeploymentOnCluster) * percentage)
在此公式中,只有在之前已经有 Canary 阶段时,才存在 ReplicaCountOfCanaryDeploymentOnCluster
。如果这是第一个 Canary 阶段,则没有 ReplicaCountOfCanaryDeploymentOnCluster
。
如果您从 4 个 pod 开始,则将该数量乘以 Canary 百分比(例如 50%,即 .5
),得到 2
。因此,原始部署现在缩减为 2 个,并为 Canary 部署创建了 2 个新 pod。如果您接下来要进行 75% 的 Canary 阶段,则需要 2
(原始部署)、+2
(第一个 Canary 阶段)和 *.75
,才能获得 3
个 Canary Pod 和 1
个运行原始部署的 Pod。
使用 Cloud Deploy,您可以在单个阶段或多个阶段中为 GKE 和 GKE Enterprise 配置 Canary 部署。
此处的说明仅包含特定于 Canary 版配置的内容。部署到 Google Kubernetes Engine 集群文档包含有关配置和执行部署流水线的一般说明。
确保您拥有所需的权限
除了使用 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
文件定义了 Kubernetes 清单的呈现和部署方式。对于向 GKE/GKE Enterprise 进行的 Canary 部署,请确保它正确指向您的清单,并定义任何必要的 build 制品。除了标准部署所需的配置之外,skaffold.yaml
本身不需要任何特殊的 Canary 版专用配置。您可以使用 Skaffold 配置文件来管理自定义 Canary 阶段的不同清单变体。
准备 Kubernetes 清单
您的 Kubernetes 清单必须同时包含 Deployment
资源和 Service
资源。Service
必须定义一个与 Deployment
管理的 pod 的标签匹配的 selector
。
Cloud Deploy 默认查找的标签是 app
,但可以在流水线中配置此标签。
配置自动化 Canary
使用标准 Kubernetes 服务网络,在特定 GKE 或 GKE Enterprise 阶段的交付流水线定义中直接配置自动化 Canary。
在流水线阶段中,添加 strategy
属性,如下所示:
serialPipeline:
stages:
- targetId: prod
profiles: []
strategy:
canary:
runtimeConfig:
kubernetes:
serviceNetworking:
service: "SERVICE_NAME"
deployment: "DEPLOYMENT_NAME"
podSelectorLabel: "LABEL"
canaryDeployment:
percentages: [PERCENTAGES]
verify: true|false
predeploy:
actions: "PREDEPLOY_ACTION"
postdeploy:
actions: "POSTDEPLOY_ACTION"
在此配置中...
SERVICE_NAME 是在清单中定义的 Kubernetes Service 的名称。
DEPLOYMENT_NAME 是您的 Kubernetes Deployment 的名称,在清单中定义。
LABEL 是 pod 选择器标签。此值必须与清单中定义的 Kubernetes 服务中的标签选择器一致。这是可选操作。默认值为
app
。PERCENTAGES 是以英文逗号分隔的百分比值列表,表示您的 Canary 增量,例如
[5, 25, 50]
。此外,这不包括
100
,因为在 Canary 版中假设部署百分比为 100%,并且由stable
阶段处理您可以启用部署验证 (
verify: true
)。如果启用,系统会在每个阶段启用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 配置文件,也可以使用同一配置文件,或者使用任意组合。每个配置都可以使用不同的 Kubernetes 清单。 您还可以为给定阶段使用多个配置文件。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 的 GKE 或 GKE Enterprise 自动流量管理功能相结合。您定义阶段,但 Cloud Deploy 会根据百分比和所选的 runtimeConfig
处理底层资源操作。
如需进行配置,请在 strategy.canary 块中同时包含带有 serviceNetworking
的 runtimeConfig
部分和 customCanaryDeployment
部分(用于定义 phaseConfigs)。Cloud Deploy 将使用指定的 Skaffold 配置文件进行渲染,但会根据 runtimeConfig
和阶段百分比自动调整流量。
serialPipeline:
stages:
- targetId: gke-prod
profiles: []
strategy:
canary:
# Include runtimeConfig for automatic traffic management
runtimeConfig:
kubernetes:
serviceNetworking:
service: "my-app"
deployment: "my-deployment"
# Include customCanaryDeployment for phase customization
customCanaryDeployment:
phaseConfigs:
- phaseId: "warmup"
percentage: 10
profiles: ["profile-a"] # Profile used for rendering this phase
verify: true
- phaseId: "scaling"
percentage: 50
profiles: ["profile-b"] # Different profile for this phase
verify: true
- phaseId: "stable"
percentage: 100
profiles: ["profile-b"] # Can reuse profiles
verify: true
执行 GKE 或 GKE Enterprise Canary
注册流水线和目标:应用交付流水线和 GKE 或 GKE Enterprise 目标配置文件。
gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION gcloud deploy apply --file=gke-targets.yaml --region=REGION
交付流水线包含所选运行时的自动化或自定义 Canary 配置。
创建版本:启动部署,并提供映像名称。
gcloud deploy releases create RELEASE_NAME \ --delivery-pipeline=PIPELINE_NAME \ --region=REGION # e.g., --images=my-cloudrun-service=gcr.io/my-project/my-app:v1.1 # Add --skaffold-file or --source if not using default Skaffold config discovery
由
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 部署策略。