Canary - 将应用部署到目标

本快速入门介绍如何使用 Cloud Deploy 交付示例应用 部署到 Google Kubernetes Engine 或 Cloud Run (您还可以运行到 GKE Enterprise 的 Canary 部署, 但这里仅显示 GKE 和 Cloud Run quickstart.)

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 交付流水线和部署 target

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

    第一个版本会跳过 Canary 阶段

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

  6. 创建第二个版本,这次执行 Canary 阶段,部署 提升到 50%

  7. 推进版本以 100% 部署。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  9. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    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 和采用 Gateway API 的 GKE:

        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 提供 其中详细说明了要部署的内容以及如何将其正确部署到 target

在本快速入门中,您将创建一个 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 manifest, 应用于集群以部署应用

    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
    

    此文件是一个 manifest, 应用于集群以部署应用此清单包含 Canary 部署所需的服务和部署资源,以及使用 Gateway API 所需的 HTTPRoute 和网关资源。

    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 服务架构 了解有关该生命周期的详细信息。

如需创建表示要部署的容器映像的 release 资源, 从 deploy-canary-quickstart-gke 运行以下命令, deploy-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. 出现提示时,点击 Advance(推进)进行确认。

几分钟后,发布现已进入“稳定”阶段阶段,而 部署比例

稳定阶段交付流水线

执行 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 阶段:

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

    这意味着应用现在已部署到 50% 的环境中运行。对于 部署在基于 ServiceNetworking 的 GKE 中, Pod。适用于基于 Gateway API 的 GKE 和 系统会将 Cloud Run 流量分配给 50%。

  2. 点击 Advance Rollout(提前发布),然后在出现提示时点击 Advance(高级)。

    这会将发布推进到“稳定版本”阶段,将应用部署到 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 浏览器”页面

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

后续步骤