传统 CNI 的一个缺点是,随着 AKS 群集的增长,Pod IP 地址将耗尽,导致需要在更大的子网中重建整个群集。 Azure CNI 中新的动态 IP 分配功能通过从独立于托管 AKS 群集子网的另一子网分配 Pod IP,从而解决了这一问题。
这能带来以下好处:
- 更高的 IP 利用率:IP 会从 Pod 子网动态分配给集群中的 Pod。 与传统的 CNI 解决方案相比,此方法可更好地利用群集中的 IP,后者对每个节点进行静态分配 IP。
- 可缩放且灵活:可以独立缩放节点和 Pod 子网。 单个 Pod 子网可以在群集的多个节点池之间或在同一 VNet 中部署的多个 AKS 群集之间共享。 你还可以为节点池配置单独的 Pod 子网。
- 高性能:由于为 Pod 分配了虚拟网络 IP,因此它们已直接连接到 VNet 中的其他群集 Pod 和资源。 该解决方案支持配置 VNet IP 地址限制内的大型群集,而不会降低性能。
- 用于 Pod 的单独 VNet 策略:由于 Pod 具有单独的子网,因此你可以单独为它们配置不同于节点策略的 VNet 策略。 此配置支持许多有用的方案,例如仅允许 Pod 的 Internet 连接,而不是用于节点,使用 Azure NAT 网关 修复节点池中 Pod 的源 IP,以及使用网络安全组(NSG)筛选节点池之间的流量。
- Kubernetes 网络策略:对于 Linux 节点池,请使用由 Cilium 提供支持的 CNI Azure。 对于Windows节点池,请使用 Calico。 Azure网络策略管理器(NPM)支持于 2026 年 9 月 30 日结束,适用于 Windows 节点,2028 年 9 月 30 日为 Linux 节点。 新订阅无法再启用Azure NPM。 有关详细信息,请参阅 AKS 中的网络策略选项。
本文介绍如何在 AKS 中使用 Azure CNI Pod 子网 - 动态 IP 分配和增强的子网支持。
先决条件
查看在 AKS 中配置基本 Azure CNI 网络的先决条件,因为相同的先决条件适用于本文。
不支持 AKS Engine 和自建群集。
Azure CLI 版本为
2.37.0或更高版本。除非使用网络隔离群集,否则虚拟网络必须允许与所需的 AKS 终结点建立出站连接。
如果使用由你管理的虚拟网络,则群集标识必须在节点和 Pod 子网上具有“网络参与者”权限。 节点子网不能委托。
如果你有现有群集,则需要启用容器见解来监视 IP 子网使用情况。 可以使用以下命令启用 Container Insights
az aks enable-addons,如以下示例所示:RESOURCE_GROUP_NAME="<resource-group-name>" CLUSTER_NAME="<cluster-name>" az aks enable-addons --addons monitoring --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME
局限性
- 动态 IP 分配最多支持 Pod 子网
/16。 由于Azure地址映射限制,大型群集还可以限制为大约 65,000 个 Pod。 若要超出这些限制,请使用 Azure CNI Pod 子网 - 静态块分配。 - 节点自动预配(NAP)不支持Azure具有动态 IP 分配的 CNI Pod 子网。
计划 IP 寻址
使用此功能规划 IP 寻址要简单得多。 由于节点和 Pod 是独立缩放的,因此也可以单独计划其地址空间。 由于可以将 Pod 子网配置为节点池的粒度,因此你在添加节点池时始终可以添加新的子网。 群集/节点池中的系统 Pod 也会从 Pod 子网中接收 IP,因此需要考虑此行为。
将 IP 分批分配给 16 个节点。 节点在启动时会请求 16 个 IP,并且当其分配额度中未分配的 IP 少于 8 个时,会再请求一批 16 个 IP。 确定 Pod 子网大小时,请考虑每个节点的最大 Pod 数、最大节点数、升级期间的激增节点以及预期的扩缩容需求。 还应预留额外容量,以应对删除 Pod 到释放其 IP 地址之间的延迟。 有关详细信息,请参阅 升级和缩放注意事项。
Kubernetes 服务和 Docker 桥的 IP 计划保持不变。
若要查看并验证负责这些 IP 分配的 NodeNetworkConfiguration (NNC) 资源,可以运行以下命令:
kubectl get nodenetworkconfigs -n kube-system -o wide
具有 Pod 子网的群集中每个节点的最大 Pod 数 - 动态 IP 分配和增强的子网支持
使用 Azure CNI Pod 子网时,每个节点的 Pod 值 - 动态 IP 分配与传统的 CNI 行为略有不同:
| CNI | 默认 | 可在部署时配置 |
|---|---|---|
| 传统 Azure CNI | 30 | 是(最大 250) |
| Azure CNI Pod 子网 - 动态 IP 分配 | 110 | 是(最大 250) |
可以在创建群集或添加节点池时进行配置 --max-pods ,最大 AKS 最大为 250。 有关最小值和其他要求,请参阅 每个节点的最大 Pod 数。
部署参数
使用 --network-plugin azure 启用 Azure CNI。 该 --node-count 参数设置初始节点数,并 --max-pods 设置每个节点上的最大 Pod 数。 以下子网参数不同于基本Azure CNI 网络:
- 子网参数是指托管 AKS 群集节点的节点子网。
- 使用其他参数 Pod 子网 指定其 IP 地址动态分配给 Pod 的子网。
使用 Azure CLI 配置动态 IP 分配
以下步骤使用单独的节点和 Pod 子网创建虚拟网络,然后使用具有动态 IP 分配的 Azure CNI Pod 子网部署 AKS 群集。 运行这些命令之前,请确认 Azure CLI 当前使用的是你要在其中创建资源的订阅。
创建包含两个子网的虚拟网络。
RESOURCE_GROUP_NAME="myResourceGroup"
VNET_NAME="myVirtualNetwork"
LOCATION="chinanorth3"
SUBNET_NAME_1="nodesubnet"
SUBNET_NAME_2="podsubnet"
# Create the resource group
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
# Create our two subnet network
az network vnet create --resource-group $RESOURCE_GROUP_NAME --location $LOCATION --name $VNET_NAME --address-prefixes 10.0.0.0/8 -o none
az network vnet subnet create --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME_1 --address-prefixes 10.240.0.0/16 -o none
az network vnet subnet create --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME_2 --address-prefixes 10.241.0.0/16 -o none
创建群集,使用 --vnet-subnet-id 引用节点子网,使用 --pod-subnet-id 引用 Pod 子网,并启用监视加载项。
CLUSTER_NAME="myAKSCluster"
SUBSCRIPTION=$(az account show --query id --output tsv)
az aks create \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP_NAME \
--location $LOCATION \
--max-pods 250 \
--node-count 2 \
--network-plugin azure \
--vnet-subnet-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_1 \
--pod-subnet-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_2 \
--enable-addons monitoring \
--generate-ssh-keys
添加节点池
添加节点池时,请使用 --vnet-subnet-id 引用节点子网,并使用 --pod-subnet-id 引用 Pod 子网。 以下示例创建了两个新子网,然后在创建新节点池时引用它们:
SUBNET_NAME_3="node2subnet"
SUBNET_NAME_4="pod2subnet"
NODE_POOL_NAME="mynodepool"
az network vnet subnet create --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME_3 --address-prefixes 10.242.0.0/16 -o none
az network vnet subnet create --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME_4 --address-prefixes 10.243.0.0/16 -o none
az aks nodepool add --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME --name $NODE_POOL_NAME \
--max-pods 250 \
--node-count 2 \
--vnet-subnet-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_3 \
--pod-subnet-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_4 \
--no-wait
监视 IP 子网使用情况
Azure CNI 提供监视 IP 子网使用情况的功能。 使用以下过程启用监视和查看收集的指标:
从 GitHub 下载 container-azm-ms-agentconfig.yaml 文件。
在
integrations部分中,找到azure_subnet_ip_usage,并将enabled设置为true。 在enabled = true下设置azure_subnet_ip_usage会启用 IP 子网使用情况监控。保存文件。
运行以下命令以设置活动订阅并将群集凭据下载到本地 kubeconfig 文件:
az account set --subscription $SUBSCRIPTION az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME在保存 container-azm-ms-agentconfig.yaml 的文件夹中打开终端。
使用
kubectl apply-f container-azm-ms-agentconfig.yaml命令应用配置。 此命令将重启 Pod,5-10 分钟后,可以看到指标。若要查看群集上的指标,请导航到 Azure 门户群集页上的“工作簿”,找到名为“子网 IP 使用情况”的工作簿。
动态 IP 分配常见问题解答
是否可以将多个 Pod 子网分配到群集或节点池?
可以将多个 Pod 子网分配给群集,但只能将一个 Pod 子网分配给每个节点池。 多个群集或节点池可以共享 Pod 子网。
是否可以从其他虚拟网络分配 Pod 子网?
否,必须使用群集所在的同一虚拟网络中的 Pod 子网。
群集中的某些节点池是否可以使用传统的 CNI,而另一些节点池使用新的 CNI?
整个集群应仅使用一种类型的 CNI。
后续步骤
通过以下文章详细了解 AKS 中的网络: