3. 环境规划与网络设计

容器应用平台能否稳定上线,往往不取决于镜像本身,而取决于网络边界是否被提前规划清楚。Azure 容器应用(Azure Container Apps,简称 ACA)运行在托管环境中,但它并不是一个“网络黑盒”:通过虚拟网络集成,你可以把环境放进自己的 VNet,让容器应用与数据库、缓存、内部服务、本地数据中心处在同一套可治理的地址空间里。本节围绕生产级网络拓扑,讲清四件事:环境如何接入 VNet、子网如何委派、私有终结点如何暴露 PaaS 服务、入站与出站流量分别走哪条路径。

一、先分清两种环境:外部环境与内部环境

ACA 环境在创建时就要决定入站可达性。外部环境(External)会获得一个公网可解析的入口,适合面向互联网的 API 或前端;内部环境(Internal)只在 VNet 内可达,适合内部微服务、后台任务和只允许内网访问的业务系统。这个选择直接决定后续 DNS、入口证书和访问控制策略,因此应在环境规划阶段确定,而不是等应用部署后再改。

当环境启用 VNet 集成后,ACA 会在你指定的子网中注入基础设施组件,容器实例的出站流量默认经由该子网进入 VNet,再按路由和防火墙规则出网。这意味着:子网不是随便挑一个空网段,而是整个平台出站行为的起点。

二、子网委派:把子网“交给”容器应用

VNet 集成要求使用一个委派给 Microsoft.App/environments 的专用子网。委派的作用是声明该子网由容器应用环境独占管理,避免其他资源(如虚拟机、负载均衡器)占用同一地址空间导致冲突。规划时建议:

  • 子网前缀至少 /27(32 个地址)起步,生产环境建议 /24 或更大,为环境基础设施和后续扩容留余量;
  • 该子网只用于 ACA 环境,不与业务子网、数据库子网混用;
  • 子网所在 VNet 的地址空间要与本地网络、其他 VNet 不重叠,否则对等互联和 VPN 会失败;
  • 委派在创建环境前完成,创建后子网类型不可随意更改。

下面这张图给出一个典型生产拓扑:左侧是 VNet 地址空间,中间是委派子网与私有终结点子网,右侧是入站与出站两条流量路径。

VNet 10.10.0.0/16 委派子网 snet-aca 10.10.1.0/24 委派: Microsoft.App/environments ACA 环境基础设施 容器实例出站起点 独占,不与业务混用 私有终结点子网 10.10.2.0/24 PE: SQL / Redis / ACR privateLinkService DNS 解析到 10.10.2.x 禁用公网访问 业务子网 10.10.3.0/24 VM / 跳板机 / 网关 运维与对等互联入口 出站路径 UDR → 防火墙 / NAT 0.0.0.0/0 下一跳 受控出网,记录日志 入站流量路径 Internet / 内网客户端 → 环境入口 (Envoy) → 应用 Ingress / 端口 → 容器副本 外部环境走公网,内部环境走 VNet PaaS 私有访问 Azure SQL / Redis / ACR 经私有终结点,不经公网 私有 DNS 区域解析 出站流量 私有终结点 入站请求 规划要点:地址不重叠 · 子网委派独占 · 私有终结点集中管理 · 出站统一经防火墙审计 DNS 统一走私有解析区,避免应用同时解析到公网与私网地址

三、私有终结点:让 PaaS 服务只在内网可达

生产环境里,数据库、缓存、镜像仓库通常不应暴露公网。私有终结点(Private Endpoint)会在你指定的子网中为 PaaS 服务分配一个私有 IP,并把该服务的访问入口从公网切换到 VNet 内部。以 Azure SQL 为例,典型做法是:

  1. 在 10.10.2.0/24 子网创建 SQL Server 的私有终结点,得到 10.10.2.4 之类的私有 IP;
  2. 在私有 DNS 区域 privatelink.database.windows.net 中注册 A 记录,使 myserver.database.windows.net 解析到该私有 IP;
  3. 把 SQL Server 的公共网络访问设为 Disabled,只保留私有终结点;
  4. 容器应用通过连接字符串访问,解析结果落在 VNet 内,流量不出公网。

这里最容易出问题的是 DNS。如果 VNet 没有关联私有 DNS 区域,容器仍会解析到公网地址,私有终结点就形同虚设。因此建议把私有 DNS 区域集中管理,并通过 VNet 链接关联到容器环境所在 VNet。

四、入站与出站:两条路径要分别治理

入站路径由环境入口统一承接。外部环境的入口暴露在公网,请求先到环境级 Envoy 入口,再按应用 Ingress 配置转发到具体容器端口;内部环境的入口只在 VNet 内可达,适合内部调用。入站治理的重点是:只暴露必要端口、启用 HTTPS、按应用配置访问控制,而不是让每个容器各自对外。

出站路径从委派子网出发。默认情况下,容器出站流量经 VNet 的默认路由出网;生产环境通常通过用户定义路由(UDR)把 0.0.0.0/0 指向 Azure 防火墙或 NAT 网关,实现统一出口、固定源 IP 和出站审计。例如:

# 出站路由示例(UDR)
AddressPrefix: 0.0.0.0/0
NextHopType: VirtualAppliance
NextHopIpAddress: 10.10.4.4   # Azure 防火墙私有 IP

# 容器访问私有终结点时,走 VNet 内部路由,不匹配 0.0.0.0/0
# 因此私有终结点流量不会被强制绕行防火墙,除非显式配置

需要注意:如果出站被强制到防火墙,而私有终结点的流量也被错误地引向防火墙,可能导致解析或连接异常。规划时应让私有终结点子网与委派子网之间的流量走 VNet 本地路由,仅把真正需要出公网的流量交给防火墙。

五、生产级拓扑的落地检查

把上述要素组合起来,一个可落地的生产拓扑通常包含:一个不重叠的 VNet 地址空间;一个委派给 Microsoft.App/environments 的 /24 子网;一个专用于私有终结点的子网;一个用于运维和网关的业务子网;出站经防火墙或 NAT 统一出口;私有 DNS 区域关联到 VNet。上线前建议逐项确认:

检查项判断标准
子网委派委派类型为 Microsoft.App/environments,且子网未被其他资源占用
地址空间与本地网络、其他 VNet 无重叠
私有终结点 DNS从容器内解析 PaaS 域名得到 10.10.2.x 私有 IP
出站路径容器访问公网时源 IP 为防火墙/NAT 出口 IP,日志可查
入站暴露面仅必要应用开放入口,内部服务使用内部环境
规划顺序建议:先定地址空间与子网划分,再创建委派子网和私有终结点子网,随后配置私有 DNS 与出站路由,最后创建容器应用环境并部署应用。顺序颠倒会导致环境创建后难以调整网络边界。

网络设计不是一次性任务。随着应用数量增长,你可能需要新增私有终结点、调整出站策略或接入更多 VNet。把子网、DNS、路由和入口策略作为环境级基线固定下来,后续扩容才不会反复推翻拓扑。