为Azure Kubernetes 服务 (AKS)群集创建托管或用户分配的 NAT 网关

在 AKS 标准版中,如果需要群集的 AKS 托管出站连接,可以创建或配置托管 NAT 网关。 对于自带网络(BYO)场景,请使用用户分配的 NAT 网关。

虽然可以通过Azure 负载均衡器路由出口流量,但可以拥有的出站流量数量存在限制。 Azure NAT 网关支持每个 IP 地址最多 64,512 个出站 UDP 和 TCP 流量流,最多支持 16 个 IP 地址。 两种出站类型支持 NAT 网关: managedNATGateway 和 userAssignedNATGateway。

本文介绍如何为出站流量创建包含托管 NAT 网关和用户分配的 NAT 网关的 AKS 群集。 它还介绍如何为 Windows 禁用 OutboundNAT。

注意

从 API 版本 2026-06-01 开始,outboundType: managedNATGateway 默认为 StandardV2 NAT 网关,该网关显示为 natGatewayProfile.sku: StandardV2,而不是预览期间使用的 managedNATGatewayV2 出站类型。 预览版 API 版本2026-01-02-preview到2026-05-02-preview会继续接受managedNATGatewayV2大约一年,这为你提供了使用明确的managedNATGateway迁移到sku的时间。 有关预览 API 的弃用日期,请参阅 AKS 预览版 API 生命周期文档。

先决条件

  • 请确保使用的是最新版本的 Azure CLI。
  • 请确保使用的是 Kubernetes 版本 1.20.x 或更高版本。
  • 托管 NAT 网关与自定义虚拟网络不兼容。

重要

在非专用群集中,API 服务器群集流量是通过群集出站类型路由和处理的。 若要防止 API 服务器流量作为公共流量进行处理,请考虑使用 专用群集。

AKS 中的托管 NAT 网关

托管 NAT 网关是 AKS 管理的出站选项。 AKS 创建和管理 NAT 网关,为群集节点提供出站连接。

如果需要,请使用托管 NAT 网关:

  • 由 AKS 管理的出站连接,运维开销更低。
  • 生产友好型默认出站路径。
  • 比客户管理的 NAT 网关部署更简单的出口管理。
  • 标准 AKS 网络模型,无需自带 NAT 网关资源。

创建带有托管 NAT 网关的 AKS 群集

出站 IP 参数

下表描述了每个出站 IP 参数以及何时使用它:

参数 输入 IP 版本 谁管理公共 IP
--nat-gateway-managed-outbound-ip-count [1, 16] 范围内的值。 NAT 网关出站连接所需的期望出站 IPv4 数量。 IPv4 蔚蓝
--nat-gateway-managed-outbound-ipv6-count [1, 16] 范围内的值。 NAT 网关出站连接的期望 IPv6 数量。 IPv6 蔚蓝
--nat-gateway-outbound-ips 逗号分隔用于 NAT 网关出站连接的公共 IP 资源 ID。 IPv4 或 IPv6 客户
--nat-gateway-outbound-ip-prefixes 用于 NAT 网关出站连接的公共 IP 前缀资源 ID(逗号分隔)。 IPv4 或 IPv6 客户

选择托管 NAT 网关 SKU

从 API 版本2026-06-01开始,managedNATGateway支持StandardV2和Standard SKU,直到networkProfile.natGatewayProfile.sku。 当请求使用此 API 版本或更高版本时,StandardV2 是受支持区域中新群集的默认值。 使用早期 API 版本的请求保留现有的标准行为。

Scenario Behavior
未指定 SKU 的新群集 如果可用,则默认为 StandardV2。 AKS 在应用默认值之前验证区域可用性。 在 StandardV2 不可用的区域,AKS 使用 Standard。
现有标准集群 继续使用该 NAT 网关资源。 API 版本 2026-06-01 及更高版本将只读 natGatewayProfile.sku 属性作为 Standard 返回。
从标准升级到 StandardV2 将 networkProfile.natGatewayProfile.sku 设置为 StandardV2。
从 StandardV2 降级到 Standard 不支持。

建议使用 StandardV2 NAT 网关,因为它默认为区域冗余,并提供更高的带宽和吞吐量。 StandardV2 需要 StandardV2 公共 IP 地址和前缀。 现有的标准 SKU 公共 IP 资源与 StandardV2 NAT 网关不兼容。 查看 StandardV2 NAT 网关的关键限制,了解当前不受支持的区域列表。

StandardV2 公共 IP 要求仅适用于 NAT 网关的出站 IP。 为 type: LoadBalancer Services 提供服务的 AKS 托管负载均衡器仍然是标准负载均衡器,并且需要标准公共 IP。 如果您预先预配了带标记的公共 IP 库存,请同时规划这两种 SKU:用于 NAT 网关出站的 StandardV2,以及用于入站服务的 Standard。

托管 NAT 网关 SKU 功能

出站 managedNATGateway 类型支持不同的功能,具体取决于 networkProfile.natGatewayProfile.sku 的值。

Capability StandardV2 Standard
新群集的默认值 除非客户明确选择 Standard,否则在可用情况下默认使用。 在显式选择或 StandardV2 在区域中不可用时使用。
可用区行为 默认采用区域冗余。 区域或非区域,具体取决于群集配置。
Azure托管的出站 IPv4 地址 Supported. Supported.
Azure托管的出站 IPv6 地址 Supported. 不支持。
客户定义的出站 IP 地址和前缀 支持 StandardV2 公共 IP 地址和前缀。 AKS 管理的 NAT 网关不支持此功能。

创建 AKS 群集

通过运行带有 --outbound-type managedNATGateway 参数的 az aks create 命令来创建 AKS 群集。 AKS 在受支持区域默认使用 StandardV2 SKU,在不受支持区域默认使用 Standard SKU。

az aks create \
    --resource-group <resource-group> \
    --name <cluster-name> \
    --location <location> \
    --outbound-type managedNATGateway \
    --nat-gateway-managed-outbound-ip-count 1 \
    --generate-ssh-keys

重要

可以将现有的托管标准 NAT 网关升级到 StandardV2,但无法将托管 StandardV2 NAT 网关降级到标准版。

为托管 StandardV2 NAT 网关配置出站 IP

在可用的 StandardV2 区域中,使用以下方法 之一 配置出站地址。 不能同时使用 Azure 托管的出站 IP 配置和客户定义的出站 IP 配置。

使用 Azure 托管的 IP

使用 managedOutboundIPProfile 让 AKS 分配和管理出站公共 IPv4 和 IPv6 地址。

{
  "properties": {
    "networkProfile": {
      "outboundType": "managedNATGateway",
      "natGatewayProfile": {
          "managedOutboundIPProfile": {
          "count": 1,
          "countIPv6": 1
        }
      }
    }
  }
}

使用客户定义的 IP 和前缀

使用 outboundIPs 和 outboundIPPrefixes 来提供预先创建的公共 IP 地址或前缀。 这些资源必须使用 StandardV2 SKU。 现有的标准 SKU 公共 IP 地址和前缀与 StandardV2 NAT 网关不兼容。

  1. 创建区域冗余 StandardV2 公共 IP 地址和公共 IP 前缀。

    export MY_IP_ID=$(az network public-ip create \
        --resource-group $MY_RG \
        --name $MY_IP \
        --location chinanorth3 \
        --sku StandardV2 \
        --allocation-method Static \
        --version IPv4 \
        --zone 1 2 3 \
        --query publicIp.id \
        --output tsv)
    
    export MY_IP_PREFIX_ID=$(az network public-ip prefix create \
        --resource-group $MY_RG \
        --name $MY_IP_PREFIX \
        --location eastus2 \
        --length 31 \
        --sku StandardV2 \
        --version IPv4 \
        --zone 1 2 3 \
        --query id \
        --output tsv)
    
  2. 在支持 StandardV2 NAT 网关的区域部署托管 NAT 网关出站类型,并在 AKS 群集配置中引用公共 IP 地址和前缀。

    {
      "properties": {
        "networkProfile": {
          "outboundType": "managedNATGateway",
          "natGatewayProfile": {
            "outboundIPs": {
              "publicIPs": [
                "<standard-v2-public-ip-resource-id>"
              ]
            },
            "outboundIPPrefixes": {
              "publicIPPrefixes": [
                "<standard-v2-public-ip-prefix-resource-id>"
              ]
            }
          }
        }
      }
    }
    

最初创建 StandardV2 NAT 网关时,将确定出站 IP 所有权模型。 可以在所选模型中更改单个出站 IP 资源,但无法将现有 NAT 网关的出站 IP 在 Azure 托管和客户定义之间切换。 也不能更改 NAT 网关 SKU。 不支持从 StandardV2 降级到 Standard。

使用 userAssignedNatGateway 创建 AKS 群集

此配置需要自备网络(通过 Azure CNI),并且需要在子网上预先配置NAT网关。 Standard 和 StandardV2 NAT 网关均支持此 outbound-type。 以下命令创建所需的资源,以便为 AKS 群集部署 StandardV2 NAT 网关资源。

  1. 使用 az group create 命令创建资源组。

    # Set environment variables for resource group, AKS cluster, public IP, and public IP prefix names
    export RANDOM_SUFFIX=$(openssl rand -hex 3)
    export MY_RG="myResourceGroup$RANDOM_SUFFIX"
    
    # Create the resource group
    az group create --name $MY_RG --location southcentralus
    
  2. 为网络权限创建托管标识,并将 ID $IDENTITY_ID 存储在其中供以后使用。

    export IDENTITY_NAME="myNatClusterId$RANDOM_SUFFIX"
    export IDENTITY_ID=$(az identity create \
        --resource-group $MY_RG \
        --name $IDENTITY_NAME \
        --location southcentralus \
        --query id \
        --output tsv)
    

    示例输出:

    /xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myNatClusterIdxxx
    
  3. 使用 az network public-ip create 命令为 NAT 网关创建 StandardV2 公共 IP。 StandardV2 NAT 网关需要 StandardV2 公共 IP 地址。

    export PIP_NAME="myNatGatewayPip$RANDOM_SUFFIX"
    az network public-ip create \
        --resource-group $MY_RG \
        --name $PIP_NAME \
        --location southcentralus \
        --allocation-method Static \
        --version IPv4 \
        --zone 1 2 3 \
        --sku standard-v2
    
  4. 使用 az network nat gateway create 命令创建 StandardV2 NAT 网关。

    export NATGATEWAY_NAME="myNatGateway$RANDOM_SUFFIX"
    az network nat gateway create \
        --resource-group $MY_RG \
        --name $NATGATEWAY_NAME \
        --location southcentralus \
        --public-ip-addresses $PIP_NAME \
        --sku StandardV2
        --idle-timeout 4
    

    重要

    若要确保区域冗余,请部署一个标准 V2 NAT 网关资源,该资源跨越区域中的多个可用性区域。 即使单个区域发生故障,此配置也能确保持续建立出站连接。 有关 StandardV2 NAT 网关及其优势的更多详细信息,请参阅 StandardV2 NAT 网关。 相比之下,标准 NAT 网关资源仅在部署它的可用性区域中提供复原能力。

  5. 使用 az network vnet create 命令创建虚拟网络。

    export VNET_NAME="myVnet$RANDOM_SUFFIX"
    az network vnet create \
        --resource-group $MY_RG \
        --name $VNET_NAME \
        --location southcentralus \
        --address-prefixes 172.16.0.0/20 
    
  6. 使用 NAT 网关在虚拟网络中创建子网,并将 ID 存储到 $SUBNET_ID 中供稍后使用。

    export SUBNET_NAME="myNatCluster$RANDOM_SUFFIX"
    export SUBNET_ID=$(az network vnet subnet create \
        --resource-group $MY_RG \
        --vnet-name $VNET_NAME \
        --name $SUBNET_NAME \
        --address-prefixes 172.16.0.0/22 \
        --nat-gateway $NATGATEWAY_NAME \
        --query id \
        --output tsv)
    
  7. 使用 az aks create 命令通过具有 NAT 网关和托管标识的子网创建 AKS 群集。

    export AKS_NAME="myNatCluster$RANDOM_SUFFIX"
    az aks create \
        --resource-group $MY_RG \
        --name $AKS_NAME \
        --location southcentralus \
        --network-plugin azure \
        --vnet-subnet-id $SUBNET_ID \
        --outbound-type userAssignedNATGateway \
        --assign-identity $IDENTITY_ID \
        --generate-ssh-keys
    

