2、容器网络基础:Linux网络命名空间原理、veth pair与bridge的工作原理
容器网络的核心在于Linux内核提供的三大网络虚拟化技术:网络命名空间(Network Namespace)、veth pair(虚拟以太网对)和bridge(虚拟网桥)。理解这三者的原理与协作关系,是分析容器进程网络IO容量瓶颈的前提。
2.1 网络命名空间:容器网络的隔离基石
网络命名空间(netns)是Linux内核实现网络资源隔离的机制。每个netns拥有独立的网络协议栈,包括:
- 网络接口(lo、eth0等)
- 路由表
- ARP表
- iptables/netfilter规则
- 套接字(socket)
- /proc/net目录
容器本质上就是运行在独立netns中的进程组。默认情况下,宿主机拥有全局的默认网络命名空间,而每个容器被创建时,Docker/containerd会为其分配一个新的netns。
关键指标: 在单台宿主机上,可创建的网络命名空间数量受内核参数
kernel.max_net_namespaces 限制(默认约4万+),但实际受内存和文件描述符限制。每个netns约消耗4KB内存。
2.2 veth pair:连接命名空间的虚拟网线
veth pair是一对虚拟以太网接口,总是成对出现。数据从一端进入,立即从另一端流出,行为类似一根虚拟网线。veth pair通常一端放置在容器netns中(命名为eth0),另一端放置在宿主机默认netns中(命名为vethXXXX)。
| 特性 | 说明 |
|---|---|
| 工作方式 | 全双工,一端发送的数据帧直接出现在另一端 |
| MTU限制 | 默认1500,可调整;MTU不匹配会导致分片或丢包 |
| 性能开销 | 纯内核态数据拷贝,无用户态切换,但存在内存拷贝和软中断开销 |
| 典型位置 | 一端在容器netns(eth0),一端在宿主机netns(vethXXX) |
| 常见瓶颈 | 大量容器时,veth对数量过多导致内核哈希表冲突和CPU软中断负载不均 |
性能观察点: 在宿主机上执行
ip link show type veth 可列出所有veth对。观察 RX/TX errors、dropped 和 overruns 计数器,这些是网络IO容量瓶颈的直接信号。
2.3 Linux bridge:虚拟二层交换机
Linux bridge(网桥)是一个内核模块,实现虚拟二层交换机的功能。它将多个网络接口(物理或虚拟)桥接在一起,基于MAC地址表转发数据帧。在容器网络中,bridge通常作为宿主机默认netns内的虚拟交换机,连接所有容器的veth对端。
bridge的核心组件包括:
- 端口(Port):每个veth对端或物理网卡作为bridge的一个端口
- MAC地址表:记录MAC地址与端口的映射关系,用于二层转发决策
- STP(生成树协议):防止二层环路
- FDB(转发数据库):存储MAC地址学习结果
常见陷阱: 当容器数量超过数百个时,bridge的MAC地址表可能膨胀到数万条,导致哈希查找性能下降。同时,大量veth端口共享同一个bridge的CPU软中断处理,可能造成单核软中断过载。
2.4 容器网络数据流全景
下图展示了容器进程发送网络数据包时,经过的完整路径:从容器内进程 → 容器netns → veth pair → 宿主机bridge → 物理网卡 → 外部网络。
2.5 三层技术协作关系总结
| 技术组件 | 类比物理设备 | 核心作用 | 容器网络中的角色 |
|---|---|---|---|
| 网络命名空间 | 独立的网络机房 | 隔离网络协议栈、接口、路由 | 每个容器拥有独立的netns |
| veth pair | 网线 | 连接两个netns,传输二层数据帧 | 连接容器netns与宿主机netns |
| Linux bridge | 二层交换机 | 基于MAC地址表转发数据帧 | 宿主机内虚拟交换机,连接所有容器 |