本页面介绍了使用 Cloud Run 创建多租户架构来托管不受信任的代码的最佳实践。作为 Google Cloud 客户, “租户”是指您自己的客户之一,“不受信任的代码”是指这些租户提供的要在您的平台上运行的代码。
使用场景
此类架构的使用场景包括:
- 应用托管平台:您提供一个平台,供客户 部署其代码。例如,Web 托管平台(客户提供 Web 服务器) 或 函数即服务平台(客户提供函数)。
- 代理托管平台:您的客户使用 SDK 构建 AI 代理,您的 平台在后台运行这些代理。
- 微调模型平台:您提供按客户自定义 AI 模型的功能。然后,您的平台会利用 GPU 按需运行这些模型。
- 用户定义的函数:您的软件允许客户使用代码定义自定义 逻辑。例如,您提供了一个分析引擎,并希望允许客户编写自定义函数;或者您提供了一个 API 网关,并希望允许客户根据自己的自定义逻辑过滤或更改请求。
- 软件即服务 (SaaS) 可扩展性:您可能提供 SaaS,并 希望允许客户使用扩展程序扩展其功能。这些扩展程序可能由客户或合作伙伴编写。
Google Cloud 客户已成功在生产环境中使用 Cloud Run 来满足这些使用场景。
多租户平台的挑战
创建此类架构的典型挑战包括:
- 安全性:无法扫描或清理提供的代码。不受信任的代码可能包含恶意操作或易受攻击的依赖项。如果未正确隔离,不受信任的代码可能会访问属于其他租户的敏感数据。仅仅将代码打包到容器中并不是足够强大的安全边界。还需要通过应用最小权限原则来限制代码可以执行的操作。
- 成本效益:如果每个租户都为您的平台产生 固定费用,此类架构可能会变得非常昂贵。
- 租户管理:管理成百上千的租户可能具有 挑战性,尤其是在数据删除方面。
Cloud Run 的优势
基于 Cloud Run 的架构为常见挑战提供了一种解决方案,具有许多优势,例如安全性、成本效益和租户管理。
安全
Cloud Run 提供与此架构相关的开箱即用安全功能:
- 计算隔离:Cloud Run 可确保容器 实例之间严格隔离,无论是同一服务的容器实例,还是来自不同项目的不同服务的容器 实例。如需详细了解容器安全和执行环境,请参阅安全设计概览。
- 安全更新:您可以 启用 基础映像的自动安全更新,以便让已部署工作负载的操作系统和运行时 保持最新状态并打上补丁,而无需进行大规模重新部署。
- 网络隔离:Cloud Run 不仅对容器进行沙盒化处理,还 提供多租户网络堆栈。
- 服务身份:您可以将 Cloud Run 工作负载配置为具有 专用身份和受限权限。
成本效益
- 缩容至零和按使用量付费:Cloud Run 实例 在不使用时会自动缩容至零,确保仅在需要运行时才对托管工作负载收费。与利用“始终开启”虚拟机的架构相比,资源利用率非常高。
- 按请求结算:除了缩容至零之外,您还可以受益于 更精细的结算模式,该模式仅在处理请求时收费, 从而提供更高的成本效益。
- 按需且快速启动:缩容后,Cloud Run 服务可以 快速扩容,从而减少已部署应用的最终用户 感知到的延迟。
- 自动费用标记:Cloud Run 报告的所有费用都带有标签, 使您可以自动执行租户的费用归因和跟踪。
- 承诺降低总费用:在结算账号级别,您可以 使用灵活的承诺使用折扣来优化任何 基准 Cloud Run 使用量的支出。
租户管理
由于 Cloud Run 具有按需特性,因此在使用多个 项目 Google Cloud 时,Cloud Run 费用不会更高,从而可以按照 组织项目 Google Cloud 中所述的方式进行租户管理。
多租户平台的目标架构
从总体上讲,以下是推荐的架构:
组织您的 Google Cloud 项目
您需要设置组织、离线结算,并与您的客户支持团队联系,告知他们您充当的是经销商账号。可能会与您合作,确保建立适当的沟通渠道,以缓解滥用行为。 Google Cloud Google Cloud
您必须使用文件夹来组织 Google Cloud 项目,尤其需要 将运行第一方 代码的项目与运行租户不受信任的代码的项目放在不同的文件夹中。您需要自动执行租户 onboarding,以便创建租户的项目和资源不需要人工参与。
Google 建议每个租户使用一个 Google Cloud 项目。您也可以在同一项目中托管多个租户,但这样做会带来额外的限制:
每个项目一个租户(推荐) Google Cloud
在此架构中,平台的每个租户都托管在专用的 Google Cloud 项目中,这具有许多优势:
- 更简单的安全性:项目是其包含的所有 资源的严格边界。 Google Cloud 这意味着,如果租户需要访问多个 Google Cloud 资源(例如多个 Cloud Run 服务、Cloud Storage 存储桶),则可以将项目用作安全边界。
- 限制更少:
- 给定项目中的资源数量有限。例如,Cloud Run 仅允许在项目中为每个区域创建 1,000 个服务。 服务账号和其他相关资源的数量也有类似限制。
- 项目数量本身就是配额,可以增加,对此数量 组织没有 Google Cloud 限制。每个结算账号的项目数量软限制为 100,000 个,您可以通过与 Google 沟通来增加此限制。您的组织还可以创建多个结算账号,并将它们分组到“帐号群组”(目前处于 Private Preview 阶段)中。
- 更简单的监控和管理:
- 每个租户使用一个项目,可以简化数据删除流程,因为删除租户的数据相当于删除相应的项目。
- Google Cloud Monitoring 和 Logging 适用于多个项目,可让您监控整个舰队。
- 借助项目级配额,您可以限制给定租户的 Cloud Run 资源利用率,从而可能将限制与您自己的定价层级保持一致。
- 借助自定义组织政策,您可以对文件夹的所有项目应用特定限制,例如可用区域或 CPU/内存分配上限。
创建 Google Cloud 项目以及初始化 API 和资源可能会有延迟, Google 建议您使用预先创建的项目池,并在需要时将这些项目分配给您的 租户。
每个项目多个租户(不推荐) Google Cloud
您可以在同一 Google Cloud 项目中托管多个租户,但 Google 不推荐此架构。
许多 Google Cloud 服务都有每个项目的资源限制。例如,Cloud Run 在项目中为每个区域设置了 1,000 个 Cloud Run 服务的不可调整限制。因此,每个项目托管多个租户 仍然需要您管理项目舰队,这将 总体上增加租户管理的复杂性。 Google Cloud 从安全角度来看, Google Cloud 项目被设计为安全边界,在同一项目中托管两个 不同的租户需要您在安全性方面更加谨慎。例如,通过确保专用服务账号和精细权限来实现。
部署到多个区域
为了确保可靠性和可伸缩性,Google 建议将租户 部署分散到多个 Google Cloud 区域。 每个租户应用都部署到单个区域,但您可以为不同的租户使用不同的区域。区域选择可以是随机的,也可以考虑租户的位置以优化延迟。
请求路由和自定义网域
如果您想向最终用户公开租户的 Cloud Run 服务,则需要添加自己的网域并使用自己的路由逻辑。例如,将 子网域映射到 Google Cloud 托管租户服务的项目。
您可以实现自定义路由服务,但 Google 建议使用具有 服务扩展程序 的 全局外部应用负载均衡器 来实现路由 逻辑。服务扩展程序可以实现为插件(逻辑与请求处理内联执行)或标注(路由逻辑委托给单独的 Cloud Run 服务,该服务可以调用 Google Cloud's 可伸缩多区域数据库之一,例如 Spanner)。
使用应用负载均衡器还可以让您通过利用 Cloud CDN 添加缓存层,并使用 Cloud Armor 为您的平台添加额外的分布式拒绝服务攻击 (DDoS 攻击) 防护。
声誉和滥用行为
任何允许运行不受信任的代码的托管平台都容易受到滥用。
我们建议您为提供的每个声誉层级使用不同的 Cloud Billing 帐号。例如,您的免费层级租户不应与高付费客户附加到同一结算账号。Google 可以将这些结算账号视为具有不同的声誉级别。
如组织项目中所述,除了按结算账号进行分隔之外,您还应使用文件夹来组织项目。 Google Cloud Google 可以帮助您设置文件夹级配额,以确保文件夹中的所有资源永远不会超过设定的上限,从而让您更好地管理平台的费用。
默认情况下,Google 会根据 Google Cloud 服务条款自动撤消滥用工作负载,Google 还可以在 Cloud Logging 中记录滥用检测事件,然后您可以对此采取 措施。