你当前正在访问 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 扩展

  1. 使用 az extension add 命令安装 aks-preview 扩展。

    az extension add --name aks-preview
    
  2. 使用 az extension update 命令更新到扩展的最新版本。 扩展的版本应为“2.0..0b2”或更高

    az extension update --name aks-preview
    

注册 AzureVnetScalePreview 功能标志

  1. 使用 az feature register 命令注册 AzureVnetScalePreview 功能标志。

    az feature register --namespace "Microsoft.ContainerService" --name "AzureVnetScalePreview"
    

    状态显示为“已注册”需要几分钟时间

  2. 使用 az feature show 命令验证注册状态。

    az feature show --namespace "Microsoft.ContainerService" --name "AzureVnetScalePreview"
    
  3. 当状态反映为已注册时,使用 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 中的网络: