你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure CNI Pod 子网 - 动态 IP 分配的限制是 Pod 子网大小可缩放到 /16 子网之外。 即使使用大型子网,大型群集也仍可能受限于 65,000 个 Pod,因为 Azure 地址映射存在限制。 Pod 子网 - Azure CNI 中的静态块分配通过将 CIDR 块分配给节点而不是单个 IP 来解决此问题。
它提供以下优势:
- 更好的 IP 可伸缩性:CIDR 块静态分配到群集节点,并在节点的生存期内一直存在,这与使用传统 CNI 动态分配单个 IP 不同。 这可以启用基于 CIDR 块的路由,并有助于将群集限制从传统的每个群集 65,000 个 Pod 扩展到 100 万个 Pod。 Azure 虚拟网络必须足够大,才能适应群集的规模。
- Flexibility: Node and pod subnets can be scaled independently. 单个 Pod 子网可以在群集的多个节点池之间或在同一 VNet 中部署的多个 AKS 群集之间共享。 你还可以为节点池配置单独的 Pod 子网。
- High performance: Since pods are assigned virtual network IPs, they have direct connectivity to other cluster pods and resources in the VNet.
- 用于 Pod 的单独 VNet 策略:由于 Pod 具有单独的子网,因此你可以单独为它们配置不同于节点策略的 VNet 策略。 这样可以实现许多有用的方案,例如只允许 Pod 而不允许节点连接 Internet,使用 Azure NAT 网关修复节点池中 Pod 的源 IP 以及使用 NSG 筛选节点池之间的流量。
- Kubernetes 网络策略:Cilium、Azure NPM 和 Calico 使用此新的解决方案。
本文介绍如何在 AKS 中使用 Azure CNI Pod 子网 - 静态块分配和增强的子网支持。
Prerequisites
Note
使用 Pod 子网 - 静态块分配时,不支持使用 Kubernetes 负载均衡器服务将应用程序公开为专用链接服务。
Review the prerequisites for configuring basic Azure CNI networking in AKS, as the same prerequisites apply to this article.
Review the deployment parameters for configuring basic Azure CNI networking in AKS, as the same parameters apply.
不支持 AKS 引擎和 DIY 群集。
Azure CLI 版本
2.75.0或更高版本如果你有现有群集,则需要启用容器见解来监视 IP 子网使用情况。 可以使用
az aks enable-addons命令来启用容器见解,如以下示例所示:az aks enable-addons --addons monitoring --name <cluster-name> --resource-group <resource-group-name>
Limitations
下面是使用 Azure CNI Pod 子网的一些限制 - 静态块分配:
- 所需的最低 Kubernetes 版本为 1.28
- 支持的最大子网大小为 xxxx/12 ~ 100 万个 IP
- 每个子网只能使用一种操作模式。 如果子网使用静态块分配模式,则不能在同一子网的不同群集或节点池中使用动态 IP 分配模式,反之亦然。
- 仅在新群集中受支持,或将具有不同子网的节点池添加到现有群集时受支持。 不支持迁移或更新现有群集或节点池。
- 在分配到节点池中某个节点的所有 CIDR 块中,将选择一个 IP 作为该节点的主 IP。 因此,对于选择
--max-pods值的网络管理员,可以尝试使用以下计算来最好地满足需求并优化子网中 IP 的使用:
max_pods=(N * 16) - 1
其中 N 是任意正整数,且 N > 0
计划 IP 寻址
更灵活精细地规划 IP 寻址。 由于节点和 Pod 是独立缩放的,因此也可以单独计划其地址空间。 由于可以将 Pod 子网配置为节点池的粒度,因此你在添加节点池时始终可以添加新的子网。 群集/节点池中的系统 Pod 也会从 Pod 子网中接收 IP,因此需要考虑此行为。
在此场景中,/28(16 个 IP)CIDR 块将根据节点池的“--max-pods”配置分配到节点,该配置定义每个节点的最大 Pod 数量。 在每个节点上,将保留该节点上所有可用 IP 中的 1 个 IP,以便在内部使用。
因此,在确定和规划 IP 时,必须定义“--max-pods”配置,使用以下公式可以计算出最佳配置值:max_pods_per_node = (16 * N) - 1,其中 N 是任意大于 0 的正整数
不浪费 IP 的理想值要求最大 Pod 值符合上述表达式。
- Example 1: max_pods = 30, CIDR Blocks allocated per node = 2, Total IPs available for pods = (16 * 2) - 1 = 32 - 1 = 31, IP wastage per node = 31 - 30 = 1 [Low wastage - Acceptable Case]
- Example 2: max_pods = 31, CIDR Blocks allocated per node = 2, Total IPs available for pods = (16 * 2) - 1 = 32 - 1 = 31, IP wastage per node = 31 - 31 = 0 [Ideal Case]
- Example 3: max_pods = 32, CIDR Blocks allocated per node = 3, Total IPs available for pods = (16 * 3) - 1 = 48 - 1 = 47, IP wastage per node = 47 - 32 = 15 [High Wastage - Not Recommended Case]
Kubernetes 服务的 IP 规划保持不变。
Note
确保 VNet 有足够大且连续的地址空间,以支持群集的规模。
Deployment parameters
The deployment parameters for configuring basic Azure CNI networking in AKS are all valid, with exceptions:
- vnet subnet id 参数现在指与群集节点相关的子网。
- pod subnet id 参数用于指定其 IP 地址将静态或动态分配到节点池中 Pod 的子网。
- Pod IP 分配模式参数指定是使用
DynamicIndividual(动态 IP 分配)还是StaticBlock(静态块分配)。
为网络配置 CIDR 块的静态分配和增强的子网支持 - Azure CLI
在群集中使用 Pod 子网 - 静态块分配类似于使用 Pod 子网配置群集的默认方法 - 动态 IP 分配。 以下示例逐步演示如何创建一个包含用于节点的子网和用于 Pod 的子网的新虚拟网络,以及如何创建使用 Azure CNI Pod 子网 – 静态块分配的群集。 请务必将 $subscription 等变量替换为你自己的值。
创建包含两个子网的虚拟网络。
resourceGroup="myResourceGroup"
vnet="myVirtualNetwork"
location="myRegion"
# Create the resource group
az group create --name $resourceGroup --location $location
# Create our two subnet network
az network vnet create --resource-group $resourceGroup --location $location --name $vnet --address-prefixes 10.0.0.0/8 -o none
az network vnet subnet create --resource-group $resourceGroup --vnet-name $vnet --name nodesubnet --address-prefixes 10.240.0.0/16 -o none
az network vnet subnet create --resource-group $resourceGroup --vnet-name $vnet --name podsubnet --address-prefixes 10.40.0.0/13 -o none
创建群集,使用 --vnet-subnet-id 引用节点子网,使用 --pod-subnet-id 引用 Pod 子网,使用 --pod-ip-allocation-mode 定义 IP 分配模式,并启用监视加载项。
clusterName="myAKSCluster"
subscription="aaaaaaa-aaaaa-aaaaaa-aaaa"
az aks create \
--name $clusterName \
--resource-group $resourceGroup \
--location $location \
--max-pods 250 \
--node-count 2 \
--network-plugin azure \
--pod-ip-allocation-mode StaticBlock \
--vnet-subnet-id /subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnet/subnets/nodesubnet \
--pod-subnet-id /subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnet/subnets/podsubnet \
--enable-addons monitoring \
--generate-ssh-keys
添加节点池
添加节点池时,请使用 --vnet-subnet-id 引用节点子网,使用 --pod-subnet-id 引用 Pod 子网,使用“--pod-ip-allocation-mode”引用分配模式。 以下示例创建了两个新子网,然后在创建新节点池时引用它们:
az network vnet subnet create -g $resourceGroup --vnet-name $vnet --name node2subnet --address-prefixes 10.242.0.0/16 -o none
az network vnet subnet create -g $resourceGroup --vnet-name $vnet --name pod2subnet --address-prefixes 10.243.0.0/16 -o none
az aks nodepool add --cluster-name $clusterName -g $resourceGroup -n newnodepool \
--max-pods 250 \
--node-count 2 \
--vnet-subnet-id /subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnet/subnets/node2subnet \
--pod-subnet-id /subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnet/subnets/pod2subnet \
--pod-ip-allocation-mode StaticBlock \
--no-wait
从 Pod 子网迁移 - 动态 IP 分配到 Pod 子网 - 静态块分配
如果现有 AKS 群集使用 Pod 子网的动态 IP 分配,并且想要迁移到 Pod 子网 - 静态块分配,请执行以下步骤:
迁移步骤
规划用于静态块代理池的新子网
- 在现有 VNet 中创建专用于静态块模式的新子网
- 确保子网大小遵循 “计划 IP 寻址 ”部分中概述的规划准则
使用静态块模式和新子网将代理池添加到现有群集
az aks nodepool add使用命令创建具有静态块分配的新节点池- 使用
--pod-subnet-id引用新子网,并将--pod-ip-allocation-mode设置为StaticBlock
关闭现有代理池,以便所有部署和流量都转移到新的代理池
- 用于
kubectl cordon将现有节点标记为不可计划 - 逐渐将工作负荷从旧节点池清空到新的静态块节点池
- 用于
将所有工作负荷移到新的代理池后,删除现有的非静态块代理池
- 验证所有工作负荷是否在新节点池上成功运行
- 使用
az aks nodepool delete删除旧节点池
Important
迁移需要仔细规划和测试。 在封锁现有节点之前,请确保在新节点池中有足够的容量。 首先在非生产环境中测试迁移过程。
CIDR 块的静态分配和增强的子网支持常见问题解答
是否可以将多个 Pod 子网分配到群集?
可以将多个子网分配到一个群集,但只能将一个子网分配到每个节点池。 相同/不同群集中的不同节点池可以共享同一个子网。
能否完全从不同的 VNet 分配 Pod 子网?
不可以,Pod 子网应与群集来自同一 VNet。
具有 Pod 子网 IPAM 的群集中的某些节点池是否可以使用动态 IP 分配,而另一些节点池使用新的静态块分配?
是的,不同的节点池可以使用不同的分配模式。 但是,一旦在一种分配模式下使用某个子网,就只能在与该子网关联的所有节点池中以相同分配模式使用该子网。
Next steps
通过以下文章详细了解 AKS 中的网络: