同时将应用部署到多个目标平台
本页面介绍了如何使用 Cloud Deploy 将示例应用同时交付给两个目标(并行部署)。
在本快速入门中,您将执行以下操作:
- 创建两个 GKE 集群或两个 Cloud Run 服务。 - 您也可以并行部署到 GKE Enterprise 集群,但此快速入门仅使用 GKE 和 Cloud Run。 
- 创建 Skaffold 配置以及 Kubernetes 清单或 Cloud Run 服务定义。 
- 定义 Cloud Deploy 交付流水线和部署目标。 - 此流水线将只有一个目标,但该目标将是一个多目标,即表示多个部署目标的目标。 此多目标将包含两个实际目标,用于将应用交付到这两个集群或服务。 
- 通过创建一个自动并行部署到两个目标的版本来实例化交付流水线。 
- 在 Google Cloud 控制台中查看“控制器发布”和子发布。 
准备工作
- 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.
- 
    
    
      
        In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
  
  
    
      Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs. Roles required to enable APIs To enable APIs, you need the Service Usage Admin IAM role ( roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
- 
      Install the Google Cloud CLI. 
- 
          如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。 
- 
        如需初始化 gcloud CLI,请运行以下命令: gcloud init
- 
    
    
      
        In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
  
  
    
      Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs. Roles required to enable APIs To enable APIs, you need the Service Usage Admin IAM role ( roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
- 
      Install the Google Cloud CLI. 
- 
          如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。 
- 
        如需初始化 gcloud CLI,请运行以下命令: gcloud init
- 确保默认 Compute Engine 服务账号具有足够的权限。服务账号可能已经拥有必要的权限。针对默认服务账号停用自动角色授予的项目包含这些步骤。 - 首先,添加 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"
- 为您的特定运行时添加开发者角色。
- 对于 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"
- 
添加 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-qsprod1和quickstart-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文件,以标识要用于部署示例应用的应用程序清单。- 打开一个终端窗口。 
- 创建一个新目录,并导航至该目录。 - GKE- mkdir deploy-gke-parallel-quickstart cd deploy-gke-parallel-quickstart- Cloud Run- mkdir deploy-run-parallel-quickstart cd deploy-run-parallel-quickstart
- 创建名为 - 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参考文档。
- 为您的应用创建定义 - 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,当您创建发布版本时,该占位符会被替换为具体映像。
 创建交付流水线和目标您可以在一个文件中或在单独的文件中定义流水线和目标。在本快速入门中,您将创建一个文件。 - 创建交付流水线和目标定义: - 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(带有标签),而子目标包含与这些参数匹配的标签。这样一来,您就可以根据需要向不同的子级目标传递不同的值。了解详情。
- 在 Cloud Deploy 服务中注册流水线和目标: - gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID- 现在,您已经有了一条流水线,其中包含一个由两个 GKE 或 Cloud Run 目标组成的多目标,可以部署应用了。 
- 确认您的流水线和目标: - 在 Google Cloud 控制台中,导航到 Cloud Deploy 交付流水线页面,以查看可用交付流水线的列表。 - 系统会显示您刚刚创建的交付流水线。请注意,即使您在 - clouddeploy.yaml文件中配置了三个目标(一个多目标和两个子目标),目标列中也只列出了一个目标。 - 请注意,列出的唯一目标是多目标 - 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-multiCloud 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 服务。 - 在 Google Cloud 控制台中,导航到 Cloud Deploy 交付流水线页面,以查看您的 my-parallel-demo-app-1 交付流水线。 
- 点击交付流水线的名称“my-parallel-demo-app-1”。 - 流水线直观显示将显示应用的部署状态。由于流水线中只有一个阶段,因此可视化图表仅显示一个节点。  - 您的版本列在版本标签页中交付流水线详细信息下。 
- 点击版本名称 - test-release-001。- 您的发布会显示在发布下。您可以点击发布以查看其详细信息,包括部署日志。  
 清理为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。 - 删除 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
- 删除交付流水线、多目标、子目标、发布版本和发布: - gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
- 删除 Cloud Deploy 创建的 Cloud Storage 存储分区。 - 一个以 - _clouddeploy结尾,另一个是- [region].deploy-artifacts.[project].appspot.com。
 恭喜,您已经完成快速入门! 后续步骤
- 首先,添加 
如果您已安装 CLI,请确保您运行的是最新版本:
gcloud components update