你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Kubernetes 使用容器网络接口 (CNI) 插件来管理 Kubernetes 群集中的网络。 CNI 插件负责将 IP 地址分配给 Pod、Pod 之间的网络路由、Kubernetes 服务路由等。
Azure Kubernetes 服务(AKS)提供多个 CNI 插件,可在群集中使用,具体取决于网络要求。
AKS 中的网络模型
要为 AKS 群集选择哪种 CNI 插件很大程度上取决于哪种网络模型最符合你的需求。 每个模型都有自己的优点和缺点,在规划 AKS 群集时应考虑这些优点和缺点。
AKS 使用两个主要网络模型:
覆盖网络:
- 通过为 Pod 使用逻辑上独立的无类别域际路由 (CIDR) 范围,为虚拟网络节省 IP 地址空间。
- 提供最大群集规模支持。
- 提供对 IP 地址的简单管理。
平面网络:
- 为 Pod 提供完整的虚拟网络连接。 可以通过连接网络中的 Pod 专用 IP 地址直接访问它们。
- 需要虚拟网络的大型非分段 IP 地址空间。
这两个网络模型都有多个 CNI 插件支持的选项。 这两种模型之间的主要区别在于如何分配 Pod IP 地址以及流量如何离开群集。
覆盖网络
叠加网络是 Kubernetes 中使用的最常见网络模型。 在覆盖网络中,Pod 从部署 AKS 节点的 Azure 虚拟网络子网中的一个专用、逻辑上独立的 CIDR 接收 IP 地址。 此配置允许比平面网络模型更简单且通常更好的可伸缩性。
在叠加网络中,Pod 可以直接相互通信。 离开群集的流量被源网络地址转换 (SNAT) 为节点的 IP 地址。 入站 Pod IP 流量通过服务(例如负载均衡器)进行路由。 然后,Pod IP 地址被“隐藏”在节点的 IP 地址之后。 此方法可减少群集中虚拟网络所需的 IP 地址数。
对于叠加网络,AKS 提供 Azure CNI Overlay 插件。 对于大多数方案,我们建议使用此 CNI 插件。
平面网络
与覆盖网络不同,AKS 中的平面网络模型将 IP 地址分配给与 AKS 节点来自同一 Azure 虚拟网络的子网中的 Pod。 离开群集的流量不会 SNAT,且 Pod IP 地址会被直接公开给目标。 此方法可用于某些方案,例如需要向外部服务公开 Pod IP 地址时。
AKS 为平面网络提供两个 CNI 插件:
- Azure CNI Pod 子网,推荐为扁平网络方案应用此 CNI 插件。
- Azure CNI 节点子网,这是适用于平面网络的旧 CNI 模型。 一般情况下,建议仅在 需要 群集的托管虚拟网络时使用它。
选择 CNI 插件
选择 CNI 插件时,需要考虑几个因素。 每个网络模型都有自己的优点和缺点。 你群集的最佳选择取决于你的特定要求。
用例比较
| CNI 插件 | 网络模型 | 用例要点 |
|---|---|---|
| Azure CNI 覆盖 | Overlay | - 最适合为虚拟网络保存 IP 支持的最大节点数量由 API 服务器决定,每个节点最多支持 250 个 Pod - 更简单的配置 - 无法直接从外部访问 Pod IP |
| Azure CNI Pod 子网 | Flat | - 可直接从外部访问 Pod - 虚拟网络或 大型群集规模支持的高效 IP 使用模式(预览版) |
| Kubenet (旧版) | Overlay | - IP 保护的优先顺序 - 扩展性受限 - 手动路由管理 |
| Azure CNI 节点子网(旧版) | Flat | - 可直接从外部访问 Pod - 更简单的配置 - 扩展性受限 - 虚拟网络中的 IP 使用效率低下 |
功能对比
| Feature | Azure CNI 覆盖 | Azure CNI Pod 子网 | Azure CNI 节点子网(旧版) | Kubenet (旧版) |
|---|---|---|---|---|
| 在现有或新虚拟网络中部署群集 | Supported | Supported | Supported | 支持手动用户定义的路由 (UDR) |
| Pod 与虚拟机 (VM) 之间的连接,其中 VM 位于同一虚拟网络或对等虚拟网络中。 | Pod 已启动 | 两种方式均可 | 两种方式均可 | Pod 已启动 |
| 通过虚拟专用网络(VPN)和 Azure ExpressRoute 进行本地访问 | Pod 已启动 | 两种方式均可 | 两种方式均可 | Pod 已启动 |
| 访问服务终结点 | Supported | Supported | Supported | Supported |
| 通过负载均衡器公开服务 | Supported | Supported | Supported | Supported |
| 通过 Azure 应用程序网关入口控制器公开服务 | Supported | Supported | Supported | Supported |
| 通过用于容器的应用程序网关公开服务 | Supported | Supported | Supported | 不支持 |
| Windows 节点池 | Supported | Supported | Supported | 不支持 |
| 默认 Azure DNS 和专用区域 | Supported | Supported | Supported | Supported |
| 跨多个群集共享虚拟网络子网 | Supported | Supported | Supported | 不支持 |
网络模型之间的支持范围
根据使用的 CNI 插件,可以通过以下方式之一为群集部署虚拟网络资源:
- 创建 AKS 群集时,Azure 平台可以自动创建和配置虚拟网络资源,例如在 Azure CNI 覆盖层、Azure CNI 节点子网和 Kubenet 中。
- 当你创建 AKS 群集时,可以手动创建和配置虚拟网络资源并附加到这些资源。
尽管这些方式都支持服务终结点或 UDR 之类的功能,但你可以根据 AKS 的支持策略中的说明进行更改。 例如:
- 如果你为 AKS 群集手动创建虚拟网络资源,则在配置自己的 UDR 或服务终结点时将会获得支持。
- 如果 Azure 平台为 AKS 群集自动创建虚拟网络资源,则无法手动更改 AKS 管理的这些资源来配置你自己的 UDR 或服务终结点。
Prerequisites
规划 AKS 的网络配置时,请记住以下要求和注意事项:
- AKS 群集的虚拟网络必须允许出站 Internet 连接。
- AKS 群集不能使用
169.254.0.0/16、172.30.0.0/16、172.31.0.0/16或192.0.2.0/24用于 Kubernetes 服务、Pod 或群集虚拟网络的地址范围。 - 在自带虚拟网络的情况下,AKS 群集使用的群集标识必须至少对虚拟网络中的子网具有 网络参与者 权限。 如果要定义 自定义角色 而不是使用内置网络参与者角色,则需要以下权限:
Microsoft.Network/virtualNetworks/subnets/join/actionMicrosoft.Authorization/roleAssignments/write-
Microsoft.Network/virtualNetworks/subnets/read(仅当你定义自己的子网和CIDR 时才需要)
- 分配给 AKS 节点池的子网不能是委托子网。
- AKS 不会将网络安全组 (NSG) 应用于其子网,也不会修改与该子网相关的任何 NSG。 如果提供自己的子网并添加与该子网关联的 NSG,则必须确保 NSG 中的安全规则允许节点 CIDR 范围内的流量。 有关详细信息,请参阅 Azure 网络安全组概述。