Docker高级网络实战¶
1.玩转Linux Network Namespace¶
# 创建2个network namespace
[root@k8s-px-node1 centos]# sudo ip netns add nstet
[root@k8s-px-node1 centos]# sudo ip netns add nstest
# 列出系统中已存在的network namespace
[root@k8s-px-node1 centos]# sudo ip netns list
nstest
nstet
# 删除一个network namespace
[root@k8s-px-node1 centos]# sudo ip netns delete nstet
# 在network namespace中执行一条命令
sudo ip netns exec <network namespace name> <command>
[root@k8s-px-node1 centos]# sudo ip netns exec nstest ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
在namespace中启动一个shell,具体示例如下:
# 命令格式
sudo ip netns exec <network namespace name> bash
sudo ip netns exec nstest bash
2.使用ip命令为network namespace配置网卡¶
# 启动回环地址
sudo ip netns exec nstest ip link set dev lo up
# 在主机上创建两张虚拟网卡veth-a和veth-b
sudo ip link add veth-a type veth peer name veth-b
# 将veth-b设备添加到nstest这个network namespace中,veth-a留在主机中。
sudo ip link set veth-b netns nstest
# network namespace有两块网卡了,lo和veth-b
[root@k8s-px-node1 centos]# sudo ip netns exec nstest ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
49: veth-b@if50: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether fa:b1:98:b9:4f:17 brd ff:ff:ff:ff:ff:ff link-netnsid 0
# 为网卡分配IP并启动网卡
sudo ip addr add 10.0.0.1/24 dev veth-a
sudo ip link set dev veth-a up
# 为nstest中的veth-b配置IP并启动
sudo ip netns exec nstest ip addr add 10.0.0.2/24 dev veth-b
sudo ip netns exec nstest ip link set dev veth-b up
给两张网卡配置了IP后,会在各自的network namespace中生成一条路由,用ip route或route -a命令查看一下:
# 在主机中
[root@k8s-px-node1 centos]# sudo ip route
default via 172.16.72.254 dev eth0
10.0.0.0/24 dev veth-a proto kernel scope link src 10.0.0.1
#在nstest network namespace中
[root@k8s-px-node1 centos]# sudo ip netns exec nstest ip route
10.0.0.0/24 dev veth-b proto kernel scope link src 10.0.0.2
这两条路由表名的意义是目的地址为10.0.0.0/24网络的IP包分别从veth-a和veth-b发出。
现在network namespace的nstest有了直接的网卡、IP地址、路由表等信息,俨然成了一台小型的“虚拟机”。
测试一下连通性:
# 从宿主机ping network namespace的veth-a网卡去pingveth-b网卡
[root@k8s-px-node1 centos]# ping 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.308 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.090 ms
从network namespace的nstest 中的veth-b网卡ping主机的veth-a网卡
[root@k8s-px-node1 centos]# sudo ip netns exec nstest ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.200 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.082 ms