将应用与 Azure 虚拟网络集成

注意

从 2024 年 6 月 1 日开始,所有新创建的应用服务应用都可以选择生成唯一的默认主机名,命名约定为 <app-name>-<random-hash>.<region>.chinacloudsites.cn。 现有应用名称将保持不变。

示例: myapp-ds27dh7271aah175.westus-01.chinacloudsites.cn

本文介绍 Azure 应用服务虚拟网络集成功能,并介绍如何为应用服务中的应用设置此功能。 使用 Azure 虚拟网络可将多个 Azure 资源置于无法通过 Internet 路由的网络中。 应用服务虚拟网络集成功能允许应用访问虚拟网络中的资源,或通过虚拟网络访问资源。

注意

有关需要网关的虚拟网络集成的信息已移动到新位置

应用服务有以下两种形式:

  • 专用的计算定价层,包括“基本”、“标准”、“高级”、“高级 v2。
  • 该应用服务环境使用专用的支持基础结构直接部署到虚拟网络,并且使用的是 Isolated 和 Isolated v2 定价层。

虚拟网络集成功能用于Azure 应用服务专用的计算定价层。 如果你的应用在应用服务环境中,则它已与虚拟网络集成,无需配置虚拟网络集成功能即可访问同一虚拟网络中的资源。 有关所有网络功能的详细信息,请参阅应用服务网络功能

虚拟网络集成功能允许应用访问虚拟网络中的资源,但不允许通过虚拟网络对应用进行入站专用访问。 专用站点访问指的是仅可从专用网络(例如 Azure 虚拟网络)对应用进行访问。 虚拟网络集成仅用来建立从应用对到虚拟网络的出站调用。 有关入站专用访问,请参阅专用终结点

虚拟网络集成功能:

  • 需要支持的“基本”或“标准”、“高级”、“高级 v2”或“弹性高级”应用程序服务定价层。
  • 支持 TCP 和 UDP。
  • 适用于应用服务应用、函数应用和逻辑应用。

虚拟网络集成不支持某些功能,例如:

  • 装载驱动器。
  • Windows Server Active Directory 域加入。
  • NetBIOS。

虚拟网络集成支持连接到同一区域中的虚拟网络。 使用虚拟网络集成允许应用访问以下资源和服务:

  • 虚拟网络中要与之集成的资源。
  • 与应用集成的虚拟网络建立了对等互连的虚拟网络中的资源,包括全球对等互连连接。
  • 跨 Azure ExpressRoute 连接的资源。
  • 服务终结点保护的服务。
  • 启用专用终结点的服务。

使用虚拟网络集成时,可以使用以下 Azure 网络功能:

  • 网络安全组 (NSG):可以使用集成子网上使用的 NSG 阻止出站流量。 入站规则不适用,因为无法使用虚拟网络集成提供对应用的入站访问。
  • 路由表 (UDR) :可以在集成子网上放置路由表,以便将出站流量发送到所需的位置。
  • NAT 网关:可以使用 NAT 网关获取专用出站 IP 并缓解 SNAT 端口耗尽。

了解如何启用虚拟网络集成

虚拟网络集成的工作原理

应用服务中的应用托管在辅助角色上。 虚拟网络集成通过使用委托子网中的地址将虚拟接口装载到辅助角色来实现。 使用的虚拟接口不是客户可直接访问的资源。 由于发件人地址位于你的虚拟网络中,因此它可以像虚拟网络中的 VM 一样访问虚拟网络中或通过虚拟网络访问的大多数内容。

显示虚拟网络集成工作原理的示意图。

启用虚拟网络集成后,应用通过虚拟网络进行出站调用。 应用属性门户中列出的出站地址是应用仍然在使用的地址。 但是,如果出站调用针对集成虚拟网络或对等虚拟网络中的虚拟机或专用终结点,则出站地址是来自集成子网的地址。 分配给实例的专用 IP 通过环境变量 WEBSITE_PRIVATE_IP 公开。

如果启用了“所有流量路由”,则会将所有出站流量发送到虚拟网络。 如果未启用所有流量路由,则只会将在集成子网上配置的专用流量(RFC1918)和服务终结点发送到虚拟网络。 发送到 Internet 的出站流量会直接从应用进行路由。

虚拟网络集成功能支持每个辅助角色两个虚拟接口。 每个辅助角色两个虚拟接口意味着每个应用服务计划有两个虚拟网络集成。 换句话说,应用服务计划可以与最多两个子网/虚拟网络进行虚拟网络集成。 同一应用服务计划中的应用只能将虚拟网络集成之一用于特定子网,这意味着应用在给定时间只能具有一个虚拟网络集成。

子网要求

虚拟网络集成取决于专用子网。 创建子网时,Azure 子网从一开始就会使用 5 个 IP。 每个应用服务计划实例使用集成子网中的一个地址。 如果将应用扩展到四个实例,则使用四个地址。

纵向扩展/缩减实例大小时,当缩放操作完成后,应用服务计划使用的 IP 地址量会暂时增加一倍。 在取消预配现有实例之前,新实例需要完全正常运行。 对于指定的子网大小,此缩放操作会影响其实际可用的受支持实例。 平台升级需要使用免费 IP 地址,以确保可以在不中断出站流量的情况下进行升级。 最后,在纵向扩展、缩减或完成操作后,可能需要一小段时间才能释放 IP 地址。 在极少数情况下,此操作可能长达 12 小时,如果快速横向扩展/缩减或纵向扩展/缩减,则需要比最大缩放更多的 IP。

由于分配后不能更改子网大小,因此请使用足够大的子网来容纳应用可能会达到的任何规模。 还应保留 IP 地址以进行平台升级。 为了避免子网容量出现任何问题,我们建议分配相当于计划最大规模两倍的 IP。 具有 64 个地址的 /26 涵盖单个多租户应用服务计划的最大缩放。 与虚拟网络集成期间在 Azure 门户中创建子网时,需要的最小大小是 /27。 如果在通过门户集成之前就已存在子网,可以使用 /28 子网。

使用多计划子网加入 (MPSJ),可以将多个应用服务计划加入到同一子网。 所有应用服务计划必须位于同一订阅中,但虚拟网络/子网可以位于不同的订阅中。 每个应用服务计划中的每个实例都需要来自子网的 IP 地址,而要使用 MPSJ,需要 /26 子网这一最小大小。 如果计划加入多个计划和/或大规模计划,应针对更大的子网范围进行规划。

重要

由于已知 bug,如果创建多个站点并尝试同时与虚拟网络集成,MPSJ 将失败。 不久将部署修补程序。 在此期间,你可以使用以下任一方法解决此问题:

  • 如果手动创建站点,请逐个创建并集成这些站点。
  • 如果以编程方式创建站点(例如使用 Terraform 或 ARM 模板),请将 dependsOn 元素添加到模板中的每个站点,以便除了第一个站点之外,所有站点都依赖于前一个站点的创建。 这会在每个站点的创建和虚拟网络集成之间创建延迟,因此不会被已知 bug 阻塞。 有关详细信息,请参阅在 ARM 模板中定义部署资源的顺序

特定于 Windows 容器的限制

Windows 容器将针对每个应用和每个应用服务计划实例使用一个额外的 IP 地址,并且你需要相应地调整子网大小。 例如,如果有 10 个 Windows 容器应用服务计划实例,每个实例具有 4 个正在运行的应用,则需要 50 个 IP 地址和额外地址来支持横向缩放(缩减/扩展)。

示例计算:

对于每个应用服务计划实例,你需要:4 个 Windows 容器应用 = 4 个 IP 地址,每个应用服务计划实例 1 个 IP 地址,4 + 1 = 5 个 IP 地址

对于 10 个实例:每个应用服务计划为 5 x 10 = 50 个 IP 地址

由于你具有 1 个应用服务计划,因此具有 1 x 50 = 50 个 IP 地址。

此外,还受所用辅助角色层中可用的核心数的限制。 每个核心增加三个网络单元。 辅助角色本身使用一个单元,每个虚拟网络连接使用一个单元。 其余单元可用于应用。

示例计算:

应用服务计划实例具有 4 个正在运行的应用,并使用虚拟网络集成。 这些应用连接到两个不同的子网(虚拟网络连接)。 此配置需要 7 个网络单元(1 个辅助角色 + 2 个连接 + 4 个应用)。 运行此配置的最小大小将是 I2v2(4 个核心 x 3 个单元 = 12 个单元)。

使用 I1v2,最多可以运行使用同一个 (1) 连接的 4 个应用或使用 2 个连接的 3 个应用。

权限

必须至少具有子网的以下基于角色的访问控制权限或更高级别权限,才能通过 Azure 门户、CLI 或在直接设置 virtualNetworkSubnetId 站点属性时配置虚拟网络集成:

操作 说明
Microsoft.Network/virtualNetworks/read 读取虚拟网络定义
Microsoft.Network/virtualNetworks/subnets/read 读取虚拟网络子网定义
Microsoft.Network/virtualNetworks/subnets/join/action 加入虚拟网络

如果虚拟网络与应用位于不同的订阅中,则必须确保为 Microsoft.Web 资源提供程序注册了使用虚拟网络的订阅。 可以按照此文档显式注册该提供程序,但在订阅中创建第一个 Web 应用时它也会自动注册。

路由

可以通过虚拟网络集成来控制通过的流量。 配置虚拟网络集成时,需要考虑三种类型的路由。 应用程序路由定义从应用路由的流量以及路由到虚拟网络的流量。 配置路由会影响在应用启动之前或期间发生的操作。 例如,容器映像拉取和应用的 Key Vault 引用设置网络路由是处理如何将应用和配置流量从虚拟网络路由到外部的能力。

通过应用程序路由或配置路由选项,可以配置通过虚拟网络集成发送的流量。 如果流量是通过虚拟网络集成发送的,则它仅受网络路由的限制。

申请工艺路线

应用程序路由适用于应用启动后从应用发送的流量。 请参阅启动过程中流量的配置路由。 配置应用程序路由时,可将所有流量或仅将专用流量(也称为 RFC1918 流量)路由到虚拟网络。 可以通过出站 Internet 流量设置来配置此行为。 如果禁用出站 Internet 流量路由,则你的应用只会将专用流量路由到虚拟网络。 如果要将所有出站应用流量路由到虚拟网络中,请确保启用出站 Internet 流量。

  • 只有应用程序或配置路由中配置的流量受应用于集成子网的 NSG 和 UDR 的限制。
  • 启用出站 Internet 流量路由后,应用的出站流量的源地址仍然是应用属性中列出的 IP 地址之一。 如果通过防火墙或 NAT 网关路由流量,则源 IP 地址源自此服务。

了解如何配置应用程序路由

注意

当通过虚拟网络集成路由 SMTP 流量时,应用服务支持出站 SMTP 连接(端口 25)。 可支持性取决于部署虚拟网络的订阅上的设置。 对于 2022 年 8 月 1 日之前创建的虚拟网络/子网, 需要对虚拟网络/子网启动临时配置更改,以便从订阅同步设置。 例如,添加临时子网、临时关联/分离 NSG 或临时配置服务终结点。 有关详细信息,请参阅排查 Azure 中的出站 SMTP 连接问题

配置路由

使用虚拟网络集成时,可以配置如何管理部分配置流量。 默认情况下,配置流量直接走公共路由,但对于提到的单个组件,可以主动将其配置为通过虚拟网络集成进行路由。

内容共享

默认情况下,在高级计划中缩放函数应用时,Azure Functions 使用内容共享作为部署源。 必须配置额外的设置,以确保流量通过虚拟网络集成路由到此内容共享。 有关详细信息,请参阅如何配置内容共享路由

除了配置路由之外,还必须确保在子网流量上配置的任何防火墙或网络安全组都允许流量流向端口 443 和 445。

容器映像拉取

使用自定义容器时,可以通过虚拟网络集成拉取容器。 若要通过虚拟网络集成路由容器拉取流量,必须确保已配置路由设置。 了解如何配置映像拉取路由

备份/还原

应用服务具有内置的备份/还原功能,但如果你想备份到自己的存储帐户,则可使用自定义备份/还原功能。 如果要通过虚拟网络集成将流量路由到存储帐户,则必须配置路由设置。 不支持通过虚拟网络集成进行数据库备份。

使用 Key Vault 引用的应用设置

使用密钥保管库引用的应用设置会尝试通过公共路由获取机密。 如果密钥保管库阻止公共流量,且应用正在使用虚拟网络集成,则会尝试通过虚拟网络集成获取机密。

注意

  • 当前不支持从专用保管库配置 SSL/TLS 证书。
  • 目前不支持应用服务日志到专用存储帐户的流量。 建议对存储帐户使用诊断日志记录并允许使用受信任的服务。

路由应用设置

应用服务具有用于配置应用程序和配置路由的现有应用设置。 如果两者都存在,站点属性将替代应用设置。 站点属性的优势是可以使用 Azure Policy 进行审核并在配置时进行验证。 建议使用站点属性。

你仍然可以使用现有的 WEBSITE_VNET_ROUTE_ALL 应用设置来配置应用程序路由。

某些配置路由选项也存在应用设置。 这些应用设置名为 WEBSITE_CONTENTOVERVNETWEBSITE_PULL_IMAGE_OVER_VNET

网络路由

可以使用路由表从应用中不受限制地路由出站流量。 常见目标可以包括防火墙设备或网关。 还可以使用网络安全组 (NSG) 来阻止流往虚拟网络或 Internet 中资源的出站流量。 无论应用到集成子网的路由表如何,应用到集成子网的 NSG 都有效。

路由表和网络安全组仅适用于通过虚拟网络集成路由的流量。 有关详细信息,请参阅应用程序路由配置路由。 路由不适用于来自入站应用请求的回复,且 NSG 中的入站规则不适用于应用。 虚拟网络集成只会影响应用的出站流量。 若要控制应用的入站流量,请使用访问限制功能或专用终结点

配置应用于出站流量的网络安全组或路由表时,必须确保考虑应用程序依赖项。 应用程序依赖项包括应用在运行时所需的终结点。 除了应用正在调用的 API 和服务之外,这些终结点还可以派生终结点,如证书吊销列表 (CRL) 检查终结点和标识/身份验证终结点(例如 Microsoft Entra ID)。 如果使用的是应用服务中的持续部署,则可能还需要根据类型和语言允许终结点。 特别是对于 Linux 持续部署,需要允许 oryx-cdn.microsoft.io:443。 对于 Python,还需要允许 files.pythonhosted.orgpypi.org

如果要在本地路由出站流量,可以使用路由表将出站流量发送到 Azure ExpressRoute 网关。 如果要将流量路由到网关,请将外部网络中的路由设置为发送回任何回复。 边界网关协议 (BGP) 路由也会影响你的应用流量。 如果具有来自 ExpressRoute 网关等位置的 BGP 路由,应用出站流量会受到影响。 与用户定义的路由相似,BGP 路由对流量的影响取决于路由范围设置。

服务终结点

通过虚拟网络集成能够访问通过服务终结点保护的 Azure 服务。 若要访问服务终结点保护的服务,请执行以下步骤:

  1. 配置 Web 应用的虚拟网络集成,以连接到用于集成的特定子网。
  2. 转到目标服务并针对集成子网配置服务终结点。

专用终结点

如果要调用专用终结点,请确保 DNS 查找解析到专用终结点。 可以使用以下方式之一强制执行此行为:

  • 与 Azure DNS 专用区域集成。 如果虚拟网络没有自定义 DNS 服务器,则会在区域链接到虚拟网络时自动执行集成。
  • 管理 DNS 服务器中由你的应用使用的专用终结点。 若要管理配置,必须知道专用终结点 IP 地址。 然后,使用 A 记录将尝试访问的终结点指向该地址。
  • 将你自己的 DNS 服务器配置为转发到 Azure DNS 专用区域。

Azure DNS 专用区域

应用与虚拟网络集成后,它将使用配置虚拟网络时所用的同一 DNS 服务器。 如果未指定任何自定义 DNS,它将使用 Azure 默认 DNS 以及链接到虚拟网络的任何专用区域。

限制

