Azure Kubernetes 服务 (AKS) 概述中的 Azure CNI 网络

默认情况下,AKS 群集使用 kubenet 并创建虚拟网络和子网络。 使用 kubenet,节点从虚拟网络子网获取 IP 地址。 然后会在节点上配置网络地址转换 (NAT),并且 Pod 将接收“隐藏”在节点 IP 背后的 IP 地址。 这种方法减少了需要在网络空间中保留供 Pod 使用的 IP 地址数量。

借助 Azure 容器网络接口 (CNI),每个 Pod 都可以从子网获得 IP 地址,并且可供直接访问。 与 AKS 群集处于同一虚拟网络中的系统将 Pod IP 视为来自 Pod 的任何流量的源地址。 AKS 群集虚拟网络外部的系统将节点 IP 视为来自 Pod 的任何流量的源地址。 这些 IP 地址在网络空间中必须唯一,并且必须事先计划。 每个节点都有一个配置参数来表示它支持的最大 Pod 数。 这样,就会为每个节点预留相应的 IP 地址数。 使用此方法需要经过更详细的规划,并且经常会耗尽 IP 地址,或者在应用程序需求增长时需要在更大的子网中重建群集。

先决条件

  • AKS 群集的虚拟网络必须允许出站 Internet 连接。

  • AKS 群集不得将 169.254.0.0/16172.30.0.0/16172.31.0.0/16192.0.2.0/24 用于 Kubernetes 服务地址范围、Pod 地址范围或群集虚拟网络地址范围。

  • AKS 群集使用的群集标识在虚拟网络中的子网上必须至少具有网络参与者权限。 如果希望定义自定义角色而不是使用内置的网络参与者角色,则需要以下权限:

    • Microsoft.Network/virtualNetworks/subnets/join/action

    • Microsoft.Network/virtualNetworks/subnets/read

    • Microsoft.Authorization/roleAssignments/write

  • 分配给 AKS 节点池的子网不能是委托子网

  • AKS 不会将网络安全组 (NSG) 应用于其子网,也不会修改与该子网相关的任何 NSG。 如果提供自己的子网并添加与该子网相关的 NSG,则必须确保 NSG 中的安全规则允许节点 CIDR 范围内的流量。 有关详细信息,请参阅网络安全组

规划群集的 IP 地址

使用 Azure CNI 网络配置的群集需要额外的规划。 虚拟网络及其子网的大小必须适应计划运行的 Pod 数以及群集的节点数。

Pod 和群集节点的 IP 地址是从虚拟网络中指定的子网分配的。 每个节点都配置了主 IP 地址。 默认情况下,Azure CNI 预配置 30 个额外的 IP 地址。 这些 IP 地址会分配给节点上计划的 Pod。 横向扩展群集时,将使用子网中的 IP 地址以类似方式配置每个节点。 还可以查看每个节点的最大 Pod 数

重要

应在考虑到升级和缩放操作的基础上确定所需的 IP 地址数。 如果设置的 IP 地址范围仅支持固定数量的节点,则无法升级或缩放群集。

  • 升级 AKS 群集时,会将一个新节点部署到该群集中。 服务和工作负荷开始在新节点上运行,旧节点将从群集中删除。 这种滚动升级过程要求至少有一个额外的 IP 地址块可用。 那么,节点计数是 n + 1

    • 使用 Windows Server 节点池时,此注意事项尤其重要。 AKS 中的 Windows Server 节点不会自动应用 Windows 更新, 而是需要你在节点池上执行升级。 此升级使用最新的 Window Server 2019 基本节点映像和安全修补程序部署新节点。 有关升级 Windows Server 节点池的详细信息,请参阅升级 AKS 中的节点池
  • 缩放 AKS 群集时,会将一个新节点部署到该群集中。 服务和工作负荷开始在新节点上运行。 确定 IP 地址范围时需要考虑到如何纵向扩展群集可以支持的节点和 Pod 数目。 此外,应该为升级操作包含一个额外的节点。 那么,节点计数是 n + number-of-additional-scaled-nodes-you-anticipate + 1

如果预期节点将会运行最大数量的 Pod,并且会定期销毁和部署 Pod,则还应该考虑为每个节点分配一些额外的 IP 地址。 可能需要几秒钟才能删除服务并释放其 IP 地址,以便部署新服务并获取该地址。 这些额外的 IP 地址会考虑这种可能性。

AKS 群集 IP 地址计划包括虚拟网络、至少一个节点和 Pod 子网以及 Kubernetes 服务地址范围。

