Cloud Run 是一个托管式计算平台,可让您直接在 Google 可伸缩的基础架构之上运行容器。
如果您可以构建使用任何编程语言编写的代码的容器映像,则可以在 Cloud Run 上部署该代码。实际上,构建容器映像是可选操作。如果您使用的是 Go、Node.js、Python、Java、.NET Core、Ruby 或支持的框架,则可以使用基于来源的部署选项,它会按照您所用语言的最佳实践构建容器。
Google 构建了可与 Google Cloud上的其他服务完美搭配使用的 Cloud Run,以便您可以构建功能齐全的应用。
简而言之,借助 Cloud Run,开发者可以将主要精力集中在编写代码上,而不是耗费在 Cloud Run 服务的运维、配置和扩缩上。您无需创建集群或管理基础设施即可高效使用 Cloud Run。
服务、作业和工作器池:运行代码的三种方式
在 Cloud Run 上,代码可以作为服务、作业或工作器池运行。所有这些资源类型都在同一环境中运行,并且可以使用与 Google Cloud上的其他服务相同的集成。
下表概要介绍了每种 Cloud Run 资源类型提供的选项。
资源 | 说明 |
---|---|
服务 | 使用根据各种关键指标自动扩缩的无状态临时实例来响应发送到唯一且稳定的端点的 HTTP 请求,还会响应各种事件和函数。 |
作业 | 处理非基于请求的可并行化任务,这些任务会手动执行或按计划执行,且运行到完成。 |
工作器池 | 处理非基于请求的工作负载,例如基于拉取的工作负载(如 Kafka 使用方、Pub/Sub 拉取队列或 RabbitMQ 使用方)。 |
Cloud Run 服务
Cloud Run 服务可为您提供运行可靠 HTTPS 端点所需的基础架构。您负责确保代码侦听 TCP 端口并处理 HTTP 请求。
下图展示了一项 Cloud Run 服务,它运行多个容器实例,以使用 HTTPS 端点处理来自客户端的 Web 请求和事件。
标准服务包括以下功能:
- 每个服务的唯一 HTTPS 端点
- 每项 Cloud Run 服务在
*.run.app
网域的唯一子网域上都有一个 HTTPS 端点,您也可以配置自定义网域。Cloud Run 会为您管理传输层安全协议 (TLS),并且支持 WebSocket、HTTP/2(端到端)和 gRPC(端到端)。 - 基于请求的快速自动扩缩
- Cloud Run 会快速扩容以处理所有传入请求,或者处理请求之外增加的 CPU 利用率(如果结算设置设为基于实例的结算方式)。服务可以快速横向扩容到一千个实例甚至更多(如果您申请增加配额的话)。如果需求减少,Cloud Run 会移除空闲容器。如果您担心费用或下游系统过载,可以限制实例数上限。
- 可选的手动扩缩
- 默认情况下,Cloud Run 会自动扩容到更多实例以处理更多流量,但您可以使用手动扩缩来控制扩缩行为,从而替换此行为。
- 内置流量管理
为降低部署新修订版本的风险,Cloud Run 支持执行逐步推出,包括将传入流量路由到最新修订版本、回滚到以前的修订版本,以及同时将流量拆分到多个修订版本。
例如,您可以先从向新的修订版本发送 1% 的请求开始,在监控遥测时提高此百分比。
- 公共服务和专用服务
您可以从互联网访问 Cloud Run 服务,也可以通过以下方式限制访问权限:
- 使用 Cloud IAM 指定访问权限政策。
- 使用入站流量设置限制网络访问权限。如果您希望仅允许来自 VPC 和内部服务的内部流量,则此方式非常有用。
- 仅允许使用 Identity-Aware Proxy (IAP) 进行身份验证的用户。
您可以将内容分发网络 (CDN)(例如 Firebase Hosting 和 Cloud CDN)作为 Cloud Run 服务的前端,从更靠近客户端的边缘位置传送可缓存资源。
缩减至零和实例数下限
默认情况下,如果结算设置为基于实例的结算方式,Cloud Run 会自动添加和移除实例,以处理所有传入请求或处理请求之外增加的 CPU 利用率。
如果您的服务没有传入请求,则甚至会移除剩下的最后一个实例。此行为通常称为“缩减至零”。 然后,如果在请求传入时没有活跃实例,Cloud Run 会创建一个新实例。这会增加第一批此类请求的响应时间,具体取决于容器准备好处理请求的速度。
如需更改此行为,请使用以下方法之一:
按服务用量计费
出于经济原因,缩减至零非常适合,因为您需要为分配给实例的 CPU 和内存付费,粒度为 100 毫秒。如果您未配置实例数下限,则您无需在未使用服务时付费。 我们提供了宽裕的免费层级。如需了解详情,请参阅价格。
您可以启用以下两种结算设置:
- 基于请求
- 如果实例未处理请求,您无需付费。您需要按请求付费。
- 基于实例
- 您需要为实例的整个生命周期付费。无需按请求付费。
我们提供了宽裕的免费层级。如需了解详情,请参阅价格;如需了解如何为服务启用基于请求或基于实例的结算方式,请参阅结算设置。
临时性容器文件系统
Cloud Run 上的实例是一次性的。每个容器都有一个内存中的可写文件系统叠加层,如果容器关闭,该叠加层不会保留。Cloud Run 会确定何时停止向实例发送请求并关停实例(例如在缩容时)。
如需在 Cloud Run 即将关停实例时收到警告,您的应用可以捕获 SIGTERM
信号。这样,代码可以 flush 本地缓冲区并将本地数据保留到外部数据存储区中。
如需永久保留文件,请与 Cloud Storage 集成或装载网络文件系统 (NFS)。
何时使用 Cloud Run 服务
对于处理请求、事件或函数的代码,Cloud Run 服务非常适合。示例使用场景包括:
- 网站和 Web 应用
- 使用您自己偏爱的栈构建 Web 应用,访问 SQL 数据库,并呈现动态 HTML 页面。
- API 和微服务
- 您可以构建 REST API、GraphQL API 或是通过 HTTP 或 gRPC 进行通信的专用微服务。
- 流式数据处理
- Cloud Run 服务可以接收来自 Pub/Sub 推送订阅的消息和来自 Eventarc 的事件。
- 异步工作负载
- Cloud Run 函数可以响应异步事件,例如关于 Pub/Sub 主题的消息、Cloud Storage 存储桶变更或者 Firebase 事件。
- AI 推理
- 无论是否配置 GPU,Cloud Run 服务都可以托管推理模型和模型训练等 AI 工作负载。
Cloud Run 作业
如果您的代码执行操作,然后停止(例如使用脚本),则您可以使用 Cloud Run 作业运行代码。如需从命令行执行作业,您可以使用 Google Cloud CLI、安排周期性作业或在工作流中运行作业。
数组作业是运行作业的更快捷方式
作业可以启动单个实例来运行代码,这是运行脚本或工具的常用方法。
不过,您也可以使用数组作业,从而并行启动多个相同的独立实例。数组作业是一种处理可拆分为多个独立任务的作业的更快捷方式。
下图显示了包含 7 个任务的作业按顺序运行所需的时间如何比 4 个实例并行可以处理独立任务时所需的时间更长:
例如,如果您要对 Cloud Storage 中的 1,000 张图片进行大小调整和剪裁,则顺序处理这些图片的速度会比使用多个实例并行处理这些图片(由 Cloud Run 管理自动扩缩)的速度要慢。
何时使用 Cloud Run 作业
Cloud Run 作业非常适合运行运行执行操作(作业)并在操作完成时退出的代码。以下是几个例子:
- 脚本或工具
- 运行脚本以执行数据库迁移或其他操作任务。
- 数组作业
- 对 Cloud Storage 存储桶中的所有文件执行高度并行化处理。
- 预定作业
- 定期创建和发送账单,或将数据库查询的结果保存为 XML 文件,并每隔几小时上传一次该文件。
- AI 工作负载
- 无论是否配置 GPU,Cloud Run 作业都可以托管批量推理、模型微调和模型训练等 AI 工作负载。
Google Cloud 集成
Cloud Run 可与更广泛的 Google Cloud生态系统集成,让您能够构建功能齐全的应用。
基本集成包括:
- 数据存储
- Cloud Run 集成了 Cloud SQL(代管式 MySQL、PostgreSQL 和 SQL Server)、Memorystore(代管式 Redis 和 Memcached)、Firestore、Spanner、Cloud Storage 等。如需查看完整列表,请参阅数据存储区。
- 日志记录和错误报告
- Cloud Logging 会自动注入容器日志。如果日志中存在异常,则 Error Reporting 会汇总异常,然后通知您。以下语言受支持:Go、Java、Node.js、PHP、Python、Ruby 和 .NET。
- 服务身份
- 每个 Cloud Run 修订版本都与一个服务账号相关联,并且 Google Cloud 客户端库会以透明的方式使用此服务账号向 Google Cloud API 进行身份验证。
- 持续交付
- 如果您将源代码存储在 GitHub、Bitbucket 或 Cloud Source Repositories 中,则可以将 Cloud Run 配置为自动部署新的提交。
- 专用网络
- Cloud Run 实例可以通过无服务器 VPC 访问通道连接器访问虚拟私有云网络中的资源。这是您的服务与 Compute Engine 虚拟机或基于 Compute Engine 的产品(例如 Google Kubernetes Engine 或 Memorystore)连接的方式。
- Google Cloud API
- 服务的代码以透明方式向 Google Cloud API 进行身份验证。这包括 AI 和机器学习 API,例如 Cloud Vision API、Speech-to-Text API、AutoML Natural Language API、Cloud Translation API 等。
- 后台任务
- 您可以将代码安排在稍后运行或返回 Web 请求后立即运行,Cloud Run 可与 Cloud Tasks 完美配合,从而提供可伸缩且可靠的异步执行功能。
如需查看可与 Cloud Run 完美配合使用的众多 Google Cloud 服务的列表,请参阅连接到 Google Cloud 服务。
代码必须封装在容器映像中
为了让您的服务、作业或工作器池能够部署到 Cloud Run,您必须将其封装在容器映像中。如果您对容器不熟悉,请参阅下面简要的概念性简介。
如图所示,您可以使用源代码、资源和库依赖项来构建容器映像,该映像是一个软件包,其中包含服务运行所需的所有内容。它包括构建工件、资源、系统软件包和(可选)运行时。这使容器化应用本质上具有可移植性,即在容器可以运行的任何位置运行。构建工件的示例包括已编译的二进制文件或脚本文件,运行时的示例包括 Node.js JavaScript 运行时或 Java 虚拟机 (JVM)。
高级从业人员很重视 Cloud Run 不会给其代码运行带来额外负担这一事实:您可以在 Cloud Run 上运行任何二进制文件。
如果您希望获得更多便利或希望将应用容器化委托给 Google,Cloud Run 可与开源 Google Cloud 的 buildpack 集成,从而提供基于源代码的部署。