为 Azure Kubernetes 服务 (AKS) 群集创建托管或用户分配的 NAT 网关
虽然你可以通过 Azure 负载均衡器路由出口流量,但可以创建的出站流量的流数量有限制。 Azure NAT 网关允许每个 IP 地址最多 64,512 个出站 UDP 和 TCP 流量流,并且最多只能有 16 个 IP 地址。
本文介绍了如何创建一个带有托管 NAT 网关和用户分配的 NAT 网关的 Azure Kubernetes 服务 (AKS) 集群,用于处理出口流量。 它还演示了如何在 Windows 上禁用 OutboundNAT。
开始之前
- 确保使用最新版本的 Azure CLI。
- 请确保使用的是 Kubernetes 版本 1.20.x 或更高版本。
- 托管 NAT 网关与自定义虚拟网络不兼容。
重要
在非专用群集中,API 服务器群集流量是通过群集出站类型路由和处理的。 要防止将 API 服务器流量作为公共流量进行处理,请考虑使用专用群集,或查看 API 服务器 VNet 集成功能。
创建带有托管 NAT 网关的 AKS 群集
使用带有
--outbound-type managedNATGateway
、--nat-gateway-managed-outbound-ip-count
、--nat-gateway-idle-timeout
参数的az aks create
命令创建具有新的托管 NAT 网关的 AKS 群集。 如果希望 NAT 网关从特定可用性区域运行,请使用--zones
指定区域。如果在创建托管 NAT 网关时未指定任何区域,则默认情况下,NAT 网关将部署到“无区域”。 将 NAT 网关放置在“无区域”中时,Azure 会将资源放置在某个区域中。 有关非区域性部署模型的详细信息,请参阅非区域性 NAT 网关。
托管 NAT 网关资源不能跨多个可用性区域使用。
az aks create \ --resource-group myResourceGroup \ --name myNatCluster \ --node-count 3 \ --outbound-type managedNATGateway \ --nat-gateway-managed-outbound-ip-count 2 \ --nat-gateway-idle-timeout 4 \ --generate-ssh-keys
使用带
--nat-gateway-managed-outbound-ip-count
或--nat-gateway-idle-timeout
参数的az aks update
命令更新出站 IP 地址或空闲超时。az aks update \ --resource-group myResourceGroup \ --name myNatCluster\ --nat-gateway-managed-outbound-ip-count 5
创建带有用户分配的 NAT 网关的 AKS 群集
此配置需要自带网络(通过 Kubenet 或 Azure CNI),并且需要在子网中预配置 NAT 网关。 以下命令为此方案创建所需的资源。
使用
az group create
命令创建资源组。az group create --name myResourceGroup \ --location chinaeast2
创建托管标识以获取网络权限,并将 ID 存储到
$IDENTITY_ID
中供稍后使用。IDENTITY_ID=$(az identity create \ --resource-group myResourceGroup \ --name myNatClusterId \ --location chinaeast2 \ --query id \ --output tsv)
使用
az network public-ip create
命令为 NAT 网关创建公共 IP。az network public-ip create \ --resource-group myResourceGroup \ --name myNatGatewayPip \ --location chinaeast2 \ --sku standard
使用
az network nat gateway create
命令创建 NAT 网关。az network nat gateway create \ --resource-group myResourceGroup \ --name myNatGateway \ --location chinaeast2 \ --public-ip-addresses myNatGatewayPip
重要
单个 NAT 网关资源不能跨多个可用性区域使用。 为了确保区域复原能力,建议将 NAT 网关资源部署到每个可用性区域,并分配给每个区域中包含 AKS 群集的子网。 有关此部署模型的详细信息,请参阅每个区域的 NAT 网关。 如果未为 NAT 网关配置任何区域,则默认区域放置为“无区域”,其中 Azure 会将 NAT 网关放入一个区域中。
使用
az network vnet create
命令创建虚拟网络。az network vnet create \ --resource-group myResourceGroup \ --name myVnet \ --location chinaeast2 \ --address-prefixes 172.16.0.0/20
使用 NAT 网关在虚拟网络中创建子网,并将 ID 存储到
$SUBNET_ID
中供稍后使用。SUBNET_ID=$(az network vnet subnet create \ --resource-group myResourceGroup \ --vnet-name myVnet \ --name myNatCluster \ --address-prefixes 172.16.0.0/22 \ --nat-gateway myNatGateway \ --query id \ --output tsv)
使用
az aks create
命令通过具有 NAT 网关和托管标识的子网创建 AKS 群集。az aks create \ --resource-group myResourceGroup \ --name myNatCluster \ --location chinaeast2 \ --network-plugin azure \ --vnet-subnet-id $SUBNET_ID \ --outbound-type userAssignedNATGateway \ --assign-identity $IDENTITY_ID \ --generate-ssh-keys
为 Windows 禁用 OutboundNAT
Windows OutboundNAT 可能导致 AKS Pod 出现某些连接和通信问题。 一个示例问题是节点端口重用。 在此示例中,Windows OutboundNAT 使用端口将 Pod IP 转换为 Windows 节点主机 IP,这可能会因端口耗尽问题而导致与外部服务的连接不稳定。
Windows 默认会启用 OutboundNAT。 现在可以在创建新的 Windows 代理池时手动禁用 OutboundNAT。
先决条件
- 具有 v1.26 或更高版本的现有 AKS 群集。 如果使用的是 Kubernetes 1.25 或更低版本,则需要更新部署配置。
限制
- 无法将群集出站类型设置为 LoadBalancer。 可以将它设置为 Nat 网关或 UDR:
- NAT 网关:NAT 网关可以自动处理 NAT 连接,并且比标准负载均衡器更强大。 此选项可能会产生额外费用。
- UDR (UserDefinedRouting):配置传递规则时,必须牢记端口限制。
- 如果需要从负载均衡器切换到 NAT 网关,则可以将 NAT 网关添加到 VNet 中,或运行
az aks upgrade
以更新出站类型。
注意
UserDefinedRouting 具有以下限制:
- Azure 负载均衡器的 SNAT(必须使用默认 OutboundNAT)具有“主机 IP 上的 64 个端口”。
- Azure 防火墙的 SNAT(禁用 OutboundNAT)对每个公共 IP 有 2496 个端口。
- NAT 网关的 SNAT(禁用 OutboundNAT)对每个公共 IP 有 64512 个端口。
- 如果 Azure 防火墙端口范围对于应用程序来说不够用,则需要使用 NAT 网关。
- 如果目标 IP 地址在符合 IANA RFC 1918 的专用 IP 地址范围内或符合 IANA RFC 6598 的共享地址空间内,Azure 防火墙将不使用网络规则执行 SNAT。
手动为 Windows 禁用 OutboundNAT
在使用带有
--disable-windows-outbound-nat
标记的az aks nodepool add
命令创建新的 Windows 代理池时,可以手动为 Windows 禁用 OutboundNAT。注意
可以使用现有的 AKS 群集,但可能需要更新出站类型并添加节点池以启用
--disable-windows-outbound-nat
。az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myNatCluster \ --name mynp \ --node-count 3 \ --os-type Windows \ --disable-windows-outbound-nat
后续步骤
有关 Azure NAT 网关的详细信息,请参阅 Azure NAT 网关。