本文档介绍了如何部署应用,包括 Cloud Run 服务、Cloud Run 作业和 Cloud Run 工作器池。(Cloud Run 工作器池处于 预览版阶段)。
借助 Cloud Deploy,您可以将基于容器的工作负载部署到任何 Cloud Run 服务、 作业或 工作器池。 当您将 Cloud Run 服务或工作器池部署到 Cloud Run 目标时,系统支持所有 Cloud Deploy 功能,但 Cloud Run 作业不支持金丝雀部署。
本文档介绍了部署到 Cloud Run 时需要完成的三个主要配置:
- 创建目标配置
- 创建 Skaffold 配置
- 创建 Cloud Run 服务定义、 作业定义或 工作器池定义
限制
每个目标只能部署一项 Cloud Run 服务、作业或工作器池。
您无法针对 Cloud Run 作业运行 Canary 部署 。
不过,Cloud Run 服务和工作器池可以使用 Canary 部署。
如需使用 Cloud Deploy 部署 Cloud Run 函数,您需要修改 CI 工作流,将函数构建到容器中,并将其部署为 Cloud Run 服务。
Cloud Run 工作器池处于 预览版阶段。
准备工作
确保您正在 使用 gcloud CLI 版本
541.0.0或更高版本。
创建您的目标配置
您可以在交付流水线 YAML 中配置目标,也可以在单独的文件中配置目标。此外,您还可以在同一文件中配置多个目标。
目标必须在与交付流水线相同的项目和区域中定义。 但是,目标部署到的服务、作业或工作器池可以位于不同的项目和区域中,前提是服务帐号有权访问这些项目。
在目标定义中,创建一个 run 节来标识将创建 Cloud Run 服务的位置。
在目标定义中指定 Cloud Run 服务、作业或工作器池的语法如下:
run:
location: projects/[project_name]/locations/[region_name]
此资源标识符使用以下元素:
project_name是将在其中创建 Cloud Run 服务、作业或工作器池的 Google Cloud 项目的名称。您需要为每个目标执行此操作。我们建议为每个 Cloud Run 服务、作业或工作器池使用不同的项目。如果您希望在同一项目中包含多个服务、 作业或工作器池,则需要使用 Skaffold 配置文件 在您的
skaffold.yaml配置文件中。region_name是将在其中创建服务、作业或工作器池的区域。 您的服务、作业或工作器池可以位于 Cloud Run 支持的任何 区域中。
以下是示例目标配置,用于定义要创建的 Cloud Run 服务、作业或工作器池:
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: dev
description: development service
run:
location: projects/my-app/locations/us-central1
您可以在 Cloud Deploy 交付流水线定义中定义此目标,也可以单独定义。无论哪种方式,您都必须 先注册目标 ,然后才能创建版本以部署 Cloud Run 服务、 作业或工作器池。
创建 Skaffold 配置
以下是 Cloud Run 部署的 示例 skaffold.yaml 文件:
apiVersion: skaffold/v4beta7
kind: Config
metadata:
name: cloud-run-application
manifests:
rawYaml:
- service.yaml
deploy:
cloudrun: {}
在此 skaffold.yaml 文件中…
manifests.rawYaml提供了 Cloud Run 服务定义的名称。在此示例中,
service.yaml是定义 Skaffold 将部署的 Cloud Run 服务的文件。此文件名可以是任何名称,但按照惯例,对于服务,它是service.yaml;对于作业,它是job.yaml;对于工作器池,它是workerpool.yaml。deploy节指定了您希望如何部署清单,具体而言,是项目和位置。deploy是必需的。我们建议您保留空
{}。Cloud Deploy 会在渲染期间根据目标定义中的项目和位置填充此内容。不过,对于本地开发,您可以在此处提供值。但是,无论此处是否提供值,Cloud Deploy 始终使用目标定义中的项目和位置。
创建 Cloud Run 服务定义
如需创建 Cloud Run 服务定义,您可以手动创建一个,也可以从现有服务复制一个。本部分将介绍这两种方法。
方法 1:创建新的 Cloud Run service.yaml
service.yaml 定义了 Cloud Run 服务。创建版本时,Skaffold 会使用此定义来部署服务。
下面是一个简化示例:
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: [SERVICE_NAME]
spec:
template:
spec:
containers:
- image: [IMAGE_PATH]
其中:
[SERVICE_NAME]是此 Cloud Run 服务的名称。[IMAGE_PATH]指向您要使用此服务部署的一个或多个容器映像。
方法 2:使用 Google Cloud 控制台从现有服务复制 service.yaml
您可以使用 Google Cloud 控制台创建服务或使用现有服务,
然后从该服务复制 service.yaml。
如需使用 Google Cloud CLI 获取 service.yaml,请执行以下操作:
gcloud run services describe [service_name] --format=export
如需从 Google Cloud 控制台获取 service.yaml,请执行以下操作:
在 Google Cloud 控制台中,前往 Cloud Run 服务 页面。
选择要使用其定义的现有服务。
或者,您可以创建一个新服务,然后选择该服务。选择服务后,系统会显示“服务详情”页面:

选择 YAML 标签页。
点击修改,然后将 YAML 的内容复制到文件系统中的一个名为
service.yaml的新文件中,以便 Skaffold 在您 创建版本时可以使用该文件。
创建 Cloud Run 作业定义
如需部署 Cloud Run 作业定义,您可以手动创建一个,也可以从现有作业复制一个。本部分将介绍这两种方法。
请注意,作业不一定会在 Cloud Deploy 部署后运行。这与服务不同,服务在部署后会运行应用。作业的调用方式取决于作业本身。
方法 1:创建新的 Cloud Run job.yaml
job.yaml 定义了您的 Cloud Run 作业。创建版本时,Skaffold 会使用此定义来部署作业。
下面是一个简化示例:
apiVersion: run.googleapis.com/v1
kind: Job
metadata:
name: [JOB_NAME]
spec:
template:
spec:
containers:
- image: [IMAGE_PATH]
其中:
[JOB_NAME]是此 Cloud Run 作业的名称。[IMAGE_PATH]指向您要为此作业部署的容器映像。
方法 2:使用 Google Cloud 控制台从现有作业复制 job.yaml
您可以使用控制台创建作业或使用现有作业,然后从该作业复制 job.yaml。 Google Cloud
如需使用 Google Cloud CLI 获取 job.yaml,请执行以下操作:
gcloud run jobs describe [job_name] --format=export
如需从 Google Cloud 控制台获取 job.yaml,请执行以下操作:
在 Google Cloud 控制台中,前往 Cloud Run 作业 页面。
选择要使用其定义的现有作业。
或者,您可以创建一个新作业,然后选择该作业。选择作业后,系统会显示“作业详情”页面:

选择 YAML 标签页。
点击修改,然后将 YAML 的内容复制到文件系统中的一个名为
job.yaml的新文件中,以便 Skaffold 在您 创建版本时可以使用该文件。
创建 Cloud Run 工作器池定义(预览版)
如需部署 Cloud Run 工作器池定义,您可以手动创建一个,也可以从现有工作器池复制一个。本部分将介绍这两种方法。
方法 1:创建新的 Cloud Run workerpool.yaml
workerpool.yaml 定义了您的 Cloud Run 工作器池。创建版本时,Skaffold 会使用此定义来部署工作器池。
下面是一个简化示例:
apiVersion: run.googleapis.com/v1
kind: WorkerPool
metadata:
name: [WORKERPOOL_NAME]
annotations:
run.googleapis.com/launch-stage: BETA
spec:
template:
spec:
containers:
- image: [IMAGE_PATH]
其中:
[WORKERPOOL_NAME]是此 Cloud Run 工作器池的名称。[IMAGE_PATH]指向您要为此工作器池部署的容器映像。
方法 2:使用 Google Cloud 控制台从现有工作器池复制 workerpool.yaml
您可以使用控制台创建工作器池或使用现有工作器池,
然后从该工作器池复制 workerpool.yaml。 Google Cloud
如需使用 Google Cloud CLI 获取 workerpool.yaml,请执行以下操作:
gcloud beta run worker-pools describe [workerpool_name] --format=export
如需从 Google Cloud 控制台获取 workerpool.yaml,请执行以下操作:
在 Google Cloud 控制台中,前往 Cloud Run 工作器池 页面。
选择要使用其定义的现有工作器池。
或者,您可以创建一个新工作器池,然后选择该工作器池。选择工作器池后,系统会显示“工作器池详情”页面:

选择 YAML 标签页。
将 YAML 的内容复制到文件系统中的一个名为
workerpool.yaml的新文件中,以便 Skaffold 在您 创建版本时可以使用该文件。
综合应用
现在,您已经拥有 Cloud Run 服务、作业或工作器池定义、您的
skaffold.yaml配置和 Cloud Deploy 目标
定义,并且已将目标
注册为 Cloud Deploy 资源,现在可以
调用交付流水线
来创建版本,并按照流水线中定义的目标进展顺序推进版本。
快速入门 使用 Cloud Deploy 将应用部署到 Cloud Run 展示了所有这些操作。
服务在不同修订版本中的行为
重新部署服务时,新修订版本基于新部署的 service.yaml。除非新部署的 YAML 中也包含之前的修订版本,否则系统不会保留之前的修订版本。例如,如果之前的修订版本中包含新 YAML 中没有的配置设置或标签,则新修订版本中将缺少这些设置或标签。
触发 Cloud Run 作业
部署作业后,您可以按照 Cloud Run 文档中的说明触发该作业。
在多个项目中部署 Cloud Run 服务、作业和工作器池
如果您需要部署位于不同项目中的服务、作业或工作器池,则您的 执行服务账号需要有权访问定义这些服务、作业或工作器池的项目。
如需了解详情,请参阅 Cloud Deploy 执行服务账号 以及 Identity and Access Management 角色和权限 。
部署 Cloud Run 函数
Cloud Run 函数会在每次部署函数时构建源代码。 因此,流水线中的每个目标运行时可能会获得略有不同的工件。这与 Cloud Deploy 中的最佳实践相反。我们建议您改用 Cloud Run 服务。这样,您就可以构建单个工件并在各个环境中推广该工件。
签入 Cloud Run 函数的
service.yaml。您可以通过运行以下命令获取此文件:
gcloud run services describe FUNCTION_NAME \ --format=export \ --region=REGION \ --project=PROJECT移除以下注解(如果存在):
run.googleapis.com/build-base-imagerun.googleapis.com/build-namerun.googleapis.com/build-source-locationrun.googleapis.com/build-enable-automatic-updates
将
spec.spec.containers.image中的值替换为IMAGE_TAG。创建 您的 交付流水线和目标, 并将 Cloud Run 服务作为目标。
在 CI 流程中将构建步骤与部署步骤分开。不要使用 Google Cloud CLI 部署函数,而是替换为以下步骤:
使用 Cloud Build 将函数 构建到容器中:
gcloud builds submit --pack image=REGION-docker.pkg.dev/PROJECT/cloud-run-source-deploy/IMAGE_NAME \ --project=PROJECT \ --region=REGION使用 Cloud Deploy 创建版本:
gcloud deploy releases create RELEASE_NAME \ --project=DEPLOY_PROJECT \ --region=REGION \ --delivery-pipeline=DELIVERY_PIPELINE \ --images=IMAGE_TAG=REGION-docker.pkg.dev/PROJECT/cloud-run-source-deploy/IMAGE_NAME在此命令中…
RELEASE_NAME是为此版本指定的名称。该名称在此交付流水线的所有版本中必须是唯一的。DEPLOY_PROJECT是您在其中创建部署流水线的项目的项目 ID。DELIVERY_PIPELINE是交付流水线的名称,该流水线将在目标的进展过程中管理此版本的部署。此名称必须与name字段匹配流水线定义。REGION是您在其中创建版本的区域的名称,例如us-central1。这是必填项。IMAGE_NAME是您在上一步构建函数时为映像指定的名称。
后续步骤
详细了解 如何配置 Cloud Deploy 目标
了解 Cloud Deploy 执行环境。
详细了解 Cloud Run