1. 容器网络基础:Linux 网络命名空间、veth pair、网桥与路由原理

容器网络的核心是 Linux 内核提供的虚拟化网络能力。理解网络命名空间(Network Namespace)、veth pair、网桥(Bridge)和路由规则,是排查容器网络缓存命中故障的前提。本节从底层原理出发,逐步拆解容器数据包的完整路径。

1.1 网络命名空间:隔离的网络栈

网络命名空间(netns)是 Linux 内核实现网络隔离的基本单元。每个 netns 拥有独立的网络设备、IP 地址、路由表、防火墙规则和 socket 监听。容器本质上就是运行在独立 netns 中的进程。

组件 隔离范围 容器场景
网络设备 lo、eth0、veth 等 每个容器拥有自己的 eth0
IP 地址 IPv4/IPv6 地址池 容器 IP 不与宿主机冲突
路由表 独立 FIB 表 容器可自定义默认网关
iptables/ebtables 独立规则链 Calico 策略在此生效
/proc/net 独立文件系统视图 ss、netstat 只看到本 netns
排查要点: 当容器网络缓存命中异常时,首先确认容器是否运行在预期的 netns 中。使用 ip netns list 查看所有 netns,用 nsenter -t <PID> -n ip addr 进入容器 netns 检查 IP 和路由。

1.2 veth pair:虚拟以太网线缆

veth(Virtual Ethernet)是一对虚拟网卡,像一根网线的两端——一端发送的数据包,另一端立即收到。容器网络依赖 veth pair 将容器 netns 连接到宿主机网络栈。

  • 创建方式: ip link add veth0 type veth peer name veth1
  • 典型部署: 一端放入容器 netns(命名为 eth0),另一端留在宿主机(通常命名为 vethXXXX)。
  • 数据流特性: 全双工、L2 转发、不修改数据包内容。
缓存故障关联: veth pair 本身不缓存数据包,但容器 eth0 的 tx_queue_len 和宿主机端 veth 的 rx_queue_len 可能因拥塞导致丢包,间接影响缓存命中后的响应速度。使用 ip -s link show vethXXXX 检查丢包计数。

1.3 网桥:虚拟二层交换机

Linux 网桥(Bridge)是内核实现的虚拟二层交换机,基于 MAC 地址学习转发数据帧。在容器网络中,网桥将同一宿主机上的多个容器连接在同一个 L2 域内,实现容器间直接通信。

网桥模式 转发方式 典型场景
默认桥接 MAC 学习 + FDB 表 Docker bridge 模式
Open vSwitch 流表匹配 + 隧道封装 Kubernetes + OVN
ebpf 加速桥 XDP 旁路内核协议栈 Cilium 替代方案
缓存命中陷阱: 网桥的 FDB(转发数据库)表项有老化时间(默认 300s)。当容器迁移或 IP 变化后,FDB 表未及时更新会导致数据帧被错误泛洪,造成缓存命中延迟。使用 bridge fdb show 检查表项时效性。

1.4 路由原理:容器数据包的路径决策

容器数据包从 veth 进入宿主机后,由内核路由子系统决定下一跳。路由查找基于 FIB(Forwarding Information Base)表,匹配最长前缀规则。容器网络的路由表通常由 CNI 插件(如 Calico)动态维护。

# 查看容器 netns 内的路由表
ip netns exec <container-ns> ip route show

# 查看宿主机上容器相关的路由
ip route show proto kernel | grep -E "10\.|172\.|192\.168"

# 检查策略路由(Calico 常用)
ip rule show

数据包在宿主机上的典型路径:

  1. 容器 eth0 → veth pair → 宿主机 veth 端
  2. 宿主机 veth 端 → 网桥(或直接进入路由表)
  3. 路由表查找:目标 IP 是否在同一子网?
  4. 同一子网 → 网桥 L2 转发;不同子网 → 查默认网关或 Calico 路由
  5. Calico 场景:BGP 路由或 IPIP 隧道封装后发出宿主机

1.5 容器网络数据流全景图

下图展示了两个容器通过网桥通信的完整数据流,以及 Calico 策略在路由阶段的插入点。

容器网络数据流全景:netns + veth + 网桥 + 路由 容器网络数据流全景图 容器 A netns eth0: 10.0.0.2/24 MAC: AA:BB:CC:DD:01 路由: 默认网关 10.0.0.1 容器 B netns eth0: 10.0.0.3/24 MAC: AA:BB:CC:DD:02 路由: 默认网关 10.0.0.1 vethA 宿主机端 vethB 宿主机端 Linux 网桥 (cni0) MAC 学习 + FDB 表 IP: 10.0.0.1/24 内核路由表 (FIB) 10.0.0.0/24 dev cni0 默认 via 宿主机网关 Calico 策略引擎 iptables / eBPF 网络策略匹配 缓存命中检查 数据流说明: 容器A → vethA → 网桥(cni0) → 路由表 → Calico策略匹配 → 网桥 → vethB → 容器B 缓存命中故障常发生在 Calico 策略匹配阶段,因 conntrack 表项老化或策略规则冲突导致。

1.6 关键排查命令速查表

排查目标 命令 预期输出
查看所有 netns ip netns list 容器 netns 名称列表
进入容器 netns nsenter -t <PID> -n ip addr 容器内网络接口和 IP
检查 veth 对端 ethtool -S vethXXXX 收发包统计、丢包计数
查看网桥 FDB 表 bridge fdb show MAC 地址、端口、老化时间
查看路由表 ip route show table all 所有路由表项(含策略路由)
检查 conntrack 表 conntrack -L 当前连接跟踪条目
缓存命中故障预判: 如果容器间通信首次正常、后续超时,优先检查 conntrack 表是否因策略规则导致条目被提前删除。使用 conntrack -S 查看统计,若 early_drop 计数持续增长,说明 conntrack 表满导致缓存失效。