3. 网络拓扑基础:Pod网络模型、CNI插件原理、Service与EndpointSlice、网络策略

在Kubernetes集群中,网络拓扑是调度决策与流量路径的底层骨架。调度器需要感知Pod的网络模型、CNI插件的连通性、Service的负载分发机制以及网络策略的访问约束,才能做出最优的节点选择。本节从这四个核心维度展开,建立网络拓扑的完整认知。

3.1 Pod网络模型:扁平IP与容器间通信

Kubernetes要求所有Pod之间可以不通过NAT直接通信,所有节点与Pod之间也可以不通过NAT直接通信。这种扁平IP模型是调度与网络拓扑的基础。

通信方向 要求 典型实现
Pod → Pod(同节点) 通过本地网桥或veth对直接转发 cbr0、docker0、CNI网桥
Pod → Pod(跨节点) 通过节点路由或overlay隧道可达 Flannel VXLAN、Calico BGP、Cilium eBPF
Pod → Node Pod源IP可达节点网络接口 节点路由表、iptables规则
Pod → Service 通过Cluster IP或NodePort转发 kube-proxy (iptables/IPVS/eBPF)
调度影响: 当Pod使用hostNetwork或特定Multus接口时,调度器必须考虑节点网络接口的可用性与带宽拓扑。例如,使用SR-IOV的Pod只能调度到具备对应VF资源的节点。
Pod网络模型:扁平IP通信拓扑 Node A (10.0.1.0/24) Pod A1 (10.1.1.2) Pod A2 (10.1.1.3) cbr0: 10.1.1.1 eth0: 10.0.1.2 Node B (10.0.2.0/24) Pod B1 (10.2.2.2) Pod B2 (10.2.2.3) cbr0: 10.2.2.1 eth0: 10.0.2.2 Overlay / BGP 关键通信路径说明 1. 同节点Pod通信:通过cbr0网桥二层转发,延迟低(约0.1ms) 2. 跨节点Pod通信:经过节点路由或overlay隧道,延迟增加(约0.5-2ms) 3. Pod访问Node:通过节点路由表直接路由,源IP为Pod IP 4. 调度约束:Pod IP段与节点关联,调度器需考虑IPAM容量 5. 网络策略:在cbr0或节点接口上应用iptables/eBPF规则

3.2 CNI插件原理:从容器创建到网络就绪

CNI(Container Network Interface)是Kubernetes与网络实现之间的标准接口。当kubelet决定在节点上启动一个Pod时,会调用CNI插件完成网络配置。

CNI调用流程

  1. ADD操作: kubelet调用CNI插件,传入容器ID、网络命名空间、网络配置等参数。
  2. 创建veth对: 插件创建一对veth设备,一端放入容器网络命名空间(eth0),另一端留在主机网络命名空间。
  3. 分配IP地址: 插件通过IPAM(如host-local、dhcp)为容器分配IP地址。
  4. 配置路由: 在容器内添加默认路由,在主机上添加路由规则。
  5. 返回结果: 插件返回IP地址、MAC地址、DNS等信息给kubelet。
CNI插件 网络模式 IPAM方式 调度感知 典型场景
Flannel VXLAN / host-gw host-local 低 简单集群,overlay隔离
Calico BGP / IPIP host-local / CRD 中 大规模,网络策略严格
Cilium eBPF / VXLAN CRD / Kubernetes 高 高性能,可观测性强
Multus 多网络接口 委托给附属插件 高 NFV、DPDK、SR-IOV
调度陷阱: 使用Multus或SR-IOV时,调度器默认不感知辅助网络的资源容量。必须配合NodeResourceTopology或device plugin才能正确调度。否则Pod可能被调度到没有可用VF的节点,导致启动失败。

3.3 Service与EndpointSlice:服务发现与负载分发

Service是Kubernetes中稳定的网络访问入口,而EndpointSlice是其后端Pod集合的高性能表示。调度器需要理解Service的拓扑约束,才能将Pod调度到最优位置。

Service类型与调度影响

Service类型 访问方式 调度约束 典型延迟
ClusterIP 集群内部虚拟IP 无直接约束 低(iptables规则匹配)
NodePort 节点端口映射 需考虑节点端口冲突 中(额外DNAT)
LoadBalancer 外部负载均衡器 需考虑外部LB与节点连通性 高(多跳转发)
ExternalName DNS CNAME 无网络层约束 DNS解析延迟

EndpointSlice:拓扑感知路由

EndpointSlice是Endpoint的下一代实现,将后端Pod按拓扑域(如节点、可用区)分组。调度器可以利用EndpointSlice的hints字段实现拓扑感知路由,将流量优先转发到同节点或同可用区的Pod。

调度优化点: 当Service启用topologyKeys或trafficDistribution时,调度器应优先将Pod调度到与客户端同拓扑域的节点,减少跨节点/跨可用区流量。例如,topologyKeys: ["kubernetes.io/hostname"] 强制流量优先发往同节点Pod。
Service与EndpointSlice:拓扑感知路由 Service: my-svc EndpointSlice: my-svc-abc (拓扑感知分组) Pod A (node1, zone-a) Pod B (node2, zone-a) Pod C (node3, zone-b) Pod D (node4, zone-b) 拓扑感知路由示例 • 客户端在node1(zone-a)访问my-svc,优先转发到Pod A(同节点) • 若Pod A不可用,转发到Pod B(同可用区zone-a) • 最后才转发到Pod C/D(跨可用区zone-b)

3.4 网络策略:访问控制与调度约束

NetworkPolicy是Kubernetes中基于标签的防火墙规则,控制Pod之间的网络流量。调度器必须考虑网络策略的拓扑影响,避免将Pod调度到策略冲突或连通性受限的位置。

网络策略的核心要素

  • podSelector: 选择策略作用的Pod集合。
  • policyTypes: Ingress(入站)、Egress(出站)或两者。
  • ingress/egress规则: 允许的源/目标IP段、端口、协议。
  • namespaceSelector: 跨命名空间选择。

调度影响分析

场景 网络策略配置 调度约束
微服务隔离 只允许特定标签的Pod访问 需确保同服务Pod调度到策略允许的节点
合规性要求 禁止Pod访问外部网络 调度器需避免将Pod调度到有外部网络需求的节点
多租户隔离 租户间完全隔离 不同租户的Pod不能调度到同一节点(需配合NodeSelector)
监控/日志采集 允许特定Agent访问所有Pod Agent需调度到所有节点,且网络策略需放行
最佳实践: 在调度器中集成网络策略感知插件(如Scheduler Framework的NodeResourcesFit扩展),在预选阶段过滤掉不满足网络策略约束的节点。例如,如果Pod的Egress规则要求访问特定外部IP,调度器应优先选择有对应路由的节点。

网络策略与CNI的协同

网络策略的执行依赖于CNI插件的能力:

  • Calico: 使用iptables或eBPF实现策略,支持全局策略和命名空间策略。
  • Cilium: 使用eBPF实现,支持L3/L4/L7策略,性能高。
  • Flannel: 默认不支持网络策略,需配合Calico或Antrea使用。
  • Antrea: 基于Open vSwitch实现,支持分布式防火墙。
常见问题: 网络策略默认是“白名单”模式,即未显式允许的流量都会被拒绝。调度器如果未感知网络策略,可能导致Pod启动后无法正常通信。例如,Pod A需要访问Pod B,但网络策略只允许来自特定标签的流量,而Pod A没有该标签,则通信失败。

3.5 网络拓扑与调度决策的关联

综合以上四个维度,调度器在做出决策时需要考虑以下网络拓扑因素:

网络因素 调度影响 数据来源
Pod IP段容量 节点剩余IP地址数量 CNI IPAM状态
CNI插件类型 overlay vs 直连,延迟差异 节点标签或配置
Service拓扑约束 优先同节点/同可用区调度 EndpointSlice hints
网络策略规则 过滤不满足策略的节点 NetworkPolicy对象
节点网络带宽 避免网络瓶颈节点 节点资源指标
实战要点: 在大型集群中,建议使用Cilium作为CNI插件,配合其ClusterMesh和NetworkPolicy功能,实现跨集群的网络拓扑感知调度。同时,启用Scheduler Framework的NodeResourceTopologyMatch插件,将网络资源(如带宽、IP池)纳入调度决策。