Azure 容器应用环境中的网络

Azure 容器应用在其自己的虚拟网络 (VNet) 的环境上下文中运行。

默认情况下,你的容器应用环境将与为你自动生成的 VNet 一起创建。 若要对网络进行精细控制,可以在创建环境时提供现有的 VNet。 使用生成的或现有的 VNet 创建环境后,便无法更改网络类型。

生成的 VNet 具有以下特征。

它们是:

  • 无法访问生成的 VNet,因为它们是在 Azure 的租户中创建的
  • 可通过 Internet 公开访问
  • 只能访问可访问 Internet 的终结点

此外,它们仅支持有限的网络功能子集,例如入口 IP 限制和容器应用级入口控件。

如果需要更多 Azure 网络功能,请使用现有的 VNet,例如:

  • 与应用程序网关集成
  • 网络安全组
  • 与虚拟网络中专用终结点后面的资源通信

可用的 VNet 功能取决于你选择的环境。

环境选择

Azure 容器应用具有两种不同的环境类型,它们既有着许多相同的网络特征,也有着一些主要差别。

环境类型 说明 支持计划类型
工作负载配置文件 支持用户定义的路由 (UDR) 和通过 NAT 网关处理出口流量。 所需的最小子网大小为 /27 消耗, 专用
仅消耗量 不支持用户定义的路由 (UDR)、通过 NAT 网关的流出量、通过远程网关的对等互连或其他自定义流出量。 所需的最小子网大小为 /23 消耗

辅助功能级别

可以在环境级别配置容器应用是允许公共流入量,还是仅允许来自 VNet 内部的流入量。

可访问性级别 说明
外部 允许容器应用接受公共请求。 外部环境是使用虚拟 IP 或面向公众的外部 IP 地址部署的。
内部 内部环境没有公共终结点,并且部署了映射到内部 IP 地址的虚拟 IP (VIP)。 内部终结点是一个 Azure 内部负载均衡器 (ILB),IP 地址是从自定义 VNet 的专用 IP 地址列表发出的。

自定义 VNet 配置

创建自定义 VNet 时,请记住以下情况:

  • 如果希望容器应用限制所有外部访问,请创建内部容器应用环境

  • 如果使用的是自己的 VNet,则需要提供专用于要部署的容器应用环境的子网。 此子网不适用于其他服务。

  • 网络地址是从创建环境时定义的子网范围分配的。

    • 可以定义容器应用环境使用的子网范围。

    • 可以通过将环境部署为内部环境,限制为只能从 VNet 对环境发出入站请求。

注意

提供你自己的虚拟网络时,会创建其他托管资源。 这些资源按关联的费率产生成本。

开始围绕容器应用设计网络时,请参阅规划虚拟网络

该图显示了 Azure 容器应用程序环境如何使用现有 V NET,或者可如何提供自己的 V NET。

注意

如果容器应用环境正在使用 VNet,则不允许在不同的资源组或订阅之间移动 VNet。

HTTP 边缘代理行为

Azure 容器应用使用 Envoy 代理作为边缘 HTTP 代理。 传输层安全性 (TLS) 在边缘终止,请求根据其流量拆分规则进行路由,流量将路由到正确的应用程序。

HTTP 应用程序根据 HTTP 请求和连接的数量进行缩放。 Envoy 在群集内路由内部流量。

如果客户端连接需要升级,下游连接支持 HTTP1.1 和 HTTP2,Envoy 会自动检测和升级连接。

通过设置入口对象上的 transport 属性来定义上游连接。

入口配置

ingress 部分下,可以配置以下设置:

  • 可访问性级别:可以在环境中将容器应用设置为外部或内部可访问。 环境变量 CONTAINER_APP_ENV_DNS_SUFFIX 用于自动解析环境的完全限定域名 (FQDN) 后缀。 在同一环境中的容器应用之间通信时,也可以使用应用名称。 有关如何访问应用的详细信息,请参阅 Azure 容器应用中的入口

  • 流量拆分规则:可以在应用程序的不同修订之间定义流量拆分规则。 有关详细信息,请参阅流量拆分

有关不同网络方案的详细信息,请参阅 Azure 容器应用中的入口

门户依赖项

Azure 容器应用中的每个应用都有两个 URL。

