部署到 Cloud Run

本页面介绍如何将容器映像部署到新的 Cloud Run 服务或现有 Cloud Run 服务的新修订版本。

如需查看部署新服务的示例演示,请参阅部署示例容器快速入门

前期准备

如果您通过网域限制组织政策来限制项目的未经身份验证的调用,则您需要按照测试专用服务中的说明访问已部署的服务。

部署所需的权限

您必须拥有下列角色之一:

  • 所有者
  • 编辑者
  • Cloud Run Admin 和 Service Account User 角色
  • 包含此特定权限列表的任何自定义角色。

支持的容器存储库和映像

您可以使用已存储在 Artifact RegistryContainer Registry已弃用)或 Docker Hub 中的容器映像。Google 建议使用 Artifact Registry。

您只能使用以下类型的容器映像:

您应仅考虑使用 Docker Hub 部署常用的容器映像,例如 Docker 官方映像Docker 赞助的 OSS 映像。为了获得更高的可用性,Google 建议您通过 Artifact Registry 远程制品库部署这些 Docker Hub 映像。

如果您将容器映像存储在其他类型的 Container Registry 中,请按照从不支持的注册表部署映像中的说明进行操作。

部署新的服务

您可以使用标记(例如 us-docker.pkg.dev/my-project/container/my-image:latest)或确切摘要(例如 us-docker.pkg.dev/my-project/container/my-image@sha256:41f34ab970ee...)指定容器映像。

首次部署到服务时会创建第一个修订版本。请注意,修订版本是不可变的。如果使用容器映像标记进行部署,则该标记会被解析为摘要,并且修订版本将始终提供此特定摘要。

您可以使用 Google Cloud 控制台、gcloud 命令行或 YAML 配置文件部署容器。

点击相应标签页即可获取有关所选工具的使用说明。

控制台

要部署容器映像,请执行以下操作:

  1. 转到 Cloud Run

  2. 点击创建服务,以显示“创建服务”表单。

    1. 在该表单中选择部署选项:

      1. 如果您要手动部署容器,请选择从现有容器映像部署一个修订版本并指定容器映像。

      2. 如果要自动进行持续部署,请选择“从源代码库中持续部署新修订版本”并按照持续部署的说明进行操作。

    2. 输入所需的服务名称。服务名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。服务名称一旦指定便无法更改,并且公开显示。

    3. 选择您想要使用的服务区域。 区域选择器会显示价格层级网域映射的可用性,并突出显示碳影响最低的区域。

    4. 根据需要设置 CPU 分配和价格

    5. 在“自动扩缩”下,指定最小最大实例数。

    6. 根据需要设定表单中的 Ingress 设置。

    7. “身份验证”下,配置以下内容:

      • 如果您要创建公共 API 或网站,请选择允许未通过身份验证的调用。选中此复选框后,系统会将 IAM Invoker 角色分配给特殊标识符 allUser。您可以在创建服务后使用 IAM 修改此设置
      • 如果您需要通过身份验证加以保护的安全服务,请选择需要身份验证
  3. 点击容器、卷、网络、安全性以在相应的标签页中设置其他可选设置:

  4. 完成服务配置后,请点击创建以将映像部署到 Cloud Run,然后等待部署完成。

  5. 点击显示的网址链接,以打开已部署服务的唯一、稳定的端点。

命令行

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 要部署容器映像,请执行以下操作:

    1. 运行以下命令:

      gcloud run deploy SERVICE --image IMAGE_URL

      • SERVICE 替换为要部署到的服务的名称。服务名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。如果服务尚不存在,则此命令会在部署期间创建服务。您可以完全省略此参数,但如果省略它,系统将提示您输入服务名称。
      • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,则必须已经创建制品库 REPO_NAME。网址格式为 REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG。请注意,如果您未提供 --image 标志,则部署命令将尝试从源代码进行部署

      如果您要创建公共 API 或网站,则使用 --allow-unauthenticated 标志来允许在未通过身份验证的情况下调用服务。此操作会Cloud Run Invoker IAM 角色分配给 allUsers。您还可以指定 --no-allow-unauthenticated 以禁止在未通过身份验证的情况下调用。如果您省略其中任一标志,则系统会在 deploy 命令运行时提示您确认。

    2. 等待部署完成。成功完成后,系统将显示一条成功消息以及已部署服务的网址。

    请注意,如需将映像部署到其他位置,而不部署到通过 run/region gcloud 属性设置的位置,请使用以下命令:

    • gcloud run deploy SERVICE --region REGION

