使用基于服务的网络将 Canary 部署到 GKE 和 GKE Enterprise

本文档介绍了如何配置和使用 Canary 部署,以使用 Cloud Deploy 和基于服务的网络将应用部署到 GKE 或 GKE Enterprise。

Canary 部署是指逐步发布应用的新版本,即在监控应用性能的同时,逐渐增加发送到新版本的流量百分比。这有助于您及早发现潜在问题,并尽可能减少对用户的影响。

在基于服务的网络中,GKE 和 GKE Enterprise 的 Canary 部署如何运作

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

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

Secret 和 ConfigMap 也会复制并使用 -canary 重命名。

  1. Cloud Deploy 会修改服务,以调整选择器来选择当前部署中的 Pod 和 Canary Pod。

    Cloud Deploy 会根据pod 配置部分中所述的计算方式来计算要用于 Canary 的 pod 数量。此计算因您是启用还是停用 Pod 过量配置而异。

    如果我们跳过到 stable 阶段,Cloud Deploy 会添加用于匹配 pod 的标签,以便在后续 Canary 运行中使用。

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

  2. 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 版配置的内容。部署到 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

此功能将自定义阶段定义(名称、百分比、配置文件、验证、钩子)与 Cloud Deploy 的 GKE 或 GKE Enterprise 自动流量管理功能相结合。您定义阶段,但 Cloud Deploy 会根据百分比和所选的 runtimeConfig 处理底层资源操作。

如需进行配置,请在 strategy.canary 块中同时包含带有 serviceNetworkingruntimeConfig 部分和 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

  1. 注册流水线和目标:应用交付流水线和 GKE 或 GKE Enterprise 目标配置文件。

    
    gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION
    gcloud deploy apply --file=gke-targets.yaml --region=REGION
    

    交付流水线包含所选运行时的自动化或自定义 Canary 配置。

  2. 创建版本:启动部署,并提供映像名称。

    
    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 配置。

  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。这是必填项。

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

    Google Cloud 控制台

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

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

      交付流水线详情页面显示交付流水线进展的图形表示。

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

      系统会显示相应发布版本的发布详情页面。

       Google Cloud 控制台中的发布详情

      请注意,在此示例中,发布包含 canary-50 阶段和 stable 阶段。您的分阶段发布可能包含更多阶段或不同的阶段。

    4. 点击推进发布

      发布作业推进到下一阶段。

已跳过的阶段

如果您部署的是 Canary 版本,但您的应用尚未部署到该运行时,Cloud Deploy 会跳过 Canary 阶段,直接运行稳定版阶段。如需了解发生此问题的原因,请参阅首次跳过阶段

后续步骤