在部署前后运行钩子
本快速入门介绍如何运行部署钩子(在您使用 Cloud Deploy 进行部署之前或之后运行的任意程序)。
在本快速入门中,您将执行以下操作:
创建一个 GKE 集群或一个 Cloud Run 服务。
您也可以使用 GKE Enterprise 集群来完成此操作,但本快速入门仅使用 GKE 和 Cloud Run。
创建 Skaffold 配置以及 Kubernetes 清单或 Cloud Run 服务定义。
您可以在 Skaffold 配置文件中配置要运行的部署钩子。您可以指定要在部署之前运行的容器,以及要在部署之后运行的容器。
定义 Cloud Deploy 交付流水线和部署目标。
在交付流水线配置中,您将引用在
skaffold.yaml
中定义的部署钩子,以运行这些钩子。此流水线仅包含一个阶段,并且仅使用一个目标。
创建版本,该版本会自动部署到目标。
其中一个钩子在应用部署之前运行,另一个钩子在应用部署之后运行。
在 Cloud Build 日志中查看部署前和部署后钩子的结果,方法是在Google Cloud 控制台中使用 Cloud Deploy 发布详细信息页面。
准备工作
- 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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
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
如果您已安装 CLI,请确保您运行的是最新版本:
gcloud components update
创建运行时环境
如果您要部署到 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
文件,以标识要用于部署示例应用的清单,并标识要在部署之前和之后运行的容器(部署钩子)。
打开一个终端窗口。
创建一个新目录,并导航至该目录。
GKE
mkdir deploy-hooks-gke-quickstart cd deploy-hooks-gke-quickstart
Cloud Run
mkdir deploy-hooks-run-quickstart cd deploy-hooks-run-quickstart
创建名为
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:
stanza。这会定义在部署之前和之后运行的容器(即钩子)。如需详细了解此配置文件,请参阅
skaffold.yaml
参考文档。为您的应用创建定义 - 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 清单,应用于集群以部署应用。要部署的容器映像在此处设置为占位符
my-app-image
,当您创建发布版本时,该占位符会被替换为具体映像。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 服务定义,用于部署应用。要部署的容器映像在此处设置为占位符
my-app-image
,当您创建发布版本时,该占位符会被替换为具体映像。
创建交付流水线和目标
您可以在一个文件中或在单独的文件中定义流水线和目标。在本快速入门中,您将创建一个文件。
创建交付流水线和目标定义:
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
在 Cloud Deploy 服务中注册流水线和目标:
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
现在,您已经有了包含一个目标的交付流水线,可以部署应用并运行部署前和部署后作业了。
确认您的流水线和目标:
在 Google Cloud 控制台中,导航到 Cloud Deploy 交付流水线页面,以查看可用交付流水线的列表。
此时将显示您刚刚创建的交付流水线,并且目标列会列出了一个目标。
创建版本
版本是表示要部署的更改的中央 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
请注意 --images=
标志,您可以使用该标志将清单中的占位符 (my-app-image
) 替换为特定的、经过 SHA 验证的映像。Google 建议您以这种方式将清单模板化,并在创建发布版本时使用 SHA 限定的映像名称。
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:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
请注意 --images=
标志,您可以使用该标志将服务定义中的占位符 (my-app-image
) 替换为特定的、经过 SHA 验证的映像。Google 建议您以这种方式将服务和作业定义模板化,并在创建版本时使用 SHA 限定的映像名称。
与所有版本一样(除非它们包含 --disable-initial-rollout
),Cloud Deploy 还会自动创建部署资源。应用会自动部署到为此交付流水线配置的目标中。
此外,预部署作业在应用部署之前运行,部署后作业在应用部署之后运行。
在 Google Cloud 控制台中查看结果
几分钟后,您的发布版本就会部署到目标运行时。
我们配置的部署前钩子和部署后钩子(仅用于演示)会将字符串输出到 Cloud Build 日志。我们可以查看这些日志,以确认钩子是否按预期工作。
在 Google Cloud 控制台中,导航到 Cloud Deploy 交付流水线页面,以查看您的交付流水线(“deploy-hooks-demo-app-gke-1”或“deploy-hooks-demo-app-run-1”)。
点击交付流水线的名称(“deploy-hooks-demo-app-gke-1”或“deploy-hooks-demo-app-run-1”)。
流水线直观显示将显示应用的部署状态。由于流水线中只有一个阶段,因此可视化图表仅显示一个节点。
您的版本列在版本标签页中交付流水线详细信息下。
在交付流水线详情下,点击发布标签页。
点击发布名称即可查看发布详情。
部署前和部署后列为作业。
点击部署前
系统会显示作业运行日志。
在日志条目列表中向下滚动,找到
predeploy-echo
,然后点击它。请注意
textPayload
。该字符串是在 Skaffold 配置的predeploy-action
中配置的。点击 Postdeploy 作业,然后找到
postdeploy-echo
日志条目。
清理
为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。
删除 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
删除交付流水线、目标、版本和发布:
gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
删除 Cloud Deploy 创建的 Cloud Storage 存储分区。
一个以
_clouddeploy
结尾,另一个是[region].deploy-artifacts.[project].appspot.com
。
恭喜,您已经完成快速入门!