你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

多租户解决方案中的网络体系结构方法

部署到 Azure 的所有解决方案都需要某种类型的网络。 根据解决方案设计和工作负载,与 Azure 网络服务交互的方式可能有所不同。 在本文中,我们提供 Azure 上多租户解决方案的网络方面的注意事项和指导。 我们包括了从较低级别网络组件(如虚拟网络)到较高级别和应用层方法的相关信息。

注意

Azure 本身是一个多租户环境,Azure 的网络组件专为多租户而设计。 尽管无需了解详细信息即可设计自己的解决方案,但你可以详细了解 Azure 如何将你的虚拟网络流量与其他客户的流量相隔离

关键考虑因素和要求

基础结构和平台服务

对网络组件的关注点将因你使用的服务类别而异。

基础结构服务

每当使用基础结构服务(如虚拟机或 Azure Kubernetes 服务)时,都需要考虑并设计用于支持服务连接的虚拟网络或 VNet。 你还需要考虑需要整合到设计中的其他安全层和隔离层。 避免完全依赖网络层控制

平台服务

如果使用 Azure 的平台服务(如应用服务、Azure Cosmos DB 或 Azure SQL 数据库),则使用的特定体系结构将决定所需的网络服务。

如果需要将平台服务与 Internet 隔离,则需要使用 VNet。 根据使用的特定服务,可以使用专用终结点或 VNet 集成的资源,例如应用程序网关。 但是,你可能还会选择通过公共 IP 地址提供平台服务,并使用这些服务自己的保护(如防火墙和标识控制)。 在这些情况下,可能不需要 VNet。

是否对平台服务使用 VNet 的决定基于许多要求,包括以下因素:

  • 合规性要求:可能需要满足特定的合规性标准。 某些标准要求以特定方式配置 Azure 环境。
  • 租户的要求:即使你自己的组织对网络层隔离或控制没有特定的要求,你的租户也可能有要求。 确保你清楚地了解租户将如何访问你的解决方案,以及他们是否对其网络设计有任何假设。
  • 复杂性:了解和使用虚拟网络可能更为复杂。 确保团队清楚地了解所涉及的原则,否则你可能会部署一个不安全的环境。

确保了解使用专用网络的含义

调整子网大小

如果需要部署 VNet,请务必仔细考虑整个 VNet 和 VNet 中子网的大小和地址空间。

确保清楚地了解如何将 Azure 资源部署到 VNet,以及每个资源使用的 IP 地址数。 如果部署特定于租户的计算节点、数据库服务器或其他资源,请确保创建的子网足够大,可以满足预期的租户增长和资源的横向自动缩放需求。

同样,使用托管服务时,请务必了解 IP 地址的使用方式。 例如,将 Azure Kubernetes 服务与 Azure 容器网络接口 (Azure CNI) 配合使用时,子网中使用的 IP 地址数将取决于节点数、横向缩放方式以及所使用的服务部署过程等因素。 将 Azure 应用服务和 Azure Functions 用于 VNet 集成时,使用的 IP 地址数取决于计划实例的数量

规划子网时,请查看子网分段指南

公共或专用访问

请考虑租户是通过 Internet 还是通过专用 IP 地址访问你的服务。

对于基于 Internet 的(公共)访问,可以使用防火墙规则、IP 地址允许列表和拒绝列表、共享机密和密钥以及基于标识的控制来保护你的服务。

如果需要使用专用 IP 地址启用与服务的连接,请考虑使用 Azure 专用链接服务跨租户虚拟网络对等互连。 对于某些受限的方案,还可以考虑使用 Azure ExpressRoute 或 Azure VPN 网关启用对解决方案的专用访问。 仅当你的租户数较少并且为每个租户部署了专用 VNet 时,我们才建议使用此方法。

访问租户的终结点

请考虑是否需要将数据发送到租户网络内的终结点(在 Azure 内部或外部)。 例如,是否需要调用客户提供的 Webhook,或者是否需要向租户发送实时消息?

如果需要将数据发送到租户的终结点,请考虑以下常见方法:

  • 通过 Internet 启动从解决方案到租户终结点的连接。 请考虑连接是否必须源自静态 IP 地址。 根据所使用的 Azure 服务,可能需要部署 NAT 网关、防火墙或负载均衡器。
  • 部署代理以启用 Azure 托管服务与客户网络之间的连接,而不管它们位于何处。
  • 对于单向消息传送,请考虑使用 Azure 事件网格等服务(带或不带事件域)。

要考虑的方法和模式

在本部分中,我们将介绍可在多租户解决方案中考虑的一些关键网络方法。 首先介绍适用于核心网络组件的较低级别方法,然后介绍可以考虑用于 HTTP 和其他应用程序层关注点的方法。

具有服务提供商选择的 IP 地址的租户特定 VNet

