使用部署参数

本页介绍了如何使用 Cloud Deploy 同时将示例应用提交到两个目标并行部署),同时使用三种不同的方法将不同的参数值传递给每个呈现的清单或服务定义。

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

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

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

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

    两个子目标的清单或服务定义将相同,但在部署时,每个子目标的呈现清单或服务定义中,此快速入门中配置的特定参数的值将不同。

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

    此流水线将包含一个多目标,并引用两个子目标, 将应用部署到两个集群或两项服务

  4. 您可以在三个不同的位置定义部署参数

    • 在流水线进程中
    • 在子目标上
    • 使用命令行创建版本时
  5. 通过创建一个版本来实例化您的交付流水线,该版本会自动 同时部署到两个目标

  6. 在 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. Make sure 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. 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. Make sure that billing is enabled for your Google Cloud project.

  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:

        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,使用默认设置创建两个集群 deploy-params-cluster-prod1deploy-params-cluster-prod2。集群的 Kubernetes API 端点必须可通过公共互联网访问。默认情况下,GKE 集群可从外部访问。

gcloud container clusters create-auto deploy-params-cluster-prod1 \
                 --project=PROJECT_ID \
                 --region=us-central1 \
                 && gcloud container clusters create-auto deploy-params-cluster-prod2 \
                 --project=PROJECT_ID \
                 --region=us-west1

准备 Skaffold 配置和清单

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

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

  1. 打开一个终端窗口。

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

    GKE

    mkdir deploy-params-gke-quickstart
    cd deploy-params-gke-quickstart
    

    Cloud Run

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

    GKE

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

    Cloud Run

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

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

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

  4. 创建应用的定义 - 定义 GKE 的 Kubernetes 清单。

    GKE

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

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
    spec:
      replicas: 1 # from-param: ${replicaCount}
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
          annotations:
            commit: defaultShaValue # from-param: ${git-sha}
        spec:
          containers:
          - name: nginx
            image: my-app-image
            env:
            - name: envvar1
              value: default1 # from-param: ${application_env1}
            - name: envvar2
              value: default2 # from-param: ${application_env2}
    

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

    Cloud Run

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

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: my-parallel-run-service
    spec:
      autoscaling.knative.dev/minScale: 1 # from-param: ${minInstances}
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          annotations:
            commit: defaultShaValue # from-param: ${git-sha}
        spec:
          containers:
          - image: my-app-image
            env:
            - name: envvar1
              value: defaultValue1 # from-param: ${application_env1}
            - name: envvar2
              value: defaultValue2 # from-param: ${application_env2}
    

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

创建交付流水线和目标

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

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

    GKE

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

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-params-demo-app-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: params-prod-multi
        deployParameters:
        - values:
            replicaCount: "2"
          matchTargetLabels:
            label1: label1
        - values:
            replicaCount: "3"
          matchTargetLabels:
            label2: label2
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: params-prod-multi
    description: production clusters
    multiTarget:
      targetIds: [params-prod-a, params-prod-b]
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: params-prod-a
      labels:
        label1: label1
    description: production cluster 1
    deployParameters:
      application_env1: "sampleValue1"
    gke:
      cluster: projects/PROJECT_ID/locations/us-central1/clusters/deploy-params-cluster-prod1
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: params-prod-b
      labels:
        label2: label2
    description: production cluster 2
    deployParameters:
      application_env2: "sampleValue2"
    gke:
      cluster: projects/PROJECT_ID/locations/us-west1/clusters/deploy-params-cluster-prod2
    

    Cloud Run

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

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-params-demo-app-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: params-prod-multi
        deployParameters:
        - values:
            minInstances: "2"
          matchTargetLabels:
            label1: label1
        - values:
            minInstances: "3"
          matchTargetLabels:
            label2: label2
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: params-prod-multi
    description: production clusters
    multiTarget:
      targetIds: [params-prod-a, params-prod-b]
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: params-prod-a
      labels:
        label1: label1
    description: production cluster 1
    deployParameters:
      application_env1: "sampleValue1"
    run:
      location: projects/PROJECT_ID/locations/us-central1
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: params-prod-b
      labels:
        label2: label2
    description: production cluster 2
    deployParameters:
      application_env2: "sampleValue2"
    run:
      location: projects/PROJECT_ID/locations/us-west1
    
  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 控制台中的交付流水线直观显示

    请注意,列出的唯一目标是多目标 params-prod-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-params-demo-app-1 \
   --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa \
   --deploy-parameters="git-sha=f787cac"

Cloud Run

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

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-params-demo-app-1 \
   --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4 \
   --deploy-parameters="git-sha=f787cac"

与往常一样,当您创建版本时,系统会自动为应用的 流水线中的第一个目标(除非使用 --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 控制台中的发布

  4. 版本详情下,选择工件标签页。

    部署参数 (Deploy parameters) 表列出了您在 以及您为这些参数提供的值:

    GKE

    部署参数和
Google Cloud 控制台中显示的值

    Cloud Run

    Google Cloud 控制台中显示的部署参数和值

    除了参数和值之外,该表还会显示每个参数适用于哪个目标。

  5. 版本检查器列中,针对以下任一项点击查看工件: 目标。

  6. 点击显示差异,然后针对一个目标选择 params-prod-a,以及 params-prod-b 代表另一个行。

    系统显示差异,比较两个目标的渲染清单, 包括您指定的值:

    GKE

    所呈现清单的 diff 结果(包含传递的值)

    Cloud Run

    特定于目标的呈现清单,包含传递的值

清理

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

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

    GKE

    gcloud container clusters delete deploy-params-cluster-prod1 --region=us-central1 --project=PROJECT_ID \
    && gcloud container clusters delete deploy-params-cluster-prod2 --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 浏览器”页面

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

后续步骤