谷歌云服务:如何使用 Cloud Run 构建高可用性多区域服务

2026-05-10 15:14:1294 阅读量

由谷歌云代理商深圳云一(CloudAce)整理发布。

相关服务:德国服务器

您是否担心过应用程序会在最需要的时候宕机?Cloud Next 2025 大会的演讲“使用 Cloud Run 运行高可用性多区域服务”深入探讨了如何使用 Google Cloud 的无服务器容器平台Cloud Run构建高容错、可靠的应用程序。

谷歌专家 Shane Ouchi 和 Taylor Money 以及德国商业银行的 Seenuvasan Devasenan 揭开了 Cloud Run 内置弹性的面纱,并带您了解即将推出的 Cloud Run 功能“服务健康”的真实场景

了解 Cloud Run 的内置容错功能

在 Cloud Next 2025 的演讲中,Shane 首先讨论了 Cloud Run 通过自动扩缩、解耦的数据和控制平面以及 N+1 区域冗余实现的基准弹性。让我们从自动扩缩开始,逐一进行分析。

自动扩展以确保容量满足需求

Cloud Run 会根据传入的请求负载自动添加和移除实例,确保 Cloud Run 服务的容量满足需求。Shane 将此称为“超弹性” ,指的是 Cloud Run 快速添加容器实例的能力。快速自动扩缩可防止应用程序因服务器实例不足而无法处理所有请求。

注意:Cloud Run 允许您通过限制最大实例数来防止失控扩展。

分离的数据和控制平面提高了弹性

Cloud Run 中的控制平面是系统的一部分,负责管理操作,例如部署新版本、配置服务和管理基础架构资源。它与数据平面分离。数据平面负责接收传入的用户请求,将其路由到容器实例,并执行应用程序代码。由于数据平面独立于控制平面运行,因此控制平面中的问题通常不会影响正在运行的服务。

控制平面和数据平面均采用 N+1 冗余

Cloud Run 是一项区域性服务,默认情况下提供 N+1 区域冗余。这意味着,如果某个区域中的任何可用区发生故障,Cloud Run 基础架构在同一区域内拥有足够的故障转移容量(即“+1”)来继续服务所有工作负载。这将使您的应用程序免受可用区故障的影响。

容器探针提高可用性

如果您担心应用程序的可用性,则务必配置存活探测,以确保故障实例被关闭。您可以在 Cloud Run 上配置两种不同类型的容器实例健康检查。

  • 启动探测:确认新实例已成功启动并准备好接收请求

  • 活跃度探测:监控正在运行的实例是否保持健康并能够继续处理请求。此探测是可选的,但启用后,Cloud Run 可以自动移除故障实例

100%可用性是不现实的

有些应用程序至关重要,您希望它们始终可用。虽然 100% 的可用性不现实,但您可以尽可能地提高它们的容错能力。实现这一点取决于您的应用程序架构以及您使用的底层平台和服务。Cloud Run 拥有多项功能,可以提升其基础弹性,但您还可以采取更多措施来增强应用程序的弹性。 

超越区域冗余

由于 Cloud Run 是一项区域性服务,提供区域冗余,开发者必须积极构建其应用程序,使其能够抵御区域性中断。幸运的是,Cloud Run 已经支持多区域部署。具体工作原理如下:

  • 将 Cloud Run 服务部署到多个区域,每个区域使用相同的容器映像和配置。

  • 创建一个全局外部应用程序负载均衡器,每个 Cloud Run 服务具有一个后端和一个无服务器网络端点组 (NEG)。

  • 使用具有一个全局外部 IP 地址的单个入口点。

图表中的情况如下:

https://storage.googleapis.com/gweb-cloudblog-publish/images/multi_region_deployments_CR.max-1600x1600.png

如果您不熟悉,无服务器网络端点组 (NEG) 是一种指向 Cloud Run 服务或 App Engine 应用的负载均衡器后端配置资源。

构建区域冗余应用程序可能具有挑战性

虽然使用 Cloud Run 在多个区域进行部署非常简单,但挑战在于如何构建应用程序,使得单个区域服务可以发生故障而不会丢失数据或影响其他区域的服务。

数据冗余和复制很难做到完美。不过,现在有了Cloud Spanner 等多区域数据库以及Cloud SQL 中的跨区域副本功能,这或许已经不再像以前那么难了。

在这篇文章中,我不会深入探讨,但我建议阅读 Anna Berenberg 和 Brad Calder 撰写的这篇优秀论文:《云应用程序的部署原型》

自动区域故障转移的服务健康状况预览

如果您现在设置了多区域 Cloud Run 架构,则请求始终会被路由到距离它们最近的区域,但如果 Cloud Run 服务不可用,则请求不会自动路由出去,如下图所示: 

https://storage.googleapis.com/gweb-cloudblog-publish/images/without_CR_serviceheatlh.max-2000x2000.png

即将推出的功能“服务健康”添加了自动流量故障转移功能,当某个区域中的服务不可用时,可以将流量从一个区域转移到另一个区域:

https://storage.googleapis.com/gweb-cloudblog-publish/images/with_CR_servicehealth.max-2000x2000.png

启用服务健康

截至 2025 年 8 月,服务健康功能尚未公开发布(目前处于私人预览阶段),但我希望这种情况很快就会改变。需要注意的是,该功能在正式发布之前可能仍会发生变化。您可以填写此申请表来注册获取访问权限。

获得访问权限后,您可以通过两个步骤在多区域服务上启用服务运行状况: 

  • 向每个 Cloud Run 服务添加一个容器实例就绪探测。

  • 将每个 Cloud Run 服务上的最小实例数设置为 1。

这就是全部内容了。无需额外的负载均衡器配置。 

就绪探针即将登陆 Cloud Run

作为服务健康的一部分,Cloud Run 引入了就绪性探测。就绪性探测会通过 HTTP 定期检查每个容器实例。如果就绪性探测失败,Cloud Run 会停止将流量路由到该实例,直到探测再次成功。相反,如果活跃性探测失败,Cloud Run 会关闭不健康的实例。

服务运行状况使用服务中所有容器实例的聚合就绪状态来确定服务本身是否健康。如果大量容器发生故障,则会将该服务标记为不健康,并将流量路由到其他区域。

Cloud Next 2025 现场演示

在现场演示中,Taylor 将同一项服务部署到两个区域(一个近,一个远)。然后,他通过全局外部应用程序负载均衡器 (ALB) 发送请求。ALB 正确地将请求路由到最近区域的服务

在将最近的服务配置为每30秒在故障和健康之间切换后,他发现流量并未发生故障转移。这就是目前的行为——到目前为止,没有什么新奇之处。

演示的下一步是通过在每个服务上启用最小实例和就绪探测来启用服务健康。为了将配置更改部署到这两项服务,Taylor 在 Cloud Run gcloud 界面中使用了一个新标志:--regions中的标志gcloud run deploy。这是一种将相同的容器镜像和配置同时部署到多个区域的好方法。

就绪探测到位并设置了最小实例数后,服务健康状态开始检测到服务故障,并将流量转移到另一个区域的正常服务。我觉得这是一个很棒的演示!

本文地址:https://www.idc504.com/news/9_5917.html