在 Cloud Deploy 中自动执行版本提升和发布推进

本页面介绍了如何使用 Cloud Deploy 自动提升 并将发布推进到下一阶段。

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

  1. 创建两个 GKE 集群或两个 Cloud Run 服务。

  2. 创建 Skaffold 配置以及一个 Kubernetes 集群 清单或 Cloud Run 服务定义

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

    流水线将部署到两个目标:devstaging。而 staging 目标使用 Canary 部署策略

  4. 定义两条自动化规则:

    • 用于将版本提升到 staging 目标的自动化操作 已成功发布到dev

    • 在成功后将发布推进到 stable 阶段的自动化操作 canary-25 阶段的完成。

  5. 通过创建一个版本来实例化您的交付流水线,该版本会自动 部署到 dev 目标。

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

    由于是自动提升,因此此版本已提升到 staging

    由于 staging 目标使用 Canary 部署策略, 是对该运行时的第一个部署,则跳过 canary-25 阶段。 请参阅 为什么有时会跳过阶段 来详细了解首次跳过 Canary 阶段的原因。

    由于是自动推进阶段,因此发布会推进到 stable 阶段。

准备工作

  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. 启用 Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage API。

    启用 API

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

    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. 启用 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. 添加 clouddeploy.releaser 角色:
      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.releaser"
      
    3. 为特定运行时添加开发者角色。
      • 对于 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"
        
    4. 添加 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
      
    5. 添加 iam.serviceAccountUser 角色,包括 actAs 拥有自己的权限,以使用默认服务账号:
      gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --member=user:YOUR_EMAIL_ADDRESS \
          --role="roles/iam.serviceAccountUser" \
          --project=PROJECT_ID
      

      在这种情况下,YOUR_EMAIL_ADDRESS 是您用于访问的电子邮件地址 Google Cloud

创建运行时环境

如果要部署到 Cloud Run,则可以跳过此命令

对于 GKE,创建两个集群:automation-quickstart-cluster-devautomation-quickstart-cluster-staging(采用默认设置)。通过 集群的Kubernetes API 端点必须可通过公共网络访问 。GKE 集群可由 默认值。

gcloud container clusters create-auto automation-quickstart-cluster-dev \
                 --project=PROJECT_ID \
                 --region=us-central1 \
                 && gcloud container clusters create-auto automation-quickstart-cluster-staging \
                 --project=PROJECT_ID \
                 --region=us-central1

获取您的项目编号。

您需要使用项目编号来识别默认服务账号。这是 是配置自动化操作资源的必要条件

  1. 运行以下命令以获取项目编号:

    gcloud projects describe PROJECT_ID
    
  2. 从命令行输出复制项目编号,并将其粘贴到此处。

    您无需将其作为命令运行。粘贴在此处,系统就会填充 服务账号引用。

    PROJECT_NUMBER
    

准备 Skaffold 配置和应用清单

Cloud Deploy 使用 Skaffold 提供 以及如何为单独的集群 目标

在本快速入门中,您将创建一个 skaffold.yaml 文件,用于标识 应用清单,用于部署示例应用。

  1. 打开一个终端窗口。

  2. 创建一个新目录并进入该目录。

    GKE

    mkdir deploy-automation-gke-quickstart
    cd deploy-automation-gke-quickstart
    

    Cloud Run

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

    GKE

    apiVersion: skaffold/v4beta7
    kind: Config
    metadata:
      name: gke-automation
    manifests:
      rawYaml:
      - k8s-deployment.yaml
    deploy:
      kubectl: {}
    

    Cloud Run

    apiVersion: skaffold/v4beta7
    kind: Config
    metadata:
      name: run-automation
    profiles:
    - name: dev
      manifests:
        rawYaml:
        - run-dev.yaml
    - name: staging
      manifests:
        rawYaml:
        - run-staging.yaml
    deploy:
      cloudrun: {}
    

    此文件是最小的 Skaffold 配置。在本快速入门中,您将创建 文件。但您也可以 让 Cloud Deploy 为您创建一个 用于简单的非生产应用

    请参阅 skaffold.yaml 参考文档 来详细了解此文件。

  4. 为应用创建定义 — 一对服务 Kubernetes 清单定义 GKE

    GKE

    创建一个名为 k8s-deployment.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, 应用于集群以部署应用

    Cloud Run

    1. 创建一个名为 run-dev.yaml 的文件,其中包含以下内容:

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: my-automation-run-service-dev
      spec:
        template:
          spec:
            containers:
            - image: my-app-image
      
    2. 创建一个名为 run-staging.yaml 的文件,其中包含以下内容:

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

    这个文件是一个简单的 Cloud Run 服务定义 它用于在部署时创建 服务。

创建交付流水线、目标和自动化

