你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
配置 Azure CNI 网络以在 Azure Kubernetes 服务 (AKS) 中静态分配 CIDR 块并增强子网支持 -(预览版)
Azure CNI 动态 IP 分配的限制是 Pod 子网大小可缩放到 /16 子网之外。 即使使用大型子网,大型群集也仍可能受限于 65,000 个 Pod,因为 Azure 地址映射存在限制。 Azure CNI 中新的静态块分配功能通过将 CIDR 块分配到节点而不是单个 IP 来解决此问题。
这能带来以下好处:
- 更好的 IP 可伸缩性:CIDR 块静态分配到群集节点,并在节点的生存期内一直存在,这与使用传统 CNI 动态分配单个 IP 不同。 这可以启用基于 CIDR 块的路由,并有助于将群集限制从传统的每个群集 65,000 个 Pod 扩展到 100 万个 Pod。 Azure 虚拟网络必须足够大,才能适应群集的规模。
- 灵活性:节点和 Pod 子网可以独立缩放。 单个 Pod 子网可以在群集的多个节点池之间或在同一 VNet 中部署的多个 AKS 群集之间共享。 你还可以为节点池配置单独的 Pod 子网。
- 高性能:由于为 Pod 分配了虚拟网络 IP,因此它们可以直接连接到 VNet 中的其他群集 Pod 和资源。
- 用于 Pod 的单独 VNet 策略:由于 Pod 具有单独的子网,因此你可以单独为它们配置不同于节点策略的 VNet 策略。 这样可以实现许多有用的方案,例如只允许 Pod 而不允许节点连接 Internet,使用 Azure NAT 网关修复节点池中 Pod 的源 IP 以及使用 NSG 筛选节点池之间的流量。
- Kubernetes 网络策略:Cilium、Azure NPM 和 Calico 使用此新的解决方案。
本文介绍如何在 AKS 中使用 Azure CNI 网络静态分配 CIDR 和增强子网支持。
先决条件
注意
使用 CIDR 的静态块分配时,不支持使用 Kubernetes 负载均衡器服务将应用程序公开为专用链接服务。
查看在 AKS 中配置基本 Azure CNI 网络的先决条件,因为相同的先决条件适用于本文。
查看用于在 AKS 中配置基本 Azure CNI 网络的部署参数,因为适用相同的参数。
不支持 AKS 引擎和 DIY 群集。
Azure CLI 版本
2.37.0
或更高版本,包含版本“2.0.0b2”或更高版本的扩展 aks-preview如果你有现有群集,则需要启用容器见解来监视 IP 子网使用情况。 可以使用
az aks enable-addons
命令来启用容器见解,如以下示例所示:为订阅注册订阅级功能标志 “Microsoft.ContainerService/AzureVnetScalePreview”
az aks enable-addons --addons monitoring --name <cluster-name> --resource-group <resource-group-name>
限制
下面是使用 Azure CNI 静态块分配时存在的一些限制:
- 所需的最低 Kubernetes 版本为 1.28
- 支持的最大子网大小为 xxxx/12 ~ 100 万个 IP
- 每个子网只能使用一种操作模式。 如果子网使用静态块分配模式,则它不能在具有相同子网的不同群集或节点池中使用动态 IP 分配模式,反之亦然。
- 仅在新群集中受支持,或将具有不同子网的节点池添加到现有群集时受支持。 不支持迁移或更新现有群集或节点池。
- 在分配到节点池中某个节点的所有 CIDR 块中,将选择一个 IP 作为该节点的主 IP。 因此,对于选择
--max-pods
值的网络管理员,可以尝试使用以下计算来最好地满足需求并优化子网中 IP 的使用:
max_pods
=(N * 16) - 1
其中 N 是任意正整数,且 N > 0
上市区域
此功能在以下区域中不可用:
- 美国南部
- 美国东部 2
- 美国西部
- 美国西部 2
计划 IP 寻址
更灵活精细地规划 IP 寻址。 由于节点和 Pod 是独立缩放的,因此也可以单独计划其地址空间。 由于可以将 Pod 子网配置为节点池的粒度,因此你在添加节点池时始终可以添加新的子网。 群集/节点池中的系统 Pod 也会从 Pod 子网中接收 IP,因此需要考虑此行为。
在此方案中,/28(16 个 IP)CIDR 块将根据节点池的“--max-pod”配置分配到节点,该配置定义每个节点的最大 Pod 数量。 在每个节点上,将保留该节点上所有可用 IP 中的 1 个 IP,以便在内部使用。
因此,在确定和规划 IP 时,必须定义“--max-pods”配置,使用以下公式可以计算出最佳配置值:max_pods_per_node = (16 * N) - 1
,其中 N 是任意大于 0 的正整数
不浪费 IP 的理想值要求最大 Pod 值符合上述表达式。
- 示例 1:max_pods = 30,为每个节点分配的 CIDR 块 = 2,Pod 可用的 IP 总数 = (16 * 2) - 1 = 32-1 = 31,每个节点的 IP 浪费 = 31-30 = 1 [低浪费 - 可接受的情况]
- 示例 2:max_pods = 31,为每个节点分配的 CIDR 块 = 2,Pod 可用的 IP 总数 = (16 * 2) - 1 = 32-1 = 31,每个节点的 IP 浪费 = 31-31 = 0 [理想情况]
- 示例 3:max_pods = 32,为每个节点分配的 CIDR 块 = 3,Pod 可用的 IP 总数 = (16 * 3) - 1 = 48-1 = 47,每个节点的 IP 浪费 = 47-32 = 15 [高浪费 - 不建议的情况]
Kubernetes 服务的 IP 规划保持不变。
注意
确保 VNet 有足够大且连续的地址空间,以支持群集的规模。
部署参数
用于在 AKS 中配置基本 Azure CNI 网络的部署参数都是有效的,但有两个例外:
- vnet subnet id 参数现在指与群集节点相关的子网。
- pod subnet id 参数用于指定其 IP 地址将静态或动态分配到节点池中 Pod 的子网。
- pod ip allocation mode 参数指定是要使用动态单独分配还是静态块分配。
开始之前
- 如果使用 Azure CLI,则需要
aks-preview
扩展。 请参阅安装aks-preview
Azure CLI 扩展。 - 如果使用 ARM 或 REST API,AKS API 版本必须为 2024-01-02-preview 或更高。
安装 Azure CLI aks-preview
扩展
使用
az extension add
命令安装aks-preview
扩展。az extension add --name aks-preview
使用
az extension update
命令更新到扩展的最新版本。 扩展的版本应为“2.0..0b2”或更高az extension update --name aks-preview
注册 AzureVnetScalePreview
功能标志
使用
az feature register
命令注册AzureVnetScalePreview
功能标志。az feature register --namespace "Microsoft.ContainerService" --name "AzureVnetScalePreview"
状态显示为“已注册”需要几分钟时间。
使用
az feature show
命令验证注册状态。az feature show --namespace "Microsoft.ContainerService" --name "AzureVnetScalePreview"
当状态反映为已注册时,使用
az provider register
命令刷新 Microsoft.ContainerService 资源提供程序的注册。az provider register --namespace Microsoft.ContainerService
为网络配置 CIDR 块的静态分配和增强的子网支持 - Azure CLI
在群集中使用 CIDR 块的静态分配与为群集 Azure CNI 配置动态 IP 分配的默认方法类似。 下面的示例演示如何创建一个新的虚拟网络,其中包含一个用于节点的子网和一个用于 Pod 的子网,以及如何创建一个群集,该群集使用配置了 CIDR 块静态分配的 Azure CNI。 请务必将 $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
CIDR 块的静态分配和增强的子网支持常见问题解答
是否可以将多个 Pod 子网分配到群集?
可以将多个子网分配到一个群集,但只能将一个子网分配到每个节点池。 相同/不同群集中的不同节点池可以共享同一个子网。
能否完全从不同的 VNet 分配 Pod 子网?
不可以,Pod 子网应与群集来自同一 VNet。
群集中的某些节点池是否可以使用动态 IP 分配,而其他节点池使用新的静态块分配?
是的,不同的节点池可以使用不同的分配模式。 但是,一旦在一种分配模式下使用某个子网,就只能在与该子网关联的所有节点池中以相同分配模式使用该子网。
后续步骤
通过以下文章详细了解 AKS 中的网络: