Linux 容器网络深度实战:从 Docker 网络模型到 Kubernetes CNI
容器技术的兴起彻底改变了软件的部署方式,而网络作为容器间通信的基石,一直是容器技术中最复杂、最有挑战性的部分。本文将从 Linux 内核网络机制出发,深入剖析 Docker 的网络模型、veth 设备对、Linux 桥接、网络命名空间等核心概念,并进一步探讨 Kubernetes CNI 的工作原理与生产实践。
一、为什么容器网络如此重要?
在现代微服务架构中,容器之间的网络通信占据了系统交互的绝大部分。一个生产级的容器平台需要解决以下核心问题:
- 如何让每个容器拥有独立的网络栈和 IP 地址?
- 如何实现容器间跨主机通信?
- 如何保证网络隔离与安全性?
- 如何维持稳定的网络性能?
- 如何让外部流量进入容器内部?
Docker 通过 libnetwork 组件实现了这一切,而 Kubernetes 则通过 CNI(Container Network Interface)插件体系将网络能力进一步抽象和扩展。
二、Linux 网络命名空间:容器的网络隔离基石
网络命名空间(Network Namespace)是 Linux 内核提供的一种轻量级网络隔离机制。每个网络命名空间拥有完全独立的网络协议栈,包括:独立的网络设备、独立的 IP 地址和路由表、独立的防火墙规则、独立的套接字和连接状态。
ip netns add ns1\nip netns add ns2\nip netns list\nip netns exec ns1 ip addr show默认情况下,新的网络命名空间中只有一个环回接口(lo),且处于 DOWN 状态。不同命名空间中的进程默认无法通信——这正是容器网络隔离的基础。
三、veth 设备对:连接命名空间的"网络管道"
veth(Virtual Ethernet)总是成对出现,数据从一端进入后,会从另一端原样流出,就像一根"网络管道"。Docker 为每个容器创建网络栈时,就是使用 veth 设备对将容器的网络命名空间连接到宿主机侧的网桥上。
ip link add veth0 type veth peer name veth1\nip link set veth0 netns ns1\nip link set veth1 netns ns2\nip netns exec ns1 ip addr add 10.0.0.1/24 dev veth0\nip netns exec ns2 ip addr add 10.0.0.2/24 dev veth1\nip netns exec ns1 ip link set veth0 up\nip netns exec ns2 ip link set veth1 up\nip netns exec ns1 ping 10.0.0.2veth 本质上是一个通过内核直通的虚拟以太通道,数据包延迟极低,通常只比普通网卡高 1-2 微秒。
四、Linux 网桥:二层网络的交换机模拟
Linux 网桥工作在数据链路层(Layer 2),行为类似于物理交换机。Docker 在宿主机上创建的 docker0 就是一个 Linux 网桥。
ip link add name br0 type bridge\nip link set br0 up\nip link set veth1 master br0\nip addr add 10.0.0.254/24 dev br0\nbridge link showDocker 的默认网桥模式工作流程:创建容器时建立 veth pair,容器侧命名为 eth0,宿主机侧挂载到 docker0 网桥,所有容器出站流量经过网桥转发,通过 NAT 规则访问外部网络,通过端口映射接受外部入站连接。
五、Docker 网络模式全景
Docker 通过 libnetwork 框架提供多种网络驱动:
- Bridge 模式(默认):通过 veth 连接到 docker0 网桥
- Host 模式:容器直接使用宿主机网络命名空间
- Container 模式:共享另一个容器的网络命名空间
- Macvlan 模式:为每个容器分配 MAC 地址,直连物理网络
- IPvlan 模式:共享 MAC,通过不同 IP 区分
- Overlay 模式:VXLAN 隧道实现跨主机通信
六、Kubernetes CNI:云原生网络的工业化解决方案
CNI(Container Network Interface)是 CNCF 托管的规范,定义了容器运行时如何与网络插件交互的标准接口。CNI 规范定义了两个核心操作:ADD(创建网络)和 DEL(清理网络)。
CNI 插件架构对比
| 插件 | 网络模型 | Overlay 技术 | 适用场景 |
|---|---|---|---|
| Calico | 纯三层路由 | 可选 VXLAN/IPIP | 大规模集群、高性能需求 |
| Flannel | 二层 Overlay | VXLAN/Host-gw | 简单部署、中小规模 |
| Cilium | eBPF 三层 | 可选 VXLAN | 高性能、网络可观测性 |
| Weave Net | 二层 Overlay | UDP/VXLAN | 快速部署、多播环境 |
| AWS VPC CNI | VPC 原生路由 | 无 | AWS EKS 原生 |
| Azure CNI | VPC 原生路由 | 无 | Azure AKS 原生 |
Calico:大规模集群的标杆方案
Calico 是生产中最广泛使用的 CNI 插件之一,核心设计理念是「三层路由,无 Overlay」。Calico 架构包含三个核心组件:Felix(配置路由和ACL)、BIRD(BGP 路由守护进程)、confd(监控 etcd 变化)。主要优势包括无 NAT、高性能、细粒度策略、支持超过 5000 节点。
Cilium:基于 eBPF 的下一代网络方案
Cilium 利用 Linux eBPF 技术,将网络策略、负载均衡、可观测性等全部下沉到内核层。核心能力包括:eBPF datapath 绕过 iptables、Cluster Mesh 跨集群服务网格、深度可观测性(Hubble)、高级 L7 策略。Cilium 避免了 kube-proxy 的 iptables 规则爆炸问题,通过 eBPF hash map 实现 O(1) 查询。
helm install cilium cilium/cilium --namespace kube-system \\\n --set kubeProxyReplacement=strict \\\n --set hubble.relay.enabled=true\ncilium status --wait\ncilium connectivity test七、容器网络性能优化实战
内核参数调优
net.core.rmem_max = 16777216\nnet.core.wmem_max = 16777216\nnet.ipv4.tcp_rmem = 4096 87380 16777216\nnet.ipv4.tcp_wmem = 4096 65536 16777216\nnet.netfilter.nf_conntrack_max = 1048576\nnet.ipv4.ip_local_port_range = 1024 65535\nnet.ipv4.tcp_fastopen = 3SR-IOV 与硬件直通
SR-IOV 将物理网卡虚拟化为多个 VF,直接分配给 Pod,几乎达到裸金属网络性能。
高性能用户态网络
DPDK/netmap 完全绕过内核网络栈,可将小包转发性能提升至千万级 pps。
八、网络策略与安全隔离
NetworkPolicy 定义了 Pod 之间的通信规则,支持基于命名空间、标签、IP 块、端口的精细控制。服务网格(Istio/Envoy/Linkerd)提供更上层的零信任保障。
九、排障工具箱
docker ps --format "table {{.ID}}\t{{.Ports}}"\nnsenter -t PID -n ip addr\nbridge link show\ntcpdump -i vethxxxx -nn port 80\nkubectl get endpointslices\nkubectl get NetworkPolicy -A\ncilium monitor -t drop\nhubble observe --pod pod_name\ncalicoctl ipam show十、总结与展望
容器网络从 veth bridge 到 Macvlan/IPvlan,再到 Overlay,如今已进入 eBPF 驱动的新时代。发展趋势包括:eBPF 化(Cilium)、DPU/IPU 硬件卸载、SR-IOV 普及、Cluster Mesh、网络可观测性。掌握 Linux 内核网络机制和容器编排设计哲学,就能应对未来云原生网络演进的挑战。

发表评论 取消回复