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)。数据包从一端进入,会直接从另一端出来,实现跨命名空间的二层桥接。
Pod 网络栈结构
| 组件 | 位置 | 作用 |
|---|---|---|
| Pod 网络命名空间 | 每个 Pod 独立 | 隔离网络栈,包含 eth0、路由、ARP |
| veth pair(Pod 端) | Pod 命名空间内 | 通常命名为 eth0,作为 Pod 默认网卡 |
| veth pair(宿主机端) | 宿主机根命名空间 | 通常命名为 vethXXXX,连接至网桥或路由 |
| 容器网桥(cbr0/docker0) | 宿主机根命名空间 | 二层转发,连接同一宿主机上的 veth 对端 |
2.2 CNI 插件原理
CNI(Container Network Interface)是 Kubernetes 与容器运行时之间的网络配置标准。当 Pod 被创建时,kubelet 调用容器运行时(如 containerd),容器运行时再调用 CNI 插件来完成网络配置。
CNI 工作流程
- ADD 操作: 容器运行时将 Pod 的命名空间路径、容器 ID、网络配置(JSON)传递给 CNI 插件。
- 创建 veth pair: 插件在宿主机和 Pod 命名空间之间创建 veth pair。
- 分配 IP 地址: 插件调用 IPAM(IP Address Management)模块,从集群 CIDR 中分配一个 IP 给 Pod 的 eth0。
- 配置路由与 ARP: 插件在 Pod 命名空间内设置默认路由,在宿主机上添加路由或配置网桥转发规则。
- DEL 操作: Pod 删除时,插件清理 veth pair、释放 IP、删除路由。
/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 的映射关系。
2.4 数据路径总结
结合以上三个组件,一个跨宿主机 Pod 通信的完整数据路径如下:
- Pod A 发送: 数据包从 Pod A 的 eth0 发出,通过 veth pair 到达宿主机 A 的根命名空间。
- 宿主机 A 转发: 数据包到达宿主机 A 的网桥或路由表,根据目的 IP 判断需要跨宿主机通信。
- VXLAN 封装: 数据包被 VTEP A 捕获,查询 FDB 表找到 VTEP B 的 IP,进行 VXLAN 封装。
- 物理网络传输: 封装后的数据包通过宿主机 A 的物理网卡发送到宿主机 B。
- VXLAN 解封装: 宿主机 B 的 VTEP 收到数据包,解封装还原原始帧。
- 宿主机 B 转发: 原始帧通过宿主机 B 的网桥或路由,到达 veth pair 的宿主机端。
- Pod B 接收: 数据包通过 veth pair 进入 Pod B 的网络命名空间,由 Pod B 的 eth0 接收。