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
数据包在宿主机上的典型路径:
- 容器 eth0 → veth pair → 宿主机 veth 端
- 宿主机 veth 端 → 网桥(或直接进入路由表)
- 路由表查找:目标 IP 是否在同一子网?
- 同一子网 → 网桥 L2 转发;不同子网 → 查默认网关或 Calico 路由
- Calico 场景:BGP 路由或 IPIP 隧道封装后发出宿主机
1.5 容器网络数据流全景图
下图展示了两个容器通过网桥通信的完整数据流,以及 Calico 策略在路由阶段的插入点。
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 表满导致缓存失效。