使用虚拟网络集成存在一些限制:

  • 高级 v2 定价层中的所有应用程序服务部署均可使用此功能。 此功能在基本层和标准层中也可用,但只能从较新的应用服务部署中使用。 如果使用较旧的部署,则只能通过高级 v2 应用服务计划使用此功能。 这些计划仅在最新的部署上受支持。 如果需要,可以在创建计划后进行纵向缩减。
  • 该功能不适用于应用服务环境中的独立计划应用。
  • 无法使用经典虚拟网络跨对等互连连接访问资源。
  • 该功能需要一个未使用的子网,该子网是 Azure 资源管理器虚拟网络中的 IPv4 /28 块或更大的块。 MPSJ 需要 /26 或更大的块。
  • 应用和虚拟网络必须位于同一区域。
  • 集成虚拟网络不能定义 IPv6 地址空间。
  • 集成子网无法启用服务终结点策略。
  • 不能删除具有集成应用的虚拟网络。 删除虚拟网络之前,请删除该集成。
  • 每个应用服务计划不能有两个以上的虚拟网络集成。 同一个应用服务计划中的多个应用可以使用同一个虚拟网络集成。
  • 存在使用虚拟网络集成的应用时,不能更改应用或计划的订阅。

访问本地资源

虚拟网络集成功能无需额外的配置即可通过虚拟网络连接到本地资源。 只需使用 ExpressRoute 或站点到站点 VPN 将虚拟网络连接到本地资源。

对等互连

如果将对等互连用于虚拟网络集成,则无需进行额外配置。

管理虚拟网络集成

与虚拟网络连接和断开连接都在应用级别进行。 可能影响多个应用的虚拟网络集成的操作在应用服务计划级别执行。 从应用 >“网络”>“VNet 集成”门户,可以获取有关虚拟网络的详细信息。 在“应用服务计划”“网络”“VNet 集成”中,可以看到应用服务计划级别的类似信息。

在虚拟网络集成实例的应用视图中,可以断开应用与虚拟网络的连接并配置应用程序路由。 若要断开应用与虚拟网络的连接,请选择“断开连接”。 断开与虚拟网络的连接后,应用会重启。 断开连接操作不会更改虚拟网络。 子网未被移除。 如果那时想删除虚拟网络,请先断开应用与虚拟网络的连接。

分配给实例的专用 IP 通过环境变量 WEBSITE_PRIVATE_IP 公开。 Kudu 控制台 UI 还显示了可用于 Web 应用的环境变量列表。 此 IP 是从集成子网的地址范围中分配的。 Web 应用会使用此 IP 通过 Azure 虚拟网络连接到资源。

注意

WEBSITE_PRIVATE_IP 的值必然会变化。 但是,该 IP 将是集成子网地址范围内的 IP,因此需要允许从整个地址范围进行访问。

定价详细信息

除了应用服务计划定价层收费以外,虚拟网络集成功能没有额外的使用费。

故障排除

虽然此功能易于设置,但这并不意味着体验中不会遇到任何问题。 如果在访问所需终结点时遇到问题,可以根据观察到的情况采取不同的步骤。 有关详细信息,请参阅虚拟网络集成故障排除指南

注意

  • 应用服务中的 Docker Compose 方案不支持虚拟网络集成。
  • 访问限制不适用于通过专用终结点传入的流量。

在断开网络集成连接之前删除应用服务计划或应用

如果在未先断开虚拟网络集成连接的情况下删除了应用或应用服务计划,则无法对用于与已删除资源集成的虚拟网络或子网执行任何更新/删除操作。 子网委派“Microsoft.Web/serverFarms”会保持分配给子网,并阻止更新和删除操作。

若要再次更新/删除子网或虚拟网络,需要重新创建虚拟网络集成,然后断开其连接:

  1. 重新创建应用服务计划和应用(必须使用与之前完全相同的 Web 应用名称)。
  2. 导航到 Azure 门户中的应用的“网络”,并配置虚拟网络集成。
  3. 配置虚拟网络集成后,选择“断开连接”按钮。
  4. 删除应用服务计划或应用。
  5. 更新/删除子网或虚拟网络。

如果按照这些步骤操作后仍遇到虚拟网络集成问题,请联系 Microsoft 支持部门。