生产注意事项

在生产环境中使用托管 NAT 网关时,请规划出站流量行为、API 服务器访问和工作负荷复原能力。

  • 如果希望为大多数 AKS 工作负载推荐的生产就绪默认值,请使用 AKS 自动。
  • 如果希望 AKS 托管的出站连接不带自己的 NAT 网关,请在 AKS 标准版中使用托管 NAT 网关。
  • 若要减少 API 服务器流量的公开,请使用专用群集或 API 服务器 VNet 集成。
  • 在上线之前查看出站 IP 要求。
  • 如果工作负荷依赖于固定的出站地址,请在部署之前验证托管 NAT 网关是否满足这些要求。
  • 如果需要独立于 AKS 管理 NAT,请使用用户分配的 NAT 网关。

禁用Windows的出站NAT

Windows 出站 NAT 可能导致 AKS Pod 遇到某些连接和通信问题。 一个示例问题是节点端口重用。 在此示例中,Windows OutboundNAT 使用端口将 Pod IP 转换为Windows节点主机 IP,这可能会导致由于端口耗尽问题导致与外部服务的连接不稳定。

默认情况下,Windows启用 OutboundNAT。 现在可以在创建新的Windows代理池时手动禁用出站NAT。

先决条件和限制

  • 需要一个版本为 v1.26 或更高版本的现有 AKS 群集。 如果使用的是 Kubernetes 版本 1.25 或更高版本, 请更新部署配置。
  • 无法将集群出站类型设置为 LoadBalancer。 可以将它设置为 NAT 网关或 UDR:
    • NAT 网关:NAT 网关自动处理 NAT 连接,比标准负载均衡器更强大。 使用此选项可能会产生额外的费用。
    • UDR (UserDefinedRouting):配置传递规则时,必须牢记端口限制。
    • 若要从负载均衡器切换到 NAT 网关,可以将 NAT 网关添加到 VNet 或运行 az aks upgrade 以更新出站类型。

注意

UserDefinedRouting 具有以下限制:

  • 通过负载均衡器进行的 SNAT(必须使用默认的 OutboundNAT)在主机 IP 上有 64 个端口可用。
  • 由 Azure 防火墙 提供的 SNAT(禁用 OutboundNAT)每个公共 IP 地址有 2,496 个端口。
  • 通过 NAT 网关进行的 SNAT(禁用 OutboundNAT)每个公共 IP 可用 64,512 个端口。
  • 如果Azure 防火墙端口范围不足以用于应用程序,则需要使用 NAT 网关。
  • 当目标 IP 地址位于由 IANA RFC 1918 或 IANA RFC 6598 定义的专用 IP 地址范围内时,Azure 防火墙不会对网络规则进行 SNAT。

手动禁用 Windows 的 OutboundNAT

  • 使用带有 az aks nodepool add 标志的 --disable-windows-outbound-nat 命令创建新的Windows代理池时,手动禁用Windows的出站NAT。

    注意

    可以使用现有的 AKS 群集,但可能需要更新出站类型并添加节点池以启用 --disable-windows-outbound-nat。

    export WIN_NODEPOOL_NAME="win$(head -c 1 /dev/urandom | xxd -p)"
    az aks nodepool add \
        --resource-group $MY_RG \
        --cluster-name $MY_AKS \
        --name $WIN_NODEPOOL_NAME \
        --node-count 3 \
        --os-type Windows \
        --disable-windows-outbound-nat
    

    示例输出:

    {
      "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.ContainerService/managedClusters/myNatClusterxxx/agentPools/mynpxxx",
      "name": "mynpxxx",
      "osType": "Windows",
      "provisioningState": "Succeeded",
      "resourceGroup": "myResourceGroupxxx",
      "type": "Microsoft.ContainerService/managedClusters/agentPools"
    }
    

有关Azure NAT 网关的详细信息,请参阅 Azure NAT 网关。