你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 应用服务是一个功能强大的 Web 应用程序托管平台。 Azure Functions 基于应用服务基础结构构建,可用于轻松生成无服务器和事件驱动的计算工作负载。 这两个服务经常用于多租户解决方案。
支持多租户的应用服务和 Azure Functions 的功能
应用服务和 Azure Functions 包含许多支持多租户的功能。
自定义域名
应用服务使你能够使用 通配符域名系统(DNS)记录 并添加自己的 通配符传输层安全性(TLS)证书。 使用 特定于租户的子域时,可以通过通配符 DNS 和 TLS 证书轻松地将解决方案扩展到大量租户。 此方法可避免为每个新租户手动重新配置。
使用 特定于租户的自定义域名时,可能需要将大量自定义域名添加到应用。 管理大量自定义域名可能很有挑战性,尤其是在需要单个 TLS 证书时。 应用服务提供 托管 TLS 证书,可减少使用自定义域时所需的工作。 但是,需要考虑一些 限制,例如可将多少个自定义域应用于单个应用。
与 Azure Front Door 集成
应用服务和 Azure Functions 可与 Azure Front Door 集成,充当解决方案的面向 Internet 的组件。 使用 Azure Front Door 可以添加 Web 应用程序防火墙(WAF)和边缘缓存,并提供其他性能优化。 可以根据不断变化的业务或技术要求,轻松地将流量重新配置为将流量定向到不同的后端。
将 Azure Front Door 与多租户应用配合使用时,可以使用它来管理自定义域名并终止 TLS 连接。 然后,应用服务应用程序配置了单个主机名。 所有流量都流向该应用程序,这有助于避免在多个位置管理自定义域名。
与前面的示例一样, 可以将 Azure Front Door 配置为修改请求的 Host 标头。 客户端发送的原始 Host 标头通过 X-Forwarded-Host 标头传播。 应用程序代码可以使用此标头 将请求映射到正确的租户。
警告
如果应用程序发送 Cookie 或重定向响应,则必须考虑到特定的注意事项。 对请求标头的 Host 更改可能会使这些响应失效。 有关详细信息,请参阅 主机名保留最佳做法。
可以使用 专用终结点 或应用服务 访问限制 来确保流量在到达应用之前流经 Azure Front Door。
有关详细信息,请参阅 多租户解决方案中的 Azure Front Door。
身份验证和授权
应用服务可以 代表应用验证身份验证令牌。 当应用服务收到请求时,它会检查是否满足以下每个条件:
- 请求包含令牌。
- 令牌有效。
- 请求已获得授权。
如果未满足任何条件,应用服务可以阻止请求,也可以将用户重定向到标识提供者,以便他们可以登录。
如果租户使用 Microsoft Entra ID 作为其标识系统,则可以将应用服务配置为使用 /common 终结点 来验证用户令牌。 此配置可确保无论用户的Microsoft Entra 租户如何验证和接受令牌。
还可以将应用服务与 Microsoft Entra 外部 ID 集成,以便对使用者进行身份验证。
访问限制
可以使用 访问限制来限制发到应用的流量。 可以使用这些规则来指定允许连接到应用的 IP 地址范围或虚拟网络。
使用多租户解决方案时,请注意访问限制规则的最大数量。 例如,如果需要为每个租户创建访问限制规则,可能会超过允许的最大规则数。 如果需要更多规则,请考虑部署反向代理(如 Azure Front Door)。
隔离模型
使用使用应用服务或 Azure Functions 的多租户系统时,请确定所需的隔离级别。 有关为方案选择最佳隔离模型的详细信息,请参阅 多租户解决方案的租赁模型 和 多租户解决方案中计算的体系结构方法。
使用应用服务和 Azure Functions 时,应注意以下关键概念:
在应用服务中, 计划 表示托管基础结构。 应用表示在该基础结构上运行的单个应用程序。 可以将多个应用部署到单个计划。
在 Azure Functions 中,托管和应用程序也是分开的,但有额外的托管选项可用于弹性托管,其中 Azure Functions 会为你管理缩放。 本文将托管基础结构称为 计划 ,因为讨论的原则适用于应用服务和 Azure Functions,而不考虑使用的托管模型。
下表总结了应用服务和 Azure Functions 的主要租户隔离模型之间的差异。
| 注意事项 | 共享应用 | 具有共享计划的每个租户的应用 | 每个租户的计划 |
|---|---|---|---|
| 配置隔离 | Low | Medium. 应用级设置专用于租户,并共享计划级设置。 | 高。 每个租户都可以有自己的配置。 |
| 性能隔离 | Low | 中低。 可能受到喧闹的邻居问题的影响。 | High |
| 部署复杂性 | Low | 中等 | High |
| 操作复杂性 | Low | High | High |
| 资源成本 | Low | 低高,具体取决于应用程序 | High |
| 示例方案 | 具有共享应用程序层的大型多租户解决方案 | 将不知道租赁的应用程序迁移到 Azure,同时获得一些成本效益。 | 单租户应用程序层 |
共享应用
可以在单个计划中部署共享应用程序,并将共享应用程序用于所有租户。
此部署策略往往是最经济高效的选项,它需要最少的作开销,因为要管理的资源较少。 可以根据负载或需求缩放总体计划,共享计划的所有租户都受益于增加的容量。
请务必了解 应用服务配额和限制,例如可添加到单个应用的自定义域的最大数目以及可以预配的计划的最大实例数。
若要能够使用此模型,应用程序代码必须具有多租户感知能力。
具有共享计划的每个租户的应用
还可以选择在多个租户之间共享计划,但为每个租户部署单独的应用。 此方法提供每个租户之间的逻辑隔离,并提供以下优势:
成本效益: 通过共享托管基础结构,通常可以降低每个租户的总体成本。
配置分离: 每个租户的应用都可以应用自己的域名、TLS 证书、访问限制和令牌授权策略。
升级分离: 每个租户的应用程序二进制文件可以独立于同一计划中的其他应用进行升级。
但是,由于计划的计算资源是共享的,因此应用可能会受到 干扰邻居问题的影响。 此外,还可以 将多少个应用部署到单个计划。
注释
不要为不同的租户使用 部署槽 位。 槽不提供资源隔离。 当你需要短时间内运行多个版本的应用(例如蓝绿部署和 Canary 推出策略)时,它们专为部署方案而设计。
每个租户的计划
最严格的隔离级别是为租户部署专用计划。 此专用计划可确保租户完全使用分配给该计划的所有服务器资源。
此方法使你能够缩放解决方案,为每个租户提供性能隔离,并避免 干扰邻居问题。 但是,它还具有更高的成本,因为资源不会与多个租户共享。 此外,需要考虑可部署到单个 Azure 资源组 的最大计划数 。
Azure Functions 弹性消耗计划
Azure Functions 包括 弹性消耗计划,该计划提供按函数缩放,并支持 始终就绪的实例 来减少冷启动。 每个函数独立缩放,HTTP、持久函数和 Blob(Azure 事件网格)触发器除外。 当租户模型将租户映射到函数或函数组时,此缩放模型可帮助你隔离租户工作负荷,并且有助于降低干扰租户对其他工作负荷的影响。
Flex Consumption 还支持 虚拟网络集成 和专用终结点,这有助于应用与应用服务一起使用的相同网络隔离做法。 这些功能可以简化多租户解决方案的网络设计和成本模型,这些解决方案需要具有可预测隔离的无服务器实现。
主机 API
可以在应用服务和 Azure Functions 上托管 API。 选择的平台取决于所需的特定功能集和缩放选项。
无论用于托管 API 的平台如何,请考虑在 API 应用程序前使用 Azure API 管理 。 API 管理提供了许多可用于多租户解决方案的功能:
所有 身份验证的集中式点,可能包括从令牌声明或其他请求元数据确定租户标识符。
将请求路由到不同的 API 后端,这可能基于请求的租户标识符。 当你使用自己的独立 API 应用程序托管多个 部署标记 时,此路由非常有用,但需要为所有请求提供单个 API URL。
网络和多租户
IP 地址
许多多租户应用程序需要连接到租户的本地网络以发送数据。
如果需要从已知的静态 IP 地址或一组已知的静态 IP 地址发送出站流量,请考虑使用 NAT 网关。 有关如何在多租户解决方案中使用 NAT 网关的详细信息,请参阅 多租户的 Azure NAT 网关注意事项。
如果你不需要静态出站 IP 地址,但偶尔需要检查应用程序用于出站流量的 IP 地址,则可以 查询应用服务部署的当前 IP 地址。
重要
将应用服务与 Azure NAT 网关集成时,发到 Azure 存储的所有流量都必须使用专用终结点或服务终结点。 此配置可确保通过虚拟网络路由出口时,存储访问将继续工作。 在多租户解决方案中,请确保使用存储的生成、部署、日志记录和数据路径遵循此模式。 有关详细信息,请参阅 Azure NAT 网关集成。
网络安全边界
Azure 网络安全外围 功能为平台服务提供基于标识的外围。 由于应用服务和 Azure Functions 运行自定义应用程序代码,因此网络安全外围强制无法完全应用于所有流。 如果需要与网络安全外围内的平台即服务(PaaS)资源通信,请将应用与虚拟网络集成,并通过 专用终结点访问这些资源。 此方法与多租户隔离做法保持一致,并减少租户中的数据外泄风险。
配额
由于应用服务是多租户服务,因此需要注意如何使用共享资源。 网络需要特别注意,因为有 一些限制 会影响应用程序如何与入站和出站网络连接进行交互。 这些限制包括源网络地址转换(SNAT)和传输控制协议(TCP)端口限制。
如果应用程序连接到大量数据库或外部服务,则应用可能面临 SNAT 端口耗尽的风险。 通常,SNAT 端口耗尽表明代码未正确重用 TCP 连接。 即使在多租户环境中,也请务必遵循建议的连接重用做法,以避免达到端口限制。
但是,在某些多租户解决方案中,与不同 IP 地址的出站连接数可能会导致 SNAT 端口耗尽,即使遵循良好的编码做法也是如此。 在这些方案中,请考虑以下选项之一:
部署 NAT 网关以增加可供应用程序使用的 SNAT 端口数。 有关详细信息,请参阅 Azure NAT 网关多租户注意事项。
连接到 Azure 服务以绕过负载均衡器限制时使用 服务终结点 。
即使已实施这些控制,你也可以使用大量租户接近限制,因此应该计划扩展到额外的应用服务计划或部署戳。
供稿人
Microsoft维护本文。 以下参与者撰写了本文。
主要作者:
- John Downs |Azure 模式和做法的主要软件工程师
其他参与者:
- Thiago Almeida |Azure Functions 的主要项目经理
- 丹尼尔·斯科特-伦斯福德 |高级合作伙伴解决方案架构师、企业合作伙伴解决方案
- 阿森·弗拉基米尔斯基 | 客户首席工程师,FastTrack for Azure
若要查看非公开的LinkedIn个人资料,请登录LinkedIn。