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 范围内的流量。 有关详细信息,请参阅网络安全组

部署参数

创建 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 数。

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

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

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

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

下一步

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