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

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

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

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

重要

managedNATGatewayV2出站类型当前处于预览阶段。 有关适用于 beta 版、预览版或尚未正式发布的 Azure 功能的法律条款,请参阅 Azure 预览补充使用条款

先决条件

  • 请确保使用的是最新版本的 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 客户

使用托管 StandardV2 NAT 网关创建 AKS 群集(managedNATGatewayV2

重要

AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

  • 使用az aks create命令和参数创建具有托管 StandardV2 NAT 网关的 --outbound-type managedNATGateway--nat-gateway-outbound-ips--nat-gateway-outbound-ip-prefixes--nat-gateway-managed-outbound-ip-count--nat-gateway-managed-outbound-ipv6-count--nat-gateway-idle-timeoutAKS 群集。
  • 为 a managedNATgatewayV2配置出站 IP 时,请使用 以下方法之一。 不能同时使用Azure托管的出站 IP 和客户定义的出站 IP。
    • Azure托管 IP:使用--nat-gateway-managed-ip-outbound-count--nat-gateway-managed-outbound-ipv6-count让Azure代表你自动分配和管理出站公共 IP。
    • 客户自定义 IP:使用 --nat-gateway-outbound-ips--nat-gateway-outbound-ip-prefixes,引入您自己预配的公用 IP 地址或前缀,从而完全控制出站流量所使用的特定地址。 StandardV2 NAT 网关需要使用新的 StandardV2 公共 IP。 现有标准 SKU 公共 IP 不适用于 StandardV2 NAT 网关。

安装 aks-preview Azure CLI 扩展

managedNATGatewayV2出站类型当前处于预览阶段。 若要使用此出站类型,请安装aks-previewAzure CLI扩展并注册ManagedNATGatewayV2Preview功能标志。

使用 az extension addaz extension update 命令安装或更新 Azure CLI 预览扩展。 Azure CLI 扩展的最低 aks-preview 版本为 20.0.0b1

# Install the aks-preview extension
az extension add --name aks-preview

# Update the extension to make sure you have the latest version installed
az extension update --name aks-preview

注册 ManagedNATGatewayV2Preview 功能标志

  1. 使用 ManagedNATGatewayV2Preview 命令注册 az feature register 功能标志。

    az feature register --namespace "Microsoft.ContainerService" --name "ManagedNATGatewayV2Preview"
    
  2. 使用 az feature show 命令验证注册是否成功。 只需几分钟时间即可完成注册。

    az feature show --namespace "Microsoft.ContainerService" --name "ManagedNATGatewayV2Preview"
    

    在功能显示Registered后,使用Microsoft.ContainerService命令刷新az provider register资源提供程序的注册。

使用托管 StandardV2 NAT 网关创建 AKS 群集

以下命令将创建所需的资源组、用于附加到 NAT 网关的公共 IP 和公共 IP 前缀资源,以及一个具有托管 StandardV2 NAT 网关的 AKS 集群。

  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"
    export MY_AKS="myNatV2Cluster$RANDOM_SUFFIX"
    export MY_IP="myNatOutboundIP$RANDOM_SUFFIX"
    export MY_IP_PREFIX="myNatOutboundIPPrefix$RANDOM_SUFFIX"
    
    # Create the resource group
    az group create --name $MY_RG --location "eastus2"
    
  2. 使用 az network public-ip create 命令创建区域冗余 IPv4 公共 IP 地址和公共 IP 前缀。 将$MY_IP$MY_IP_PREFIX存储起来,作为托管 StandardV2 NAT 网关的出站 IP 使用。

    # Create a zone redundant IPv4 public IP address and store the ID to $MY_IP_ID for later use
    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)
    
    # Create a zone redundant IPv4 public IP prefix and store the ID to $MY_IP_PREFIX_ID for later use
    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)
    
  3. 使用 $MY_IP_ID 命令以及 $MY_IP_PREFIX_IDaz aks create--outbound-type managedNATGatewayV2 参数创建 AKS 群集,并引用公共 IP 地址(--nat-gateway-outbound-ips)和公共 IP 前缀(--nat-gateway-outbound-ip-prefixes)。

    az aks create \
        --resource-group $MY_RG \
        --name $MY_AKS \
        --node-count 3 \
        --outbound-type managedNATGatewayV2 \
        --nat-gateway-outbound-ips $MY_IP_ID \
        --nat-gateway-outbound-ip-prefixes $MY_IP_PREFIX_ID \
        --nat-gateway-idle-timeout 4 \
        --generate-ssh-keys
    

使用 az aks update 命令以及 --nat-gateway-outbound-ips--nat-gateway-outbound-ip-prefixes--nat-gateway-managed-outbound-count--nat-gateway-managed-outbound-ipv6-count--nat-gateway-idle-timeout 参数更新出站 IP、出站 IP 前缀、托管出站 IP 数量或空闲超时。 创建后,无法更新 A managedNATGatewayV2 以在客户定义和托管的出站 IP 地址之间进行切换。 出站 IP 配置在 StandardV2 NAT 网关初始创建时确定,且此后无法更改。

使用托管标准 NAT 网关创建 AKS 群集(managedNATGateway

  • 使用带有 az aks create--outbound-type managedNATGateway--nat-gateway-managed-outbound-ip-count 参数的 --nat-gateway-idle-timeout 命令创建具有托管的标准 NAT 网关的 AKS 群集。 如果希望 NAT 网关运行出特定的可用性区域,请使用 --zones指定区域。
  • 不能跨多个可用性区域使用托管 NAT 网关资源。 对于区域冗余出站连接,请考虑使用 managedNATgatewayV2
  • 如果在创建托管 NAT 网关时未指定区域,则默认情况下,NAT 网关将部署到 无区域 。 当 NAT 网关处于无区域时,Azure将资源置于区域中供你使用。 有关非区域部署模型的详细信息,请参阅 非区域 NAT 网关

使用 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 网关