在某些情况下,你需要代表租户在 Azure 中运行专用 VNet 连接的资源。 例如,可能会为每个租户运行虚拟机,或者可能需要使用专用终结点访问特定于租户的数据库。

请考虑使用你控制的 IP 地址空间为每个租户部署 VNet。 使用此方法,可以将 VNet 对等互连到一起以实现自己的目的,例如,如果需要建立中心辐射型拓扑来集中控制流量流入和出口。

但是,如果租户需要直接连接到你创建的 VNet(例如通过使用 VNet 对等互连),则服务提供程序选择的 IP 地址不适用。 你选择的地址空间可能会与他们自己的地址空间不兼容。

具有租户选择的 IP 地址的租户特定 VNet

如果租户需要将他们自己的 VNet 与你代表他们管理的 VNet 对等互连,请考虑使用租户选择的 IP 地址空间部署特定于租户的 VNet。 此系统使每个租户都能确保系统 VNet 中的 IP 地址范围不与其自身的 VNet 重叠。 通过使用不重叠的 IP 地址范围,它们可以确保其网络与对等互连兼容。

但是,此方法意味着不可能将租户的 VNet 对等互连到一起或采用中心辐射型拓扑,因为不同租户的 VNet 之间可能存在重叠的 IP 地址范围。

中心和辐射拓扑

中心辐射型 VNet 拓扑使你能够将一个集中式中心 VNet 与多个分支 VNet 对等互连。 可以集中控制 VNet 的流量入口和出口,并控制每个分支 VNet 中的资源是否可以相互通信。 每个分支 VNet 还可以访问共享组件(如 Azure 防火墙),并且可能可以使用 Azure DDoS 防护等服务。

使用中心辐射型拓扑时,请确保围绕限制(例如对等互连的 VNet 的最大数量)进行规划,并确保对每个租户的 VNet 都不会使用重叠的地址空间。

使用你选择的 IP 地址部署特定于租户的 VNet 时,中心辐射型拓扑非常有用。 每个租户的 VNet 会成为分支,并且可以在中心 VNet 中共享常用资源。 当跨多个 VNet 缩放共享资源以实现缩放目的时,或者在使用部署戳模式时,也可以使用中心辐射型拓扑。

提示

如果解决方案跨多个地理区域运行,通常最好在每个区域中部署单独的中心和中心资源。 虽然这种做法会产生更高的资源成本,但它避免了流量不必要地流经多个 Azure 区域,这可能会增加请求的延迟并产生全球对等互连费用。

静态 IP 地址

请考虑租户是否需要你的服务将静态公共 IP 地址用于入站流量和/或出站流量。 不同的 Azure 服务以不同的方式启用静态 IP 地址。

使用虚拟机和其他基础结构组件时,请考虑对入站和出站静态 IP 寻址使用负载均衡器或防火墙。 请考虑使用 NAT 网关来控制出站流量的 IP 地址。 有关如何在多租户解决方案中使用 NAT 网关的详细信息,请参阅适用于多租户的 Azure NAT 网关注意事项

使用平台服务时,你使用的特定服务决定了你是否以及如何能够控制 IP 地址。 你可能需要以特定方式配置资源,例如,通过将资源部署到 VNet 以及通过使用 NAT 网关或防火墙。 或者,可以请求该服务对出站流量使用的当前 IP 地址集。 例如,应用服务提供了一个 API 和 Web 接口来获取应用程序的当前出站 IP 地址

代理

如果你需要允许租户接收由你的解决方案启动的消息,或者你需要访问租户自己的网络中存在的数据,请考虑提供一个他们可以在他们的网络中部署的代理(有时称为本地网关)。 无论租户的网络位于 Azure、另一个云提供商处还是本地,此方法都适用。

代理会启动与你指定并控制的终结点之间的出站连接,并让长时间运行的连接保持活动状态,或间歇性地进行轮询。 请考虑使用 Azure 中继建立和管理从代理到服务的连接。 代理建立连接时,它会进行身份验证,并包含有关租户标识符的一些信息,以便服务可以将连接映射到正确的租户。

代理通常会简化租户的安全配置。 打开入站端口可能很复杂且有风险,尤其是在本地环境中。 使用代理则无需租户承担此风险。

提供用于连接到租户网络的代理的 Microsoft 服务示例包括:

Azure 专用链接服务提供从租户的 Azure 环境到你的解决方案的专用连接。 租户还可以将专用链接服务与他们自己的 VNet 配合使用,以便从本地环境访问你的服务。 Azure 使用专用 IP 地址以安全方式将流量路由到服务。

有关专用链接和多租户的详细信息,请参阅多租户和 Azure 专用链接

域名、子域和 TLS

在多租户解决方案中使用域名和传输层安全性 (TLS) 时,有一些需要注意的事项。 查看多租户和域名的注意事项

