在 Azure Kubernetes 服务 (AKS) 中,Azure CNI Pod 子网会从独立于群集节点的单独子网中为 Pod 分配 IP 地址。 此功能分为两种模式:动态 IP 分配和静态块分配。
先决条件
注释
使用 CIDR 的静态块分配时,不支持使用 Kubernetes 负载均衡器服务将应用程序公开为专用链接服务。
- 查看 AKS CNI 网络先决条件。
- 查看 动态 IP 分配 和 静态块分配的配置指南。
- 不支持 AKS 引擎和 DIY 群集。
- 使用Azure CLI版本
2.75.0或更高版本配置静态块分配。
动态 IP 分配模式
动态 IP 分配可通过从子网(该子网独立于托管 AKS 群集的子网)分配 Pod IP 来帮助缓解 Pod IP 地址耗尽问题。
动态 IP 分配模式具有以下优势:
- 更高的 IP 利用率:系统会从 Pod 子网中动态向集群 Pod 分配 IP。 与传统的 CNI 解决方案(为每个节点静态分配 IP)相比,此功能可以优化群集中的 IP 利用率。
- 可缩放性和灵活性:可以单独缩放节点和 Pod 子网。 单个 Pod 子网可以在群集的多个节点池之间或在同一 VNet 中部署的多个 AKS 群集之间共享。 你还可以为节点池配置单独的 Pod 子网。
- 高性能:由于为 Pod 分配了 VNet IP,因此它们直接连接到 VNet 中的其他群集 Pod 和资源。
- 用于 Pod 的单独 VNet 策略:由于 Pod 具有单独的子网,因此你可以单独为它们配置不同于节点策略的 VNet 策略。 此方式可以实现许多有用的方案,例如只允许 Pod 而不允许节点连接 Internet,使用 Azure NAT 网关修复节点池中 Pod 的源 IP,以及使用网络规则组 (NSG) 筛选节点池之间的流量。
- Kubernetes 网络策略:对于 Linux 节点池,请使用由 Cilium 提供支持的 CNI Azure。 对于Windows节点池,请使用 Calico。 新订阅无法启用Azure网络策略管理器(NPM)。 Azure NPM 对 Windows 的支持将于 2026 年 9 月 30 日结束,对 Linux 的支持将于 2028 年 9 月 30 日结束。 有关详细信息,请参阅 AKS 中的网络策略。
局限性
- 支持的最大 Pod 子网大小为
/16。 大型群集也可能因 Azure 地址映射限制而受限于大约 65,000 个 Pod。 对于更大规模的场景,请使用静态块分配。 - 具有动态 IP 分配的 Azure CNI Pod 子网与节点自动预配 (NAP)不兼容。
计划 IP 寻址
借助动态 IP 分配,节点和 Pod 可以独立缩放,以便可以单独规划其地址空间。 由于可以将 Pod 子网配置为节点池的粒度,因此你在添加节点池时始终可以添加新的子网。 群集/节点池中的系统 Pod 也会从 Pod 子网中接收 IP,因此需要考虑此行为。
以 16 个为一组将 IP 分配给节点。 Pod 子网 IP 分配应规划为群集中每个节点至少 16 个 IP,因为节点将在启动时请求 16 个 IP,且会在任何时候(当其服务配额中存在 <8 个 IP 未分配时)请求另一批 16 个 IP。
Kubernetes 服务和 Docker 网桥的 IP 地址规划将保持不变。
静态块分配模式
静态块分配通过将 CIDR 块分配给节点而不是单个 IP 来帮助缓解潜在的 Pod 子网大小调整和 Azure 地址映射限制。
静态块分配模式具有以下优势:
- 更好的 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 网络策略:对于 Linux 节点池,请使用由 Cilium 提供支持的 CNI Azure。 对于Windows节点池,请使用 Calico。 新订阅无法启用Azure NPM。 Azure NPM 对 Windows 的支持将于 2026 年 9 月 30 日结束,对 Linux 的支持将于 2028 年 9 月 30 日结束。 有关详细信息,请参阅 AKS 中的网络策略。
局限性
下面是使用 Azure CNI 静态块分配时存在的一些限制:
- 所需的最低 Kubernetes 版本为 1.28。
- 支持的最大子网大小为 x.x.x.x/12 ~ 100 万个 IP。
- Azure CNI Pod 子网不支持Windows Server 2019节点。
- 每个子网只能使用一种操作模式。 如果子网使用静态块分配模式,则不能在同一子网的不同群集或节点池中使用动态 IP 分配模式,反之亦然。
- 不支持就地迁移或现有节点池的更新。 若要将现有群集从动态 IP 分配迁移到静态块分配,请在 新子网上添加静态块分配节点池并移动工作负荷。
- 在分配到节点池中某个节点的所有 CIDR 块中,将选择一个 IP 作为该节点的主 IP。 因此,对于选择
--max-pods值的网络管理员,可以尝试使用以下计算来最好地满足需求并优化子网中 IP 的使用:
max_pods = (N * 16) - 1,其中 N 为任何正整数和 N> 0
计划 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 值符合上述表达式。
请参阅以下示例情况:
注释
这些示例假定 /28 CIDR 块(每个 IP 为 16 个)。
| 示例案例 | max_pods |
为每个节点分配的 CIDR 块 | Pod 可用的 IP 总数 | 节点的 IP 浪费情况 |
|---|---|---|---|---|
| 低浪费(可接受) | 30 | 2 | (16 * 2) - 1 = 32 - 1 = 31 | 31 - 30 = 1 |
| 理想情况 | 31 | 2 | (16 * 2) - 1 = 32 - 1 = 31 | 31 - 31 = 0 |
| 高浪费(不建议) | 32 | 3 | (16 * 3) - 1 = 48 - 1 = 47 | 47 - 32 = 15 |
Kubernetes 服务的 IP 地址规划将保持不变。
注释
确保 VNet 有足够大且连续的地址空间,以支持群集的规模。