在 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)
重要
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 网关。
-
Azure托管 IP:使用
安装 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 功能标志
使用
ManagedNATGatewayV2Preview命令注册az feature register功能标志。az feature register --namespace "Microsoft.ContainerService" --name "ManagedNATGatewayV2Preview"使用
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 集群。
使用
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"使用
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)使用
$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 网关资源。
使用
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为网络权限创建托管标识,并将 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使用
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使用
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 网关资源仅在部署它的可用性区域中提供复原能力。
使用
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使用 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)使用
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 网关。