您可以在一个文件或单独的 文件。您也可以在单独的文件中定义自动化操作。这个 快速入门针对流水线、目标和自动化使用一个文件。

  1. 创建交付流水线、目标定义和自动化操作:

    GKE

    deploy-automation-gke-quickstart 目录中,创建一个新文件: clouddeploy.yaml,内容如下:

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-automation-demo-app-1
    description: Automation demonstration pipeline
    serialPipeline:
      stages:
      - targetId: automation-quickstart-dev
      - targetId: automation-quickstart-staging
        profiles: []
        strategy:
          canary:
            runtimeConfig:
              kubernetes:
                serviceNetworking:
                  service: "my-service"
                  deployment: "my-deployment"
            canaryDeployment:
              percentages: [25]
              verify: false
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: automation-quickstart-dev
    description: Dev cluster to demonstrate deploy automation
    gke:
      cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-dev
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: automation-quickstart-staging
    description: Staging cluster to demonstrate deploy automation
    gke:
      cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-staging
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
      name: my-automation-demo-app-1/promote
    description: promotes a release
    suspended: false
    serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
    selector:
      targets:
      - id: automation-quickstart-dev
    rules:
    - promoteReleaseRule:
        name: "promote-release"
        wait: 1m
        toTargetId: "@next"
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
      name: my-automation-demo-app-1/advance
    description: advances a rollout
    suspended: false
    serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
    selector:
      targets:
      - id: automation-quickstart-staging
    rules:
    - advanceRolloutRule:
        name: "advance-rollout"
        sourcePhases: ["canary-25"]
        wait: 1m
    

    Cloud Run

    deploy-automation-run-quickstart 目录中,创建一个新文件: clouddeploy.yaml,内容如下:

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-automation-demo-app-1
    description: Automation demonstration pipeline
    serialPipeline:
      stages:
      - targetId: automation-quickstart-dev
        profiles: [dev]
      - targetId: automation-quickstart-staging
        profiles: [staging]
        strategy:
          canary:
            runtimeConfig:
              cloudRun:
                automaticTrafficControl: true
            canaryDeployment:
              percentages: [25]
              verify: false
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: automation-quickstart-dev
    description: Dev cluster to demonstrate deploy automation
    run:
      location: projects/PROJECT_ID/locations/us-central1
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: automation-quickstart-staging
    description: Staging cluster to demonstrate deploy automation
    run:
      location: projects/PROJECT_ID/locations/us-central1
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
      name: my-automation-demo-app-1/promote
    description: Promotes a release to the next target
    suspended: false
    serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
    selector:
      targets:
      - id: automation-quickstart-dev
    rules:
    - promoteReleaseRule:
        name: "promote-release"
        wait: 1m
        toTargetId: "@next"
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
      name: my-automation-demo-app-1/advance
    description: advances a rollout
    suspended: false
    serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
    selector:
      targets:
      - id: automation-quickstart-staging
    rules:
    - advanceRolloutRule:
        name: "advance-rollout"
        sourcePhases: ["canary-25"]
        wait: 1m
    
  2. 向 Cloud Deploy 服务注册流水线和目标:

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

    现在,您已经构建了一个流水线,其中一个多目标由两个 GKE 或 Cloud Run 目标,已准备好部署 部署应用

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

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

    打开“交付流水线”页面

    此时会显示您刚刚创建的交付流水线,其中列出了两个目标: 目标列。

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

  4. 点击流水线名称以打开交付流水线可视化图表 。

  5. 交付流水线详细信息下,选择自动化标签页。

    系统会显示您创建的两项自动化操作。

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

创建版本

版本是代表 正在部署的更改交付流水线定义该版本的生命周期。请参阅 Cloud Deploy 服务架构 了解有关该生命周期的详细信息。

GKE

deploy-automation-gke-quickstart 运行以下命令 目录中创建一个代表容器的 release 资源 要部署的映像:

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

Cloud Run

deploy-automation-run-quickstart 运行以下命令 目录中创建一个代表容器的 release 资源 要部署的映像:

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

默认情况下,当您创建版本时,系统会自动针对 流水线中的第一个目标。

由于本快速入门包含两个自动化操作,因此会发生两件事 自动:

  • 在第一个目标中成功部署后, 自动提升到第二个目标

    宣传自动化操作需要等待一分钟。

  • 在第二个目标中,配置了 25% Canary 的第二个目标, 自动化将发布从 canary-25 推进到 stable

    对于第一个版本,会跳过 canary-25 阶段,因为没有 Canary 再次运行。而此次发布 自动高级到stable

    自动推进的提前会延迟一分钟。

完成所有设置后,应用将成功部署到 而无需执行任何其他操作

如果您想详细了解如何运行 Canary 部署策略, 试用 Canary 版快速入门

在 Google Cloud 控制台中查看结果

您可以在 Google Cloud 控制台。

  1. 前往 Cloud Deploy 交付流水线页面以查看 交付流水线

    打开“交付流水线”页面

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

    流水线可视化图表会显示应用的部署状态。如果有足够的时间 两个目标都显示为绿色。

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

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

  3. 点击自动化运行标签页。

    有两个条目,分别对应您创建的两个自动化操作。您 可以点击任一项来查看该自动化操作的详细信息

    Google Cloud 控制台中显示的自动化运行详情

清理

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

  1. 删除 GKE 集群或 Cloud Run 服务:

    GKE

    gcloud container clusters delete automation-quickstart-cluster-dev --region=us-central1 --project=PROJECT_ID \
    && gcloud container clusters delete automation-quickstart-cluster-staging --region=us-west1 --project=PROJECT_ID
    

    Cloud Run

    gcloud run services delete my-automation-run-service-dev --region=us-central1 --project=PROJECT_ID \
    && gcloud run services delete my-automation-run-service-staging --region=us-central1 --project=PROJECT_ID
    
  2. 删除交付流水线、目标、自动化操作、版本和发布:

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

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

    打开“Cloud Storage 浏览器”页面

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

后续步骤