地址范围 / Azure 资源 限制和调整大小
虚拟网络 Azure 虚拟网络的大小可以为 /8,但仅限于 65,536 个已配置的 IP 地址。 在配置地址空间之前,请考虑所有网络需求(包括与其他虚拟网络中的服务进行通信)。 例如,如果配置的地址空间太大,则可能会遇到与网络中的其他地址空间重叠的问题。
子网 大小必须足以容纳群集中可能预配的节点、Pod 以及所有 Kubernetes 和 Azure 资源。 例如,如果部署内部 Azure 负载均衡器,其前端 IP 分配自群集子网(而不是公共 IP)。 子网大小还应考虑到帐户升级操作或将来的缩放需求。

使用以下公式计算最小子网大小,包括用于升级操作的额外节点:(number of nodes + 1) + ((number of nodes + 1) * maximum pods per node that you configure)

50 个节点的群集的示例:(51) + (51 * 30 (default)) = 1,581(/21 或更大)

例如,50 个节点的群集还包括增加 10 个额外节点的准备:(61) + (61 * 30 (default)) = 1,891(/21 或更大)

如果在创建群集时没有指定每个节点的最大 Pod 数,则每个节点的最大 Pod 数将设置为 30。 所需的最小 IP 地址数取决于该值。 如果基于不同的最大值计算最小 IP 地址要求,请参阅每个节点的最大 Pod 数,以便在部署群集时设置此值。

Kubernetes 服务地址范围 此虚拟网络上或连接到此虚拟网络的任何网络元素都不应使用此范围。 服务地址 CIDR 必须小于 /12。 可以在不同 AKS 群集中重复使用此范围。
Kubernetes DNS 服务 IP 地址 群集服务发现所使用的 Kubernetes 服务地址范围内的 IP 地址。 请勿使用地址范围内的第一个 IP 地址。 子网范围内的第一个地址用于 kubernetes.default.svc.cluster.local 地址。

每个节点的最大 Pod 数

AKS 群集中每个节点的最大 Pod 数为 250。 每个节点的默认最大 Pod 数因 kubenetAzure CNI 网络以及群集部署方法而异。

部署方法 Kubenet 默认值 Azure CNI 默认值 可在部署时配置
Azure CLI 110 30 是(最大 250)
Resource Manager 模板 110 30 是(最大 250)
门户 110 110(可在“节点池”选项卡中配置) 是(最大 250)

为新群集配置每个节点的最大 Pod 数

可以在群集部署时或在添加新节点池时配置每个节点的最大 Pod 数。 可将每个节点的 Pod 数目上限值设置为最大 250。

如果在创建新节点池时未指定 maxPod,则会收到 Azure CNI 的默认值 30

强制执行每个节点最大 Pod 的最小值,以保证对于群集运行状况而言至关重要的系统 Pod 空间。 当且仅当每个节点池的配置有至少 30 个 Pod 的空间时,可以为每个节点的最大 Pod 数设置的最小值为 10。 例如,要将每个节点的最大 Pod 数设置为最少 10 个,要求每个单独的节点池至少有 3 个节点。 此要求也适用于创建的每个新节点池,因此,如果将每个节点的最大 Pod 数定义为 10,则后续添加的每个节点池必须至少有 3 个节点。

网络 最小值 最大值
Azure CNI 10 250
Kubenet 10 250

注意

上表中的最小值由 AKS 服务严格强制实施。 不能将 maxPods 值设置为低于所示的最小值,因为这样做可能会阻止群集启动

  • Azure CLI:在使用 az aks create 命令部署群集时,指定 --max-pods 参数。 最大值为 250。
  • 资源管理器模板:使用资源管理器模板部署群集时,在 ManagedClusterAgentPoolProfile 对象中指定 maxPods 属性。 最大值为 250。
  • Azure 门户:在创建群集或添加新节点池时更改节点池设置中的 Max pods per node 字段。

为现有群集配置每个节点的最大 Pod 数

创建新节点池时,可以定义“每个节点的 maxPod”设置。 如果需要增加现有群集的 maxPod 设置,请使用新的所需 maxPod 计数添加新的节点池。 将 Pod 迁移到新池后,请删除旧池。 若要删除群集中的任何旧池,请确保按系统节点池文档中的定义设置节点池模式。

部署参数

创建 AKS 群集时,可为 Azure CNI 网络配置以下参数:

