同时将应用部署到多个目标平台

本页面介绍了如何使用 Cloud Deploy 将示例应用同时交付给两个目标(并行部署)。

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

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

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

  2. 创建 Skaffold 配置以及 Kubernetes 清单或 Cloud Run 服务定义。

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

    流水线将只有一个目标,但该目标将是一个多目标,即表示多个部署目标的目标。 此多目标将包含两个实际目标,用于将应用交付到这两个集群或服务。

  4. 通过创建一个自动并行部署到两个目标的版本来实例化交付流水线。

  5. 在 Google Cloud 控制台中查看“控制器发布”和子发布。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

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

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  7. 如需初始化 gcloud CLI,请运行以下命令:

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

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

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

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  13. 如需初始化 gcloud CLI,请运行以下命令:

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

    gcloud components update
    

  15. 确保默认 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:

        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
      

    创建运行时环境

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

    对于 GKE,使用默认设置创建两个集群:quickstart-cluster-qsprod1quickstart-cluster-qsprod2。集群的 Kubernetes API 端点必须可通过公共互联网访问。默认情况下,GKE 集群可从外部访问。

    gcloud container clusters create-auto quickstart-cluster-qsprod1 \
                     --project=PROJECT_ID \
                     --region=us-central1 \
                     && gcloud container clusters create-auto quickstart-cluster-qsprod2 \
                     --project=PROJECT_ID \
                     --region=us-west1
    

    准备 Skaffold 配置和应用清单

    Cloud Deploy 使用 Skaffold 提供要部署的内容的详细信息,以及如何为您的单独目标正确部署这些内容。

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

    1. 打开一个终端窗口。

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

      GKE

      mkdir deploy-gke-parallel-quickstart
      cd deploy-gke-parallel-quickstart
      

      Cloud Run

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

      GKE

      apiVersion: skaffold/v4beta1
      kind: Config
      manifests:
        rawYaml:
        - k8s-deployment.yaml
      deploy:
        kubectl: {}
      

      Cloud Run

      apiVersion: skaffold/v4beta1
      kind: Config
      manifests:
        rawYaml:
        - service.yaml
      deploy:
        cloudrun: {}
      

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

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

    4. 为您的应用创建定义 - Cloud Run 的服务定义或 GKE 的 Kubernetes 清单。

      GKE

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

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-deployment
        labels:
          app: my-app
        namespace: default
      spec:
        replicas: 1 # from-param: ${replicaCount}
        selector:
          matchLabels:
            app: my-app
        template:
          metadata:
            labels:
              app: my-app
          spec:
            containers:
            - name: nginx
              image: my-app-image
      

      此文件是一个简单的 Kubernetes 清单,可应用于集群以部署应用。要部署的容器映像在此处设置为占位符 my-app-image,当您创建发布版本时,该占位符会被替换为特定映像。

      Cloud Run

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

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: my-parallel-run-service
      spec:
        template:
          metadata:
            annotations:
              autoscaling.knative.dev/minScale: 1 # from-param: ${minInstances}
          spec:
            containers:
            - image: my-app-image
      

      此文件是一个简单的 Cloud Run 服务定义,在部署时用于创建 Cloud Run 服务。要部署的容器映像在此处设置为占位符 my-app-image,当您创建发布版本时,该占位符会被替换为具体映像。

    创建交付流水线和目标

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

    1. 创建交付流水线和目标定义:

      GKE

      deploy-gke-parallel-quickstart 目录中,创建包含以下内容的新文件 clouddeploy.yaml

      apiVersion: deploy.cloud.google.com/v1
      kind: DeliveryPipeline
      metadata:
        name: my-parallel-demo-app-1
      description: main application pipeline
      serialPipeline:
        stages:
        - targetId: qsprod-multi
          profiles: []
          deployParameters:
          - values:
              replicaCount: "1"
            matchTargetLabels:
              label1: label1
          - values:
              replicaCount: "2"
            matchTargetLabels:
              label2: label2
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: qsprod-multi
      description: production clusters
      multiTarget:
        targetIds: [qsprod-a, qsprod-b]
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: qsprod-a
        labels:
          label1: label1
      description: production cluster 2
      gke:
        cluster: projects/PROJECT_ID/locations/us-central1/clusters/quickstart-cluster-qsprod1
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: qsprod-b
        labels:
          label2: label2
      description: production cluster 3
      gke:
        cluster: projects/PROJECT_ID/locations/us-west1/clusters/quickstart-cluster-qsprod2
      

      Cloud Run

      deploy-run-parallel-quickstart 目录中,创建包含以下内容的新文件 clouddeploy.yaml

      apiVersion: deploy.cloud.google.com/v1
      kind: DeliveryPipeline
      metadata:
        name: my-parallel-demo-app-1
      description: main application pipeline
      serialPipeline:
        stages:
        - targetId: qsprod-multi
          profiles: []
          deployParameters:
          - values:
              minInstances: "2"
            matchTargetLabels:
              label1: label1
          - values:
              minInstances: "3"
            matchTargetLabels:
              label2: label2
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: qsprod-multi
      description: production
      multiTarget:
        targetIds: [qsprod-a, qsprod-b]
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: qsprod-a
        labels:
          label1: label1
      description: production us-central1
      run:
        location: projects/PROJECT_ID/locations/us-central1
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: qsprod-b
        labels:
          label2: label2
      description: production us-west1
      run:
        location: projects/PROJECT_ID/locations/us-west1
      

      请注意,此文件包含三个目标:一个多目标和两个子目标。您也可以在单独的文件中配置目标,而不是在交付流水线中配置。

      另请注意,交付流水线包含 deployParameters(带有标签),而子目标包含与这些参数匹配的标签。这样一来,您就可以根据需要向不同的子级目标传递不同的值。了解详情

    2. 在 Cloud Deploy 服务中注册流水线和目标:

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

      现在,您已经有了一条流水线,其中包含一个由两个 GKE 或 Cloud Run 目标组成的多目标,可以部署应用了。

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

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

      打开“交付流水线”页面

      系统会显示您刚刚创建的交付流水线。请注意,即使您在 clouddeploy.yaml 文件中配置了三个目标(一个多目标和两个子目标),目标列中也只列出了一个目标。

       Google Cloud 控制台中的交付流水线直观显示

      请注意,列出的唯一目标是多目标 qsprod-multi。不显示儿童目标。

    创建版本

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

    GKE

    deploy-gke-parallel-quickstart 目录运行以下命令,以创建表示要部署的容器映像的 release 资源:

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

    Cloud Run

    deploy-run-parallel-quickstart 目录运行以下命令,以创建表示要部署的容器映像的 release 资源:

     gcloud deploy releases create test-release-001 \
       --project=PROJECT_ID \
       --region=us-central1 \
       --delivery-pipeline=my-parallel-demo-app-1 \
       --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a \
       --to-target=qsprod-multi
    

    请注意 --images= 标志,您可以使用该标志将清单或服务定义中的占位符 (my-app-image) 替换为特定的、经过 SHA 限定的映像。Google 建议您以这种方式将清单模板化,并在创建发布版本时使用 SHA 限定的映像名称。

    与往常一样,当您创建发布版本时,系统会自动为流水线中的第一个目标(或本例中通过 --to-target= 指定的特定目标)创建发布作业。在此快速入门中,此目标是一个多目标,因此 rollout 是两个子目标的“控制器发布作业”,并且交付流水线中没有后续目标。这意味着,在创建发布版本时,您的应用会部署到所有位置。

    在 Google Cloud 控制台中查看结果

    现在,您已创建发布版本,并且控制器发布和子发布也已创建,这些子发布现在已部署(或正在部署)到各自的 GKE 集群或 Cloud Run 服务。

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

      打开“交付流水线”页面

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

      流水线直观显示将显示应用的部署状态。由于流水线中只有一个阶段,因此可视化图表仅显示一个节点。

       Google Cloud 控制台中的交付流水线直观显示

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

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

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

       Google Cloud 控制台中的发布

    清理

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

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

      GKE

      gcloud container clusters delete quickstart-cluster-qsprod1 --region=us-central1 --project=PROJECT_ID \
      && gcloud container clusters delete quickstart-cluster-qsprod2 --region=us-west1 --project=PROJECT_ID
      

      Cloud Run

      gcloud run services delete my-parallel-run-service --region=us-central1 --project=PROJECT_ID \
      && gcloud run services delete my-parallel-run-service --region=us-west1 --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 浏览器”页面

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

    后续步骤