容器应用运行时最初生成用于访问应用的完全限定域名 (FQDN)。 有关容器应用的 FQDN,请参阅 Azure 门户中容器应用的概述窗口中应用程序 URL

还会为你生成第二个 URL。 此位置授予对日志流式处理服务和控制台的访问权限。 如有必要,可以将 https://azurecontainerapps.dev.cn/ 添加到防火墙或代理的允许列表中。

端口和 IP 地址

为入站连接公开了以下端口。

协议 端口
HTTP/HTTPS 80、443

IP 地址分为以下类型:

类型 说明
公共入站 IP 地址 用于外部部署中的应用程序流量,以及内部和外部部署中的管理流量。
出站公共 IP 用作离开虚拟网络的出站连接的“来源”IP。 这些连接不会通过 VPN 路由。 出站 IP 可能会随时间而变。 仅支持在工作负载配置文件环境中使用 NAT 网关或其他代理来处理来自容器应用环境的出站流量。
内部负载均衡器 IP 地址 此地址仅存在于内部环境

子网

虚拟网络集成取决于专用子网。 在子网中分配 IP 地址的方式以及支持的子网大小取决于你在 Azure 容器应用中使用的计划

请慎重选择子网大小。 创建容器应用环境后,无法修改子网大小。

不同的环境类型具有不同的子网要求:

  • /27 是虚拟网络集成所需的最小子网大小。

  • 子网必须委托给 Microsoft.App/environments

  • 当使用有外部流入量的外部环境时,是通过基础结构的公共 IP 而不是通过子网来路由入站流量。

  • 容器应用自动保留 12 个 IP 地址用于与子网集成。 基础结构集成所需的 IP 地址数不会因环境的规模需求而异。 根据以下规则分配其他 IP 地址,具体取决于使用更多 IP 地址的工作负荷配置文件的类型,具体取决于环境的工作负荷配置文件:

  • 在单一修订模式下更改修订时,所需地址空间会在短时间内翻倍,以支持零故障时间部署。 对于给定的子网大小,这会影响其实际可用的受支持副本或节点。 下表显示了每个 CIDR 块的最大可用地址数,以及对横向缩放的影响。

    子网大小 可用 IP 地址1 最大节点数(专用型工作负载配置文件)2 最大副本数(消耗型工作负载配置文件)2
    /23 500 250 2,500
    /24 244 122 1,220
    /25 116 58 580
    /26 52 26 260
    /27 20 10 100

    1 可用 IP 地址数为子网大小减去 Azure 容器应用基础结构所需的 12 个 IP 地址。
    2 这是考虑到单一修订模式下的应用。

子网地址范围限制

子网地址范围不能与 Azure Kubernetes 服务保留的以下范围重叠:

  • 169.254.0.0/16
  • 172.30.0.0/16
  • 172.31.0.0/16
  • 192.0.2.0/24

此外,工作负载配置文件环境中保留以下地址:

  • 100.100.0.0/17
  • 100.100.128.0/19
  • 100.100.160.0/19
  • 100.100.192.0/19

使用 CLI 进行子网配置

创建容器应用环境时,需要为单个子网提供资源 ID。

如果使用 CLI,则定义子网资源 ID 的参数为 infrastructure-subnet-resource-id。 子网托管基础结构组件和用户应用容器。

如果对“仅消耗”环境使用 Azure CLI 并且已定义 platformReservedCidr 范围,则两个子网不得与 platformReservedCidr 中定义的 IP 范围重叠。

路由

用户定义的路由 (UDR)

工作负载配置文件环境支持用户定义的路由 (UDR) 和经 NAT 网关的受控流出量。 “仅消耗”环境中不支持这些功能。

注意

在 Azure 容器应用中 UDR 与 Azure 防火墙配合使用时,需要将某些 FQDN 和服务标记添加到防火墙的允许列表中。 若要了解详细信息,请参阅使用 Azure 防火墙配置 UDR

  • 你可以将 UDR 与工作负载配置文件环境结合使用,以通过 Azure 防火墙或其他网络设备限制从容器应用发出的出站流量。

  • UDR 配置是在容器应用环境范围之外完成的。

显示如何为容器应用实现 UDR 的示意图。

在创建虚拟网络时,Azure 将为虚拟网络创建一个默认路由表。 通过实现用户定义的路由表,可以控制流量在虚拟网络中的路由方式。 例如,你可以创建一个 UDR,用于将所有流量路由到防火墙。

