在部署前后运行钩子

本快速入门介绍如何运行部署钩子,即使用 Cloud Deploy 部署之前或之后运行的任意程序。

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

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

    您也可以使用 GKE Enterprise 集群来实现此目的,但本快速入门仅使用 GKE 和 Cloud Run。

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

    在 Skaffold 配置文件中,您可以配置要运行的部署钩子。您需要确定一个要在部署前运行的容器,以及在部署后要运行的容器。

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

    在交付流水线配置中,您将引用 skaffold.yaml 中定义的部署钩子来运行这些钩子。

    此流水线仅包含一个阶段,并且仅使用一个目标。

  4. 创建版本,系统会自动将其部署到目标。

    其中一个钩子在应用部署之前运行,另一个钩子在部署应用之后运行。

  5. 使用 Google Cloud 控制台中的 Cloud Deploy 发布详情页面,在 Cloud Build 日志中查看部署前钩子和部署后钩子的结果。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  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. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  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. 为特定运行时添加开发者角色。
      • 对于 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-hooks-cluster。集群的 Kubernetes API 端点必须可通过公共互联网网络访问。默认情况下,GKE 集群可从外部访问。

gcloud container clusters create-auto deploy-hooks-cluster \
                 --project=PROJECT_ID \
                 --region=us-central1

准备 Skaffold 配置和应用清单

Cloud Deploy 使用 Skaffold 提供有关要部署的内容以及如何将其部署到目标的详细信息。

在本快速入门中,您将创建一个 skaffold.yaml 文件,该文件标识将用于部署示例应用的清单,并且标识在部署之前和之后运行的容器(部署钩子)。

  1. 打开一个终端窗口。

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

    GKE

    mkdir deploy-hooks-gke-quickstart
    cd deploy-hooks-gke-quickstart
    

    Cloud Run

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

    GKE

    apiVersion: skaffold/v4beta7
    kind: Config
    manifests:
      rawYaml:
      - k8s-pod.yaml
    deploy:
      kubectl: {}
    customActions:
    - name: predeploy-action
      containers:
      - name: predeploy-echo
        image: ubuntu
        command: ["/bin/sh"]
        args: ["-c", 'echo "this is a predeploy action"' ]
    - name: postdeploy-action
      containers:
      - name: postdeploy-echo
        image: ubuntu
        command: ["/bin/sh"]
        args: ["-c", 'echo "this is a postdeploy action"' ]
    

    Cloud Run

    apiVersion: skaffold/v4beta7
    kind: Config
    manifests:
      rawYaml:
      - service.yaml
    deploy:
      cloudrun: {}
    customActions:
    - name: predeploy-action
      containers:
      - name: predeploy-echo
        image: ubuntu
        command: ["/bin/sh"]
        args: ["-c", 'echo "this is a predeploy action"' ]
    - name: postdeploy-action
      containers:
      - name: postdeploy-echo
        image: ubuntu
        command: ["/bin/sh"]
        args: ["-c", 'echo "this is a postdeploy action"' ]
    

    此文件包含 customActions: 节。这定义了在部署之前和之后要运行的容器,即钩子。

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

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

    GKE

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

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-hooks-pod
    spec:
      containers:
      - name: nginx
        image: my-app-image
    

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

    Cloud Run

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

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

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

创建交付流水线和目标

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

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

    GKE

    deploy-hooks-gke-quickstart 目录中,创建一个新文件 clouddeploy.yaml,其中包含以下内容:

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: deploy-hooks-demo-app-gke-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: hooks-staging
        profiles: []
        strategy:
          standard:
            predeploy:
              actions: ["predeploy-action"]
            postdeploy:
              actions: ["postdeploy-action"]
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: hooks-staging
    description: hooks staging cluster
    gke:
      cluster: projects/PROJECT_ID/locations/us-central1/clusters/deploy-hooks-cluster
    

    Cloud Run

    deploy-hooks-run-quickstart 目录中,创建一个新文件 clouddeploy.yaml,其中包含以下内容:

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: deploy-hooks-demo-app-run-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: hooks-staging
        profiles: []
        strategy:
          standard:
            predeploy:
              actions: ["predeploy-action"]
            postdeploy:
              actions: ["postdeploy-action"]
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: hooks-staging
    description: staging Run service
    run:
      location: projects/PROJECT_ID/locations/us-central1
    
  2. 向 Cloud Deploy 服务注册流水线和目标:

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

    现在,您已拥有了一个只有一个目标的交付流水线,已准备好部署应用并运行部署前和部署后作业。

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

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

    打开“交付流水线”页面

    此时将显示您刚刚创建的交付流水线,目标列中列出了一个目标。

    Google Cloud 控制台中的交付流水线页面,显示了您的流水线

创建版本

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

GKE

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

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

Cloud Run

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

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

与所有版本一样(除非它们包含 --disable-initial-rollout),Cloud Deploy 也会自动创建发布资源。应用会自动部署到为此交付流水线配置的一个目标中。

此外,部署前作业会在应用部署之前运行,部署后作业会在部署后运行。

在 Google Cloud 控制台中查看结果

几分钟后,您的版本将部署到目标运行时。

我们(出于示例目的)配置的部署前钩子和部署后钩子会将字符串输出到 Cloud Build 日志中。我们可以查看这些日志,确认钩子是否按预期运行。

  1. 在 Google Cloud 控制台中,导航到 Cloud Deploy 交付流水线页面以查看您的交付流水线(“deploy-hooks-demo-app-gke-1”或“deploy-hooks-demo-app-run-1”)。

    打开“交付流水线”页面

  2. 点击交付流水线的名称(“deploy-hooks-demo-app-gke-1”或“deploy-hooks-demo-app-run-1”)。

    流水线可视化会显示应用的部署状态。由于流水线中只有一个阶段,因此可视化结果仅显示一个节点。

    显示成功的交付流水线可视化内容

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

  3. 点击交付流水线详情下的发布标签页。

  4. 点击发布名称以查看发布详情。

    Google Cloud 控制台中的“发布”部分

    部署前部署后列为作业。

  5. 点击预部署

    系统会显示作业运行日志。

  6. 在日志条目列表中向下滚动,找到 predeploy-echo,然后点击它。

    部署前作业的日志

    请注意 textPayload。该字符串是您在 Skaffold 配置predeploy-action 中配置的字符串。

  7. 点击部署后作业,然后找到 postdeploy-echo 日志条目。

    部署后作业的日志

清理

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

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

    GKE

    gcloud container clusters delete deploy-hooks-cluster --region=us-central1 --project=PROJECT_ID
    

    Cloud Run

    gcloud run services delete my-hooks-run-service --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 浏览器”页面

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

后续步骤