虚拟网络:要将 Kubernetes 群集部署到的虚拟网络。 要为群集创建新的虚拟网络,请选择“新建”,并按照“创建虚拟网络”部分中的步骤操作 。 如果要选择现有虚拟网络,请确保它与 Kubernetes 群集位于同一位置和 Azure 订阅中。 有关 Azure 虚拟网络的限制和配额的信息,请参阅 Azure 订阅和服务限制、配额和约束

子网:要将群集部署到的虚拟网络中的子网。 若要在虚拟网络中为群集创建新的子网,请选择“新建”,并按照“创建子网”部分中的步骤操作 。 对于混合连接,地址范围不应与环境中的其他任何虚拟网络重叠。

Azure 网络插件:使用 Azure 网络插件时,无法从 clusterCIDR 中具有不属于 AKS 群集的 IP 的 VM 访问“externalTrafficPolicy=Local”的内部 LoadBalancer 服务。

Kubernetes 服务地址范围:该参数是 Kubernetes 分配给群集中的内部服务的一组虚拟 IP。 创建群集后,无法更新此范围。 可以使用任何专用地址范围,只要其符合以下要求即可:

  • 不得在群集的虚拟网络 IP 地址范围内
  • 不得与群集虚拟网络对等互连的任何其他虚拟网络重叠
  • 不得与任何本地 IP 重叠
  • 不得在范围 169.254.0.0/16172.30.0.0/16172.31.0.0/16192.0.2.0/24

虽然从技术上来说可以在群集所在的虚拟网络中指定一个服务地址范围,但建议不要这样做。 如果使用重叠的 IP 范围,则可能导致不可预测的行为。 有关详细信息,请参阅本文中的常见问题解答部分。 有关 Kubernetes 服务的详细信息,请参阅 Kubernetes 文档中的服务

Kubernetes DNS 服务 IP 地址:群集 DNS 服务的 IP 地址。 此地址必须在 Kubernetes 服务地址范围内。 请勿使用地址范围内的第一个 IP 地址。 子网范围内的第一个地址用于 kubernetes.default.svc.cluster.local 地址。

常见问题

  • 是否可以在群集子网中部署 VM?

    是的。 但对于用于动态 IP 分配的 Azure CNI,VM 不能部署在 Pod 的子网中。

  • 外部系统查看什么源 IP 来获取源自某个支持 Azure CNI 的 Pod 的流量?

    与 AKS 群集处于同一虚拟网络中的系统将 Pod IP 视为来自 Pod 的任何流量的源地址。 AKS 群集虚拟网络外部的系统将节点 IP 视为来自 Pod 的任何流量的源地址。

    但对于用于动态 IP 分配的 Azure CNI,无论连接位于同一虚拟网络中还是跨虚拟网络,Pod IP 始终是来自 Pod 的任何流量的来源地址。 这是因为用于动态 IP 分配的 Azure CNI 实施了 Azure 容器网络基础结构,从而提供端到端体验。 因此,它不再使用传统 Azure CNI 仍在使用的 ip-masq-agent

  • 是否可以配置基于 Pod 的网络策略?

    是的,Kubernetes 网络策略在 AKS 中可用。 若要开始使用,请参阅在 AKS 中使用网络策略保护 Pod 之间的流量

  • 可部署到节点的 Pod 数上限是否可配置?

    是的,使用 Azure CLI 或资源管理器模板部署群集时可配置。 请参阅每个节点的最大 Pod 数

    无法在现有群集上更改每个节点的最大 Pod 数。

  • 如何配置创建 AKS 群集期间创建的子网的其他属性? 例如服务终结点。

    可以在 Azure 门户的标准虚拟网络配置页中,配置创建 AKS 群集期间创建的虚拟网络和子网的完整属性列表。

  • 是否可以在我的群集虚拟网络中将另一子网用于 Kubernetes 服务地址范围?

    此配置是可以的,但建议不要这样做。 该服务地址范围是 Kubernetes 分配给群集中的内部服务的虚拟 IP (VIP) 的集合。 Azure 网络无法查看 Kubernetes 群集的服务 IP 范围。 无法了解群集的服务地址范围可能会导致问题发生。 以后在群集虚拟网络中创建新的子网时,该子网可能与该服务地址范围重叠。 如果出现这种形式的重叠,则 Kubernetes 为服务分配的 IP 可能是子网中另一资源正在使用的,导致不可预测的行为或故障。 如果能够确保所用地址范围不在群集的虚拟网络中,则可避免这种重叠风险。

下一步

通过以下文章详细了解 AKS 中的网络: