2. 容器网络基础:CNI插件原理、Overlay网络模型、Pod网络命名空间与veth pair

容器网络是 Kubernetes 集群中最为复杂且关键的组件之一。理解其底层原理,是进行缓存命中巡检与 Flow Log 对账的前提。本章将深入剖析 CNI 插件的工作机制、Overlay 网络的数据封装模型,以及 Pod 网络命名空间与 veth pair 的协作关系。

2.1 Pod 网络命名空间与 veth pair

每个 Pod 在宿主机上拥有独立的网络命名空间(Network Namespace),该命名空间拥有自己的网络栈:包括网卡(eth0)、路由表、ARP 表以及 iptables/ebtables 规则。Pod 内的所有容器共享这个命名空间,因此它们可以通过 localhost 互相通信。

Pod 与宿主机之间的数据通道由 veth pair(虚拟以太网对)实现。veth pair 是一对虚拟网卡,一端在 Pod 的网络命名空间内(通常命名为 eth0),另一端在宿主机的根网络命名空间(通常命名为 vethXXXX)。数据包从一端进入,会直接从另一端出来,实现跨命名空间的二层桥接。

关键理解: veth pair 是 Pod 网络通信的“门”。所有进出 Pod 的流量,无论是东西向(Pod-to-Pod)还是南北向(Pod-to-External),都必须经过这对虚拟网卡。

Pod 网络栈结构

组件 位置 作用
Pod 网络命名空间 每个 Pod 独立 隔离网络栈,包含 eth0、路由、ARP
veth pair(Pod 端) Pod 命名空间内 通常命名为 eth0,作为 Pod 默认网卡
veth pair(宿主机端) 宿主机根命名空间 通常命名为 vethXXXX,连接至网桥或路由
容器网桥(cbr0/docker0) 宿主机根命名空间 二层转发,连接同一宿主机上的 veth 对端
Pod 网络命名空间与 veth pair 结构 宿主机根网络命名空间 Pod A 网络命名空间 eth0 (veth pair 端) IP: 10.1.1.2/24 MAC: 02:42:0a:01:01:02 默认路由: 10.1.1.1 Pod B 网络命名空间 eth0 (veth pair 端) IP: 10.1.1.3/24 MAC: 02:42:0a:01:01:03 默认路由: 10.1.1.1 vethA (宿主机端) vethB (宿主机端) 容器网桥 (cbr0 / docker0)

2.2 CNI 插件原理

CNI(Container Network Interface)是 Kubernetes 与容器运行时之间的网络配置标准。当 Pod 被创建时,kubelet 调用容器运行时(如 containerd),容器运行时再调用 CNI 插件来完成网络配置。

CNI 工作流程

  1. ADD 操作: 容器运行时将 Pod 的命名空间路径、容器 ID、网络配置(JSON)传递给 CNI 插件。
  2. 创建 veth pair: 插件在宿主机和 Pod 命名空间之间创建 veth pair。
  3. 分配 IP 地址: 插件调用 IPAM(IP Address Management)模块,从集群 CIDR 中分配一个 IP 给 Pod 的 eth0。
  4. 配置路由与 ARP: 插件在 Pod 命名空间内设置默认路由,在宿主机上添加路由或配置网桥转发规则。
  5. DEL 操作: Pod 删除时,插件清理 veth pair、释放 IP、删除路由。
运维提示: 在排查“Pod 网络不通”问题时,应首先检查 CNI 插件的日志(通常位于 /var/log/cni/ 或通过 journalctl -u kubelet 查看)。常见的失败原因包括:IP 池耗尽、veth pair 创建失败、网桥 MAC 地址表溢出。

主流 CNI 插件对比

插件 网络模型 IPAM 特点
Flannel Overlay (VXLAN/Host-GW) host-local 部署简单,性能一般,适合中小集群
Calico 纯路由 (BGP) / Overlay (IPIP/VXLAN) host-local / 集中式 性能高,支持 NetworkPolicy,适合大规模
Cilium Overlay (VXLAN) / 原生路由 host-local / Kubernetes CRD 基于 eBPF,高性能,可观测性强
Weave Overlay (VXLAN / weave mesh) weave IPAM 加密通信,跨云混合部署

2.3 Overlay 网络模型

Overlay 网络是解决跨宿主机 Pod 通信的核心方案。它在宿主机底层网络(Underlay)之上构建一层虚拟网络,使得 Pod 的 IP 地址在集群内全局可达,而无需关心底层物理拓扑。

VXLAN 封装原理

VXLAN(Virtual Extensible LAN)是最常用的 Overlay 技术。它将 Pod 发出的原始二层帧封装在 UDP 数据包中,通过宿主机物理网卡发送到对端宿主机。

  • 原始帧: Pod A (10.1.1.2) → Pod B (10.1.2.3),包含源/目的 MAC 和 IP。
  • VXLAN 封装: 在原始帧前添加 VXLAN 头部(8 字节),再添加 UDP 头部(8 字节),外层 IP 头部(20 字节),外层 MAC 头部(14 字节)。
  • VTEP: VXLAN Tunnel End Point,通常由 Linux 内核的 vxlan 接口或网卡硬件实现,负责封装和解封装。
  • FDB 表: 转发数据库,记录远端 Pod MAC 与 VTEP IP 的映射关系。
性能注意: VXLAN 封装会增加约 50 字节的头部开销,可能导致 MTU 问题。建议将宿主机物理网卡 MTU 设置为 1500,容器网络 MTU 设置为 1450。在 Flow Log 对账时,需注意 VXLAN 封装会导致原始数据包大小发生变化,影响流量统计的准确性。
Overlay 网络 VXLAN 封装与转发流程 宿主机 A (Node1) Pod A 10.1.1.2 VTEP A 192.168.1.10 eth0 (物理) 192.168.1.10 宿主机 B (Node2) Pod B 10.1.2.3 VTEP B 192.168.1.20 eth0 (物理) 192.168.1.20 VXLAN 隧道 (UDP 4789) 封装: 外层 MAC + 外层 IP + UDP + VXLAN + 原始帧

2.4 数据路径总结

结合以上三个组件,一个跨宿主机 Pod 通信的完整数据路径如下:

  1. Pod A 发送: 数据包从 Pod A 的 eth0 发出,通过 veth pair 到达宿主机 A 的根命名空间。
  2. 宿主机 A 转发: 数据包到达宿主机 A 的网桥或路由表,根据目的 IP 判断需要跨宿主机通信。
  3. VXLAN 封装: 数据包被 VTEP A 捕获,查询 FDB 表找到 VTEP B 的 IP,进行 VXLAN 封装。
  4. 物理网络传输: 封装后的数据包通过宿主机 A 的物理网卡发送到宿主机 B。
  5. VXLAN 解封装: 宿主机 B 的 VTEP 收到数据包,解封装还原原始帧。
  6. 宿主机 B 转发: 原始帧通过宿主机 B 的网桥或路由,到达 veth pair 的宿主机端。
  7. Pod B 接收: 数据包通过 veth pair 进入 Pod B 的网络命名空间,由 Pod B 的 eth0 接收。
对账关键点: 在跨环境迁移的 Flow Log 对账中,需要特别关注 VXLAN 封装带来的额外开销。源端 Flow Log 记录的是原始数据包大小,而宿主机网卡抓包看到的是封装后的大小。对账时需统一口径,否则会出现流量偏差。