网关路由和网关卸载模式

网关路由模式网关卸载模式涉及部署第 7 层反向代理或网关。 网关可用于为多租户应用程序提供核心服务,包括以下功能:

  • 将请求路由到特定于租户的后端或部署戳。
  • 处理特定于租户的域名和 TLS 证书。
  • 使用 Web 应用程序防火墙 (WAF) 检查请求是否存在安全威胁。
  • 缓存响应以提高性能。

Azure 提供了多个可用于实现上述一些或全部目标的服务,包括 Azure Front Door、Azure 应用程序网关和 Azure API 管理。 还可以使用 NGINX 或 HAProxy 等软件部署自己的自定义解决方案。

如果计划为解决方案部署网关,最佳做法是首先构建包含所有所需功能的完整原型,并验证应用程序组件是否继续按预期运行。 还应了解网关组件如何缩放以支持流量和租户的增长。

静态内容托管模式

静态内容托管模式涉及从云原生存储服务提供 Web 内容,并使用内容分发网络 (CDN) 缓存这些内容。

可以将 Azure Front Door 或其他 CDN 用于解决方案的静态组件(例如单页 JavaScript 应用程序)以及图像文件和文档等静态内容。

可能还可以在 CDN 中缓存特定于租户的文件或数据(例如 JSON 格式的 API 响应),具体取决于解决方案的设计方式。 这种做法可以帮助你提高解决方案的性能和可伸缩性,但请务必考虑是否充分隔离了特定于租户的数据,以避免在租户之间泄露数据。 请考虑如何规划从缓存中清除特定于租户的内容,例如,在更新数据或部署新的应用程序版本时。 通过在 URL 路径中包含租户标识符,可以控制是清除特定文件、与特定租户相关的所有文件,还是所有租户的所有文件。

要避免的反模式

未能对 VNet 连接进行规划

通过将资源部署到 VNet 中,可以很好地控制流量如何流经你的解决方案组件。 但是,VNet 集成还引入了额外的复杂性、成本以及你需要考虑的其他因素。 这种影响对平台即服务 (PaaS) 组件尤其明显。

请务必测试和规划网络策略,以便在生产环境中实施网络策略之前发现所有问题。

未针对限制进行规划

Azure 强制实施了许多影响网络资源的限制。 这些限制包括 Azure 资源限制和基本协议与平台限制。 例如,在 Azure 应用服务和 Azure Functions 等平台服务上构建大规模多租户解决方案时,可能需要考虑 TCP 连接数和 SNAT 端口数。 使用虚拟机和负载均衡器时,还需要考虑出站规则SNAT 端口的限制。

子网太小

请务必考虑每个子网的大小,以允许容纳要部署的资源或资源实例的数量,尤其是在缩放时。 使用平台即服务 (PaaS) 资源时,请确保了解资源的配置和规模将如何影响其子网中所需的 IP 地址数。

网络分段不当

如果你的解决方案需要虚拟网络,请考虑如何配置网络分段,以使你能够控制入站和出站(南-北)流量流以及解决方案内的流量流(东-西)。 确定租户是否应具有其自己的 VNet,或者你是否要在共享 VNet 中部署共享资源。 更改方法可能很困难,因此请确保考虑所有要求,然后选择一种适用于未来增长目标的方法。

仅依赖于网络层安全控制

在现代解决方案中,必须将网络层安全性与其他安全控制措施相结合,而不应只依赖于防火墙或网络分段。 这有时称为“零信任网络”。 使用基于标识的控制在解决方案的每个层验证客户端、调用方或用户。 请考虑使用允许添加其他保护层的服务。 可用的选项取决于所使用的 Azure 服务。 在 AKS 中,请考虑使用服务网格进行相互 TLS 身份验证,并使用网络策略来控制东-西流量。 在应用服务中,请考虑使用内置支持进行身份验证和授权以及访问限制

在不进行测试的情况下重写主机头

使用网关卸载模式时,可能会考虑重写 HTTP 请求的 Host 标头。 这种做法可以通过将自定义域和 TLS 管理卸载到网关来简化后端 Web 应用程序服务的配置。

但是,Host 标头重写可能会导致某些后端服务出现问题。 如果应用程序发出 HTTP 重定向或 Cookie,主机名不匹配可能会中断应用程序的功能。 具体而言,使用本身就是多租户的后端服务(例如 Azure 应用服务、Azure Functions 和 Azure Spring Apps)时可能会出现此问题。 有关详细信息,请参阅主机名保留最佳做法

确保使用你计划使用的网关配置测试应用程序的行为。

作者

本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。

主要作者:

  • John Downs | FastTrack for Azure 首席客户工程师

其他参与者:

若要查看非公开领英个人资料,请登录领英。

后续步骤