使用 Azure 防火墙配置 UDR

仅在工作负载配置文件环境中支持用户定义的路由。 必须根据所使用的资源,将以下应用程序和网络规则添加到防火墙的允许列表中。

注意

有关如何为容器应用设置 UDR 以使用 Azure 防火墙限制出站流量的指南,请访问容器应用和 Azure 防火墙

应用程序规则

应用程序规则基于应用程序层允许或拒绝流量。 根据方案,需要以下出站防火墙应用程序规则。

方案 FQDN 说明
所有情况 mcr.microsoft.com*.data.mcr.microsoft.com 这些适用于 Microsoft 容器注册表 (MCR) 的 FQDN 由 Azure 容器应用使用,当将 Azure 容器应用与 Azure 防火墙结合使用时,必须将这些应用程序规则或 MCR 的网络规则添加到允许列表中。
Azure 容器注册表 (ACR) Your-ACR-address*.blob.core.chinacloudapi.cnlogin.microsoft.com 将 Azure 容器应用与 ACR 和 Azure 防火墙配合使用时,需要这些 FQDN。
Azure Key Vault Your-Azure-Key-Vault-addresslogin.microsoft.com 除了 Azure Key Vault 的网络规则所需的服务标记外,还需要这些 FQDN。
托管标识 *.identity.chinacloudapi.cnlogin.chinacloudapi.cn*.login.chinacloudapi.cn*.login.microsoft.com 将 Azure 容器应用与 ACR 和 Azure 防火墙配合使用时,需要这些 FQDN。
Docker Hub 注册表 hub.docker.comregistry-1.docker.ioproduction.cloudflare.docker.com 如果你正在使用 Docker Hub 注册表并希望通过防火墙访问它,则需要将这些 FQDN 添加到防火墙中。
网络规则

网络规则基于网络和传输层允许或拒绝流量。 根据方案,需要以下出站防火墙网络规则。

方案 服务标记 说明
所有情况 MicrosoftContainerRegistryAzureFrontDoorFirstParty 这些 Microsoft 容器注册表 (MCR) 的服务标记由 Azure 容器应用使用,在将 Azure 容器应用与 Azure 防火墙配合使用时,必须将这些网络规则或 MCR 的应用程序规则添加到允许列表中。
Azure 容器注册表 (ACR) AzureContainerRegistryAzureActiveDirectory 将 ACR 与 Azure 容器应用配合使用时,需要配置 Azure 容器注册表所使用的这些应用程序规则。
Azure Key Vault AzureKeyVaultAzureActiveDirectory 除了 Azure Key Vault 的应用程序规则的 FQDN 外,还需要这些服务标记。
托管标识 AzureActiveDirectory 将托管标识与 Azure 容器应用配合使用时,需要配置托管标识所使用的这些应用程序规则。

注意

对于与本文未列出的、与 Azure 防火墙一起使用的 Azure 资源,请参阅服务标记文档

NAT 网关集成

可以使用 NAT 网关来简化工作负载配置文件环境中虚拟网络中的出站 Internet 流量的出站连接。

在子网上配置 NAT 网关时,NAT 网关为环境提供静态公共 IP 地址。 来自容器应用的所有出站流量都通过 NAT 网关的静态公共 IP 地址进行路由。

环境安全

显示如何完全锁定容器应用的网络的示意图。

你可以执行以下操作,完全保护你的入口/出口网络流量:

  • 在工作负载配置文件环境中创建内部容器应用环境。 有关步骤,请参阅使用 Azure CLI 管理工作负荷配置文件。

  • 将容器应用与应用程序网关集成。

  • 配置 UDR 以通过 Azure 防火墙路由所有流量。

环境级别网络加密(预览版)

Azure 容器应用支持使用相互传输层安全性 (mTLS) 的环境级别网络加密。 如果需要端到端加密,mTLS 加密环境中应用程序之间传输的数据。

容器应用环境中的应用程序会自动进行身份验证。 但是,容器应用运行时不支持使用内置 mTLS 在应用程序之间进行访问控制的授权。

当应用在环境外部与客户端通信时,支持使用 mTLS 进行双向身份验证。 有关详细信息,请参阅配置客户端证书