YAML

您可以将服务规范存储在 YAML 文件中,然后使用 gcloud CLI 进行部署。

  1. 创建包含以下内容的新 service.yaml 文件:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          containers:
          - image: IMAGE

    替换

    • SERVICE 替换为您的 Cloud Run 服务的名称。 服务名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。
    • IMAGE 替换为容器映像的网址。

    您还可以指定更多配置,例如环境变量或内存限制。

  2. 使用以下命令部署新服务:

    gcloud run services replace service.yaml
  3. (可选)如果您想允许对服务进行未经身份验证的访问,请将服务设为公开

Cloud Code

如需使用 Cloud Code 进行部署,请阅读 IntelliJVisual Studio Code 指南。

Terraform

如果您使用 Terraform,则使用来自 Google Cloud Platform 提供程序google_cloud_run_v2_service 资源在 Terraform 配置中定义服务。

  1. 使用以下内容创建新的 main.tf 文件:

    provider "google" {
      project = "PROJECT-ID"
    }
    
    resource "google_cloud_run_v2_service" "default" {
      name     = "SERVICE"
      location = "REGION"
      client   = "terraform"
    
      template {
        containers {
          image = "IMAGE"
        }
      }
    }
    
    resource "google_cloud_run_v2_service_iam_member" "noauth" {
      location = google_cloud_run_v2_service.default.location
      name     = google_cloud_run_v2_service.default.name
      role     = "roles/run.invoker"
      member   = "allUsers"
    }
    

    注意替换如下内容:

    • PROJECT-ID 替换为 Google Cloud 项目 ID
    • REGION 替换为 Google Cloud 区域
    • SERVICE 替换为您的 Cloud Run 服务的名称。 服务名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。
    • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG

    此配置允许公共访问(相当于 --allow-unauthenticated)。如需将该服务设为不公开,请移除 google_cloud_run_v2_service_iam_member 节。

  2. 初始化 Terraform:

    terraform init
  3. 应用 Terraform 配置:

    terraform apply

    输入 yes,确认您要应用所述操作。

客户端库

通过以下代码创建新服务:

Cloud Run 位置

Cloud Run 是区域级的,这意味着运行 Cloud Run 服务的基础架构位于特定区域,并且由 Google 代管,以便在该区域内的所有可用区以冗余方式提供。

选择用于运行 Cloud Run 服务的区域时,主要考虑该区域能否满足您的延迟时间、可用性或耐用性要求。通常,您可以选择距离用户最近的区域,但除此之外,您还应该考虑 Cloud Run 服务使用的其他 Google Cloud 产品的位置。跨多个位置使用 Google Cloud 产品可能会影响服务的延迟时间和费用。

Cloud Run 可在以下区域使用:

基于层级 1 价格

基于层级 2 价格

  • africa-south1(约翰内斯堡)
  • asia-east2(香港)
  • asia-northeast3(韩国首尔)
  • asia-southeast1(新加坡)
  • asia-southeast2 (雅加达)
  • asia-south1(印度孟买)
  • asia-south2(印度德里)
  • australia-southeast1(悉尼)
  • australia-southeast2(墨尔本)
  • europe-central2(波兰,华沙)
  • europe-west10(柏林)
  • europe-west12(都灵)
  • europe-west2(英国伦敦) 叶形图标 二氧化碳排放量低
  • europe-west3(德国法兰克福) 叶形图标 二氧化碳排放量低
  • europe-west6(瑞士苏黎世) 叶形图标 二氧化碳排放量低
  • me-central1(多哈)
  • me-central2(达曼)
  • northamerica-northeast1(蒙特利尔) 叶形图标 二氧化碳排放量低
  • northamerica-northeast2(多伦多) 叶形图标 二氧化碳排放量低
  • southamerica-east1(巴西圣保罗) 叶形图标 二氧化碳排放量低
  • southamerica-west1(智利圣地亚哥) 叶形图标 二氧化碳排放量低
  • us-west2(洛杉矶)
  • us-west3(盐湖城)
  • us-west4(拉斯维加斯)

