1. K8s 网络基础:CNI 概念、Pod 网络模型、Service 与 EndpointSlice 原理
1.1 CNI(Container Network Interface)概念
CNI 是 Kubernetes 网络插件的标准接口,负责为 Pod 分配网络资源并配置网络连通性。Kubelet 在创建 Pod 时调用 CNI 插件完成以下操作:
- 分配 IP 地址:从集群 CIDR 中为 Pod 分配唯一 IP。
- 配置网络接口:在 Pod 的 Network Namespace 中创建 veth pair 并接入宿主机 bridge 或 overlay 网络。
- 设置路由规则:确保 Pod 可以跨节点通信。
关键原则:CNI 插件必须保证集群内任意两个 Pod 可以直接通信,无需 NAT 转换。
| CNI 插件 | 网络模式 | 性能特点 | 适用场景 |
|---|---|---|---|
| Calico | BGP / VXLAN | BGP 模式延迟低,VXLAN 模式封装开销约 5-10% | 大规模集群、网络策略严格 |
| Flannel | VXLAN / host-gw | host-gw 性能接近原生,VXLAN 有封装开销 | 中小规模、快速部署 |
| Cilium | eBPF / VXLAN | eBPF 模式延迟极低,支持 L7 策略 | 高性能、安全敏感场景 |
| Weave | fastdp / VXLAN | fastdp 模式吞吐较高,但 CPU 占用略高 | 跨云混合部署 |
1.2 Pod 网络模型
Kubernetes 对 Pod 网络有三大核心要求:
- 每个 Pod 拥有独立 IP:Pod 内的所有容器共享同一个 Network Namespace,通过 localhost 通信。
- Pod 之间可以直接通信:无需 NAT,无论是否在同一节点。
- Node 与 Pod 之间可以直接通信:节点上的进程可以通过 Pod IP 直接访问 Pod。
设计意图:这种模型将 Pod 视为“轻量级虚拟机”,简化了应用迁移和微服务架构的网络设计。
1.3 Service 原理
Service 是 Kubernetes 中用于暴露一组 Pod 的抽象层,提供稳定的虚拟 IP(ClusterIP)和负载均衡能力。其核心组件包括:
- ClusterIP:Service 的虚拟 IP,仅在集群内部可达。
- kube-proxy:运行在每个节点上,负责将 ClusterIP 的流量转发到后端 Pod。
- iptables / IPVS / eBPF:kube-proxy 的三种代理模式,性能差异显著。
| 代理模式 | 转发机制 | 性能特点 | 适用规模 |
|---|---|---|---|
| iptables | DNAT 规则链 | 规则数量线性增长,大规模集群性能下降 | 小规模(< 1000 服务) |
| IPVS | 内核哈希表 | O(1) 查找,吞吐高,支持更多调度算法 | 中大规模(推荐) |
| eBPF (Cilium) | BPF 程序 | 延迟极低,可编程,支持 L7 策略 | 高性能场景 |
性能陷阱:iptables 模式下,每增加一个 Service 都会在所有节点上插入多条规则。当集群规模超过 5000 个 Service 时,规则更新延迟可达秒级,严重影响网络性能。
1.4 EndpointSlice 原理
EndpointSlice 是 Kubernetes v1.21+ 中用于替代传统 Endpoints 的资源对象,解决了大规模集群中 Endpoints 对象的性能瓶颈。
核心改进:
- 分片存储:每个 EndpointSlice 最多存储 100 个端点,避免单个对象过大。
- 增量更新:Pod 变化时只更新对应的分片,减少全量同步开销。
- 拓扑感知:支持将端点按节点/区域分组,实现拓扑感知路由。
性能对比:在 5000 个 Pod 的集群中,传统 Endpoints 对象大小可达 2MB,更新延迟 > 5s;EndpointSlice 分片后每个对象 < 20KB,更新延迟 < 100ms。
1.5 本章小结
| 概念 | 核心作用 | 性能关注点 |
|---|---|---|
| CNI | Pod 网络接口与 IP 分配 | 封装模式、路由方式、MTU 配置 |
| Pod 网络模型 | 扁平 IP 空间,无 NAT 通信 | 跨节点隧道开销、网络策略影响 |
| Service | 稳定虚拟 IP 与负载均衡 | 代理模式选择(iptables vs IPVS vs eBPF) |
| EndpointSlice | 端点分片存储与增量更新 | 分片大小、拓扑感知路由 |