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

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

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

本文介绍如何为出站流量创建包含托管 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)

managedNATGatewayV2 使用 StandardV2 NAT 网关 SKU。 有关与标准 NAT 网关 SKU 相比的差异和增强功能的详细信息,请参阅 Azure NAT 网关 SKU。 以下章节介绍如何使用 managedNATGatewayV2 创建 AKS 群集。

重要

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

  • 使用 az aks create 命令以及 --nat-gateway-managed-outbound-ip-count、--nat-gateway-idle-timeout、--outbound-type managedNATGatewayV2、--nat-gateway-outbound-ips、--nat-gateway-outbound-ip-prefixes 和 --nat-gateway-managed-outbound-ipv6-count 参数创建具有托管 StandardV2 NAT 网关的 AKS 群集。
  • 为 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 add 或 az 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_ID、az 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 网关。