如果您已创建 Cloud Run 服务,则可以在 Google Cloud 控制台中的 Cloud Run 信息中心内查看区域。

部署时,Cloud Run 服务代理需要能够访问已部署的容器(默认情况)。

每项服务都有一个唯一的永久性网址,该网址在您向其部署新修订版本时不会随着时间改变。

部署现有服务的新修订版本

您可以使用 Google Cloud 控制台、gcloud 命令行或 YAML 配置文件部署新的修订版本。

请注意,更改任何配置设置都会导致新修订版本的创建,即使容器映像没有变化也是如此。创建的每个修订版本都是不可变的。

点击相应标签页即可获取有关所选工具的使用说明。

控制台

要部署现有服务的新修订版本,请执行以下操作:

  1. 转到 Cloud Run

  2. 在服务列表中找到要更新的服务,然后点击以打开其详细信息。

  3. 点击修改和部署新的修订版本以显示修订版本部署表单。

    1. 如果需要,请提供要部署的新容器映像的网址。

    2. 根据需要配置容器

    3. 根据需要设置 CPU 分配和价格

    4. 在“容量”下,指定内存上限CPU 上限

    5. 根据需要指定请求超时并发

    6. 根据需要指定执行环境

    7. 在“自动扩缩”下,指定最小最大实例数。

    8. 根据需要,使用其他标签页选择性地配置:

  4. 如需将所有流量都发送到新修订版本,请选择立即支持此修订版本。要逐步发布新的修订版本,请清除该复选框。这样在部署中,系统将不会向新修订版本发送任何流量。部署后,按照逐步发布的说明进行操作。

  5. 点击部署并等待部署完成。

命令行

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 要部署容器映像,请执行以下操作:

    1. 运行以下命令:

      gcloud run deploy SERVICE --image IMAGE_URL

      • SERVICE 替换为要部署到的服务的名称。您可以完全省略此参数,但如果省略它,系统将提示您输入服务名称。
      • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG

      系统会自动为新修订版本分配后缀。如果您要提供自己的修订版本后缀,请使用 gcloud CLI 参数 --revision-suffix

    2. 等待部署完成。成功完成后,系统将显示一条成功消息以及已部署服务的网址。

YAML

如果您需要下载或查看现有服务的配置,请使用以下命令将结果保存到 YAML 文件:

gcloud run services describe SERVICE --format export > service.yaml

在服务配置 YAML 文件中,根据需要修改任何 spec.template 子属性以更新修订版本设置,然后部署新修订版本:

gcloud run services replace service.yaml

Cloud Code

如需使用 Cloud Code 部署现有服务的新修订版本,请阅读 IntelliJVisual Studio Code 指南。

Terraform

确保您已按照部署新服务示例中的说明设置了 Terraform。

  1. 更改配置文件。

  2. 应用 Terraform 配置:

    terraform apply

    输入 yes,确认您要应用所述操作。

客户端库

如需通过代码部署新的修订版本,请使用以下客户端库:

Cloud Run 位置

Cloud Run 是区域级的,这意味着运行 Cloud Run 服务的基础架构位于特定区域,并且由 Google 代管,以便在该区域内的所有可用区以冗余方式提供。

选择用于运行 Cloud Run 服务的区域时,主要考虑该区域能否满足您的延迟时间、可用性或耐用性要求。通常,您可以选择距离用户最近的区域,但除此之外,您还应该考虑 Cloud Run 服务使用的其他 Google Cloud 产品的位置。跨多个位置使用 Google Cloud 产品可能会影响服务的延迟时间和费用。

Cloud Run 可在以下区域使用:

基于层级 1 价格

基于层级 2 价格

  • africa-south1(约翰内斯堡)
  • asia-east2(香港)
  • asia-northeast3(韩国首尔)
  • asia-southeast1(新加坡)
  • asia-southeast2 (雅加达)
  • asia-south1(印度孟买)
  • asia-south2(印度德里)
  • australia-southeast1(悉尼)
  • australia-southeast2(墨尔本)
  • europe-central2(波兰,华沙)
  • europe-west10(柏林)
  • europe-west12(都灵)
  • europe-west2(英国伦敦) 叶形图标 二氧化碳排放量低
  • europe-west3(德国法兰克福) 叶形图标 二氧化碳排放量低
  • europe-west6(瑞士苏黎世) 叶形图标 二氧化碳排放量低
  • me-central1(多哈)
  • me-central2(达曼)
  • northamerica-northeast1(蒙特利尔) 叶形图标 二氧化碳排放量低
  • northamerica-northeast2(多伦多) 叶形图标 二氧化碳排放量低
  • southamerica-east1(巴西圣保罗) 叶形图标 二氧化碳排放量低
  • southamerica-west1(智利圣地亚哥) 叶形图标 二氧化碳排放量低
  • us-west2(洛杉矶)
  • us-west3(盐湖城)
  • us-west4(拉斯维加斯)

如果您已创建 Cloud Run 服务,则可以在 Google Cloud 控制台中的 Cloud Run 信息中心内查看区域。

从其他 Google Cloud 项目中部署映像

如果您设置了正确的 IAM 权限,则可以从其他 Google Cloud 项目中部署容器映像:

  1. 在 Google Cloud 控制台中,打开 Cloud Run 服务对应的项目。

    进入 IAM 页面

  2. 选择包括 Google 提供的角色授权

  3. 复制 Cloud Run 服务代理的电子邮件。该电子邮件的后缀为 @serverless-robot-prod.iam.gserviceaccount.com

  4. 打开您要使用的容器注册表所属的项目。

    进入 IAM 页面

  5. 点击添加以添加新的主账号。

  6. 新的主账号字段中,粘贴您之前复制的服务账号的电子邮件地址。

  7. “选择角色”下拉菜单中,如果您使用的是 Container Registry,请选择 Storage -> Storage Object Viewer 角色。如果您使用的是 Artifact Registry,请选择 Artifact Registry -> Artifact Registry Reader 角色。

  8. 将容器映像部署到您的 Cloud Run 服务所属的项目。

从不支持的注册表部署映像

如果您将容器映像存储在不受支持的公共或私有容器注册表中,请使用 docker push 暂时将它们推送到 Artifact Registry,以便将它们部署到 Cloud Run。容器映像在部署时由 Cloud Run 导入,因此在部署后,您可以从 Artifact Registry 删除映像

将多个容器部署到服务 (Sidecar)

在具有 Sidecar 的 Cloud Run 部署中,有一个入站流量容器来处理您指定的容器 PORT 中的所有传入 HTTPS 请求,并且还有一个或多个 Sidecar容器。Sidecar 无法监听入站流量容器端口中的传入 HTTP 请求,但可以使用 localhost 端口相互通信以及与入站流量容器通信。使用的 localhost 端口因使用的容器而异。

在下图中,入站流量容器使用 localhost:5000 与 Sidecar 通信。

Cloud Run 多容器

每个实例最多可以部署 10 个容器,包括 Ingress 容器。实例中的所有容器共用同一网络命名空间,并且可以使用内存中共享卷来共享文件,如图所示。

您可以在第一代或第二代执行环境中部署多个容器。

使用场景

Cloud Run 服务中 Sidecar 的应用场景包括:

  • 应用监控、日志记录和跟踪
  • 在应用容器前面使用 Nginx、Envoy 或 Apache2 作为代理
  • 添加身份验证和授权过滤器(例如 Open Policy Agent)
  • 运行出站连接代理,例如 Alloy DB Auth 代理

使用 Sidecar 容器部署服务

您可以使用 Google Cloud 控制台、Google Cloud CLI 或 YAML 将多个 Sidecar 部署到 Cloud Run 服务。

