1. Linux 网络命名空间深度实践
1.1 虚拟以太网设备(veth pair)详解
veth pair是Linux网络虚拟化中最基础的组件之一,它的工作原理类似于一根虚拟的网线,两端分别连接不同的网络命名空间。在实际操作中,我经常使用veth pair来实现容器与宿主机、容器与容器之间的网络通信。
veth设备有几个关键特性需要特别注意:
- 必须成对创建,删除一端会自动删除另一端
- 数据传输是双向的,类似管道机制
- 支持跨命名空间部署,这是容器网络的基础
- 性能接近物理网卡,但仍有约5-10%的 overhead
创建veth pair的标准命令如下:
bash复制# 创建一对名为veth0和veth1的虚拟设备
sudo ip link add veth0 type veth peer name veth1
# 查看设备状态(注意@符号表示配对关系)
ip link show | grep veth
3: veth0@veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
4: veth1@veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
# 删除设备(只需删除任意一端)
sudo ip link delete veth0
实际经验:在生产环境中,建议为veth设备设置唯一且有意义的名称,比如按业务命名(如nginx-frontend),方便后期维护和故障排查。
1.2 跨命名空间网络连接实战
下面通过一个完整案例演示如何连接两个隔离的网络命名空间。这个场景模拟了两个容器需要互相通信的情况。
环境准备
首先创建两个网络命名空间:
bash复制sudo ip netns add ns1
sudo ip netns add ns2
网络拓扑
我们构建的拓扑结构如下:
code复制ns1 (10.0.0.1/24) <---> ns2 (10.0.0.2/24)
详细实现步骤
- 创建veth pair:
bash复制sudo ip link add veth1 type veth peer name veth2
- 将设备分配到各自的命名空间:
bash复制sudo ip link set veth1 netns ns1
sudo ip link set veth2 netns ns2
- 配置IP地址并启动设备:
bash复制# ns1配置
sudo ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth1
sudo ip netns exec ns1 ip link set veth1 up
sudo ip netns exec ns1 ip link set lo up
# ns2配置
sudo ip netns exec ns2 ip addr add 10.0.0.2/24 dev veth2
sudo ip netns exec ns2 ip link set veth2 up
sudo ip netns exec ns2 ip link set lo up
- 测试连通性:
bash复制sudo ip netns exec ns1 ping -c 3 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.041 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.036 ms
排错技巧:如果ping不通,建