注意

在高负载方案中,为你的应用程序启用 mTLS 可能会增加响应延迟并降低最大吞吐量。

可以使用以下命令启用 mTLS。

创建时:

az containerapp env create \
    --name <environment-name> \
    --resource-group <resource-group> \
    --location <location> \
    --enable-mtls

对于现有容器应用:

az containerapp env update \
    --name <environment-name> \
    --resource-group <resource-group> \
    --enable-mtls

DNS

  • 自定义 DNS:如果 VNet 使用自定义 DNS 服务器而非默认的 Azure 提供的 DNS 服务器,请将 DNS 服务器配置为将未解析的 DNS 查询转发给 168.63.129.16Azure 递归解析程序使用此 IP 地址解析请求。 配置 NSG 或防火墙时,请勿阻止 168.63.129.16 地址,否则你的容器应用环境将无法正常工作。

  • VNet 范围入口:如果你打算在内部使用 VNet 范围入口,请通过以下方式之一配置域:

    1. 非自定义域:如果不打算使用自定义域,请创建一个专用 DNS 区域,将容器应用环境的默认域解析为容器应用环境的静态 IP 地址。 可以使用 Azure 专用 DNS或自己的 DNS 服务器。 如果你使用 Azure 专用 DNS,请创建一个名为容器应用环境的默认域 (<UNIQUE_IDENTIFIER>.<REGION_NAME>.azurecontainerapps.dev.cn) 的专用 DNS 区域,其中包含一个 A 记录。 A 记录包含容器应用环境的名称 *<DNS Suffix> 和静态 IP 地址。

    2. 自定义域:如果计划使用自定义域并使用外部容器应用环境,请使用可公开解析的域将自定义域和证书添加到容器应用。 如果使用内部容器应用环境,则 DNS 绑定没有验证,因为只能从虚拟网络内部访问群集。 此外,创建将顶点域解析为容器应用环境的静态 IP 地址的专用 DNS 区域。 可以使用 Azure 专用 DNS或自己的 DNS 服务器。 如果使用 Azure 专用 DNS,请创建一个名为顶点域的专用 DNS 区域,其中包含指向容器应用环境的静态 IP 地址的 A 记录。

可以在 Azure 门户中查找容器应用环境的静态 IP 地址(位于容器应用页的“自定义 DNS 后缀”中,也可以使用 Azure CLI az containerapp env list 命令来查找。

托管的资源

在你将某个内部或外部环境部署到自己的网络中时,会在托管环境的 Azure 订阅中创建一个新资源组。 此资源组包含 Azure 容器应用平台管理的基础结构组件。 请勿修改此组中的服务或资源组本身。

工作负载配置文件环境

默认情况下,在托管环境的 Azure 订阅中创建的资源组名称以 ME_ 为前缀,在创建容器应用环境期间可以自定义该资源组的名称。

对于外部环境,该资源组包含一个专门用来与外部环境和负载均衡器建立入站连接的公共 IP 地址。 对于内部环境,该资源组仅包含负载均衡器

除了标准 Azure 容器应用账单,还需要为下列项付费:

  • 如果使用的是内部或外部环境,会有一个标准静态公共 IP 供出口使用。此外,如果使用的是外部环境,还会有一个标准静态公共 IP 供入口使用。 如果由于 SNAT 问题需要更多公共 IP,开具支持票证来请求替代

  • 一个标准负载均衡器

  • 处理的数据(以 GB 为单位)的成本包括管理操作的入口和出口。

“仅消耗”环境

默认情况下,在托管环境的 Azure 订阅中创建的资源组名称以 MC_ 为前缀,在创建容器应用期间无法自定义该资源组的名称。 该资源组包含一个专门用来与环境和负载均衡器建立出站连接的公共 IP 地址。

除了标准 Azure 容器应用账单,还需要为下列项付费:

  • 一个用于出口的标准静态公共 IP。 如果由于资源网络地址转换 (SNAT) 问题需要更多 IP,开具支持票证来请求替代

  • 如果使用的是内部环境,则有 2 个标准负载均衡器;如果使用的是外部环境,则有 1 个标准负载均衡器。 每个负载均衡器的规则少于 6 条。 处理的数据(以 GB 为单位)的成本包括管理操作的入口和出口。

后续步骤