控制台

  1. 转到 Cloud Run

    • 如需部署到现有服务,请在服务列表中找到服务,点击以打开它,然后点击修改和部署新修订版本以显示修订版本部署表单。
    • 如需部署到新服务,请点击创建服务
  2. 对于新服务,

    1. 提供服务名称和要部署的 Ingress 容器映像的网址。
    2. 点击容器、卷、网络、安全性
  3. 修改容器卡片中,根据需要配置 Ingress 容器。

  4. 点击添加容器,然后配置要添加的 Sidecar 容器与入站流量容器。如果 Sidecar 依赖于服务中的其他容器,请在容器启动顺序下拉菜单中指明。对您要部署的每个 Sidecar 容器重复此步骤。

  5. 如需将所有流量都发送到新修订版本,请选择立即支持此修订版本。对于逐步发布,请取消选中该复选框。这样在部署中,系统将不会向新修订版本发送任何流量。部署后,按照逐步发布的说明进行操作。

  6. 点击创建(对于新服务)或部署(对于现有服务),然后等待部署完成。

命令行

Google Cloud CLI 中的 container 参数为预览版。

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 如需将多个容器部署到服务,请运行以下命令:

    gcloud beta run deploy SERVICE \
     --container INGRESS_CONTAINER_NAME
     --image='INGRESS_IMAGE' \
     --port='CONTAINER_PORT' \
     --container SIDECAR_CONTAINER_NAME \
     --image='SIDECAR_IMAGE'
    • SERVICE 替换为要部署到的服务的名称。您可以完全省略此参数,但如果省略它,系统将提示您输入服务名称。
    • INGRESS_CONTAINER_NAME 替换为接收请求的容器的名称,例如 app
    • INGRESS_IMAGE 替换为对应接收请求的容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest
    • SIDECAR_CONTAINER_NAME 替换为 Sidecar 容器的名称,例如 sidecar
    • SIDECAR_IMAGE 替换为对 Sidecar 容器映像的引用

    如果要在部署命令中配置每个容器,请在 container 参数后面提供每个容器的配置,例如:

    gcloud beta run deploy SERVICE \
      --container CONTAINER_1_NAME
      --image='INGRESS_IMAGE' \
      --set-env-vars=KEY=VALUE \
      --port='CONTAINER_PORT' \
      --container SIDECAR_CONTAINER_NAME
      --image='SIDECAR_IMAGE' \
      --set-env-vars=KEY_N=VALUE_N
  3. 等待部署完成。成功完成后,系统将显示一条成功消息以及已部署服务的网址。

YAML

以下说明介绍了具有 Sidecar 的 Cloud Run 服务的基本 YAML 文件。创建一个名为 service.yaml 的文件,并将以下内容添加到其中:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations:
  name: SERVICE_NAME
spec:
  template:
    spec:
      containers:
      - image: INGRESS_IMAGE
        ports:
          - containerPort: CONTAINER_PORT
      - image: SIDECAR_IMAGE
      

替换

  • SERVICE 替换为您的 Cloud Run 服务的名称。 服务名称不得超过 49 个字符。
  • CONTAINER_PORT 替换为入站流量容器监听传入请求的端口。您必须指定端口。与单容器服务不同,对于包含 Sidecar 的服务,Ingress 容器没有默认端口。
  • INGRESS_IMAGE 替换为对应接收请求的容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest
  • SIDECAR_IMAGE 替换为对 Sidecar 容器映像的引用。您可以通过向 YAML 中的 containers 数组添加更多元素来指定多个 Sidecar。

更新 YAML 以添加入站流量容器和 Sidecar 容器后,使用以下命令部署到 Cloud Run:

gcloud run services replace service.yaml

具有 Sidecar 的部署提供的显著功能

如果在具有容器的部署中您的依赖项要求某些容器在其他容器之前启动,则可以在该部署中指定容器启动顺序

如果您的容器依赖于其他容器,则必须在部署中使用健康检查。如果您使用健康检查,Cloud Run 会遵循容器启动顺序并检查每个容器的健康状况,从而确保每个容器在 Cloud Run 按顺序启动下一个容器之前成功通过健康检查。如果您不使用健康检查,则健康状况良好的容器将会启动,即使其所依赖的容器未在运行也是如此。

单个实例中的多个容器可以访问共享的内存中卷,每个容器都可以使用您创建的装载点访问该卷。

后续步骤

部署新服务后,您可以执行以下操作:

您可以利用 Cloud Build 触发器来实现 Cloud Run 服务的自动构建和部署:

您还可以使用 Cloud Deploy 设置持续交付流水线,以将 Cloud Run 服务部署到多个环境中: