将应用 Canary 部署到目标

本快速入门介绍如何使用 Cloud Deploy 将 Canary 部署中的示例应用映像传送到 Google Kubernetes Engine 或 Cloud Run。 (您也可以运行到 GKE Enterprise 的 Canary 部署,但本快速入门中仅显示 GKE 和 Cloud Run。)

Canary 部署在已部署的应用版本和新版本之间拆分流量。Cloud Run 会根据您在交付流水线中配置的百分比来分配流量。GKE 将新版本部署至一定比例的 Pod。本快速入门会先部署到 50%,然后再部署到 100%。

在本快速入门中,只有一个目标 (prod)。因此,我们仅创建一个 GKE 集群或一个 Cloud Run 服务来运行您的应用。

在本快速入门中,您将执行以下操作:

  1. 创建一个 GKE 集群或定义一个 Cloud Run 服务。

    您也可以将 Canary 部署到 GKE Enterprise 集群,但本快速入门仅使用 GKE 和 Cloud Run。

  2. 创建 Skaffold 配置和 Kubernetes 清单,以指定要部署的(预构建)容器映像。

  3. 定义 Cloud Deploy 交付流水线和部署目标

  4. 通过创建自动部署到一个目标的版本来调用交付流水线。

    第一个版本跳过了 Canary 阶段

  5. 在 Google Cloud 控制台中查看交付流水线和版本。

  6. 创建第二个版本,这次执行 Canary 阶段,将应用部署到 50%。

  7. 将版本推进到 100% 部署。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage API。

    启用 API

  5. 安装 Google Cloud CLI。
  6. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  7. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  8. 确保您的 Google Cloud 项目已启用结算功能

  9. 启用 Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage API。

    启用 API

  10. 安装 Google Cloud CLI。
  11. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  12. 如果您已安装 CLI,请确保您运行的是最新版本:

    gcloud components update
    

  13. 确保默认 Compute Engine 服务帐号具有足够的权限。

    服务账号可能已经拥有必要的权限。这些步骤适用于停用为默认服务帐号自动授予角色的项目。

    1. 首先添加 clouddeploy.jobRunner 角色:

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/clouddeploy.jobRunner"
      

    2. 为特定运行时添加开发者角色。
      • 对于 GKE 以及 GKE 与 Gateway API:

        gcloud projects add-iam-policy-binding PROJECT_ID \
            --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
            --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
            --role="roles/container.developer"
        

      • 对于 Cloud Run:

        gcloud projects add-iam-policy-binding PROJECT_ID \
            --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
            --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
            --role="roles/run.developer"
        

    3. 添加 iam.serviceAccountUser 角色,该角色包含部署到运行时的 actAs 权限:

      gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/iam.serviceAccountUser" \
          --project=PROJECT_ID
      

创建运行时环境

GKE

创建一个 GKE Autopilot 集群:

 gcloud container clusters create-auto canary-quickstart-cluster \
                  --project=PROJECT_ID \
                  --region=us-central1

GKE + Gateway API

  1. 创建一个 GKE 集群,并为其采用支持与 Istio 搭配使用的推荐设置:

    gcloud container clusters create canary-quickstart-cluster \
           --machine-type=n1-standard-1 \
           --num-nodes 4 \
           --region=us-central1 \
           --project=PROJECT_ID
    
  2. 获取集群凭据:

    gcloud container clusters get-credentials canary-quickstart-cluster \
           --project=PROJECT_ID \
           --region=us-central1
    
  3. 如果集群中尚不存在 Kubernetes Gateway API CRD,请进行安装。

    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.6.2/standard-install.yaml
    
  4. 通过安装 Istio 启用 Istio 的网关控制器实现。

    curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.17.2 sh - \
    && ./istio-1.17.2/bin/istioctl install --set profile=minimal -y
    

Cloud Run

如果您使用的是 Cloud Run,则可以跳过此命令,此时无需执行任何操作。

准备 Skaffold 配置和应用清单

Cloud Deploy 使用 Skaffold 提供有关要部署的内容以及如何将其正确部署到目标的详细信息。

在本快速入门中,您将创建一个 skaffold.yaml 文件,用于标识要部署的 Kubernetes 清单或 Cloud Run 服务配置。

  1. 打开一个终端窗口。

  2. 创建一个新目录并导航到该目录。

    GKE

    mkdir deploy-canary-quickstart-gke
    cd deploy-canary-quickstart-gke
    

    GKE + Gateway API

    mkdir deploy-canary-quickstart-gke-gatewayapi
    cd deploy-canary-quickstart-gke-gatewayapi
    

    Cloud Run

    mkdir deploy-canary-quickstart-run
    cd deploy-canary-quickstart-run
    
  3. 创建名为 skaffold.yaml 且包含以下内容的文件:

    GKE

    apiVersion: skaffold/v4beta7
    kind: Config
    manifests:
      rawYaml:
      - kubernetes.yaml
    deploy:
      kubectl: {}
    

    GKE + Gateway API

    apiVersion: skaffold/v4beta7
    kind: Config
    manifests:
      rawYaml:
      - kubernetes.yaml
    deploy:
      kubectl: {}
    

    Cloud Run

    apiVersion: skaffold/v4beta7
    kind: Config
    manifests:
      rawYaml:
      - run.yaml
    deploy:
      cloudrun: {}
    

    此文件是最低的 Skaffold 配置,用于标识您的清单。在本快速入门中,您需要创建该文件。但是,您也可以让 Cloud Deploy 为简单的非生产应用创建一个帐号

    如需详细了解此文件,请参阅 skaffold.yaml 参考文档

  4. 创建应用清单。

    GKE

    deploy-canary-quickstart-gke 目录中创建一个名为 kubernetes.yaml 的文件,其中包含以下内容:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-app
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: nginx
            image: my-app-image
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
      namespace: default
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
    

    此文件是一个简单的 Kubernetes 清单,会应用于集群以部署应用。

    GKE + Gateway API

    deploy-canary-quickstart-gke-gatewayapi 目录中创建一个名为 kubernetes.yaml 的文件,其中包含以下内容:

    kind: Gateway
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: my-gateway
      annotations:
        networking.istio.io/service-type: "ClusterIP"
    spec:
      gatewayClassName: istio
      listeners:
      - name: default
        hostname: "*.example.com"
        port: 80
        protocol: HTTP
        allowedRoutes:
          namespaces:
            from: All
    ---
    kind: HTTPRoute
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: my-httproute
    spec:
      parentRefs:
      - kind: Gateway
        name: my-gateway
      hostnames:
      - "test.example.com"
      rules:
      - backendRefs:
        - name: my-service
          port: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app
      ports:
      - name: tcp-port
        protocol: TCP
        port: 80
        targetPort: 8080
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: nginx
            image: my-app-image
    

    此文件是一个 Kubernetes 清单,会应用于集群以部署应用。此清单包含 Canary 部署所需的 Service 和 Deployment 资源,以及使用 Gateway API 所需的 HTTPRoute 和 Gateway 资源。

    Cloud Run

    deploy-canary-quickstart-run 目录中创建一个名为 run.yaml 的文件,其中包含以下内容:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: my-canary-run-service
    spec:
      template:
        spec:
          containers:
          - image: my-app-image
    

    该文件是一个 Cloud Run 服务配置文件,用于在部署时在 Cloud Run 中创建您的服务。

创建交付流水线和目标

您可以在单个文件或单独的文件中定义交付流水线和目标。在本快速入门中,我们将为流水线和单个目标创建一个文件:

GKE

deploy-canary-quickstart-gke 目录中创建一个名为 clouddeploy.yaml 的文件,其中包含以下内容:

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          kubernetes:
            serviceNetworking:
              service: "my-service"
              deployment: "my-deployment"
        canaryDeployment:
          percentages: [50]
          verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: prod
description: prod GKE cluster
gke:
 cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster

GKE + Gateway API

deploy-canary-quickstart-gke-gatewayapi 目录中创建一个名为 clouddeploy.yaml 的文件,其中包含以下内容:

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          kubernetes:
            gatewayServiceMesh:
              httpRoute: "my-httproute"
              service: "my-service"
              deployment: "my-deployment"
        canaryDeployment:
          percentages: [50]
          verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: prod
description: prod GKE cluster
gke:
 cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster

Cloud Run

deploy-canary-quickstart-run 目录中创建一个名为 clouddeploy.yaml 的文件,其中包含以下内容:

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          cloudRun:
            automaticTrafficControl: true
        canaryDeployment:
          percentages: [50]
          verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: prod
description: prod Run Service
run:
  location: projects/PROJECT_ID/locations/us-central1
  1. 向 Cloud Deploy 服务注册流水线和目标:

    gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
    

    现在,您已拥有一条流水线,其中针对 Canary 部署策略配置了一个目标。

  2. 确认您的流水线和目标:

    在 Google Cloud 控制台中,前往 Cloud Deploy 交付流水线页面,以查看可用交付流水线列表。

    打开“交付流水线”页面

    此时将显示您刚刚创建的交付流水线,并且目标列中会列出您配置的一个目标。

    Google Cloud 控制台中的交付流水线可视化

创建版本

版本是 Cloud Deploy 的中心资源,代表要部署的更改。交付流水线定义该版本的生命周期。如需详细了解该生命周期,请参阅 Cloud Deploy 服务架构

如需创建 release 资源来表示要部署的容器映像,请从 deploy-canary-quickstart-gkedeploy-canary-quickstart-gke-gatewayapideploy-canary-quickstart-run 目录运行以下命令:

GKE

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-canary-demo-app-1 \
   --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa

GKE + Gateway API

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-canary-demo-app-1 \
   --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa

Cloud Run

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-canary-demo-app-1 \
   --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:6063adf8f687702b4065151acddba6781c47bc602167eb9f3bec8aebc9ce95cc

当您创建版本时,Cloud Deploy 也会自动创建发布资源,以立即部署到您的一个目标 prod

我们会跳到稳定阶段

在第一个版本中,我们跳过了 Canary 阶段,而是部署到 100%(稳定阶段)。这是因为之前尚未部署该应用,因此无法计算 50% 的 Pod(对于 GKE)或计算服务流量的流量分配方式(对于 Cloud Run)。Pod (GKE) 或修订版本 (Cloud Run) 尚不存在。

跳过 Canary 阶段后,我们现在可以开始启动稳定阶段,该阶段会将流量提升至 100%。之后,我们将创建另一个版本,它将执行 Canary 版。

在实际情况中,您通常需要执行应用已在运行应用的 Canary 部署,因此这个阶段跳过的情况很少见。

在 Google Cloud 控制台中查看该版本

现在您已创建了第一个版本,系统已创建发布,您可以在 Google Cloud 控制台中查看该版本和发布。您还可以查看流水线可视化图表,其中会显示相应版本的当前状态。

  1. 在 Google Cloud 控制台中,前往 Cloud Deploy 交付流水线页面,以查看您的 my-canary-demo-app-1 交付流水线。

    打开“交付流水线”页面

  2. 点击交付流水线的名称“my-canary-demo-app-1”。

    流水线可视化会显示应用的部署状态。由于流水线中只有一个阶段,因此可视化结果仅显示一个节点。

    Google Cloud 控制台中的交付流水线可视化

    您的版本列在版本标签页中交付流水线详细信息下。

  3. 点击版本名称 test-release-001

    您的发布会显示在发布下。您可以点击发布以查看其详细信息,包括部署日志。

    Google Cloud 控制台中的“发布”部分

    请注意,发布状态为“待推进”,流水线可视化图表中显示的目标具有指向“推进到稳定版”的链接。

推进发布阶段

在发布第一个版本之后,系统会跳过 Canary 阶段,而等待发布进入“稳定”阶段,该阶段会将应用部署到 100%:

  1. 在流水线可视化图表中,点击推进到稳定版

  2. 出现提示时,点击推进进行确认。

几分钟后,发布现在会进入“稳定”阶段,并且应用已部署至 100%。

稳定阶段的交付流水线

执行 Canary 部署

由于第一个版本跳过了 Canary 阶段,因此我们将创建另一个版本,这次它会执行 Canary 部署。

  1. 如需创建新的 release,请从 deploy-canary-quickstart-gkedeploy-canary-quickstart-gke-gatewayapideploy-canary-quickstart-run 目录运行以下命令:

    GKE

    gcloud deploy releases create test-release-002 \
      --project=PROJECT_ID \
      --region=us-central1 \
      --delivery-pipeline=my-canary-demo-app-1 \
      --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
    

    GKE + Gateway API

    gcloud deploy releases create test-release-002 \
      --project=PROJECT_ID \
      --region=us-central1 \
      --delivery-pipeline=my-canary-demo-app-1 \
      --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
    

    Cloud Run

    gcloud deploy releases create test-release-002 \
      --project=PROJECT_ID \
      --region=us-central1 \
      --delivery-pipeline=my-canary-demo-app-1 \
      --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:6063adf8f687702b4065151acddba6781c47bc602167eb9f3bec8aebc9ce95cc
    

    几分钟后,系统会创建发布,这次会执行 Canary 阶段:

    启动 Canary 阶段的交付流水线

    当第一个发布阶段结束时,发布现在会进入 Canary 阶段:

    在 Google Cloud 控制台中直观呈现交付流水线,其中应用部署到了 50%

    这意味着该应用现已部署到 50%。对于基于 serviceNetworking 的 GKE,它会部署到您的一半 Pod 中。对于基于 Gateway API 的 GKE 和 Cloud Run,流量将分配给 50%。

  2. 点击推进发布,然后在出现提示时点击推进

    这会将发布推进到“稳定”阶段,将应用部署至 100%。

    交付流水线进入稳定阶段,部署至 100%

清理

为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。

  1. 删除 canary-quickstart-cluster 集群(仅限 GKE):

    gcloud container clusters delete canary-quickstart-cluster --region=us-central1 --project=PROJECT_ID
    
  2. 删除 my-canary-run-service 服务(仅限 Cloud Run):

    gcloud run services delete my-canary-run-service --region=us-central1 --project=PROJECT_ID
    
  3. 删除交付流水线、目标以及所有发布和发布资源:

    gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
    
  4. 删除 Cloud Deploy 创建的 Cloud Storage 存储分区。

    一个以 _clouddeploy 结尾,另一个是 [region].deploy-artifacts.[project].appspot.com

    打开“Cloud Storage 浏览器”页面

恭喜,您已经完成快速入门!

后续步骤