network namespace
理论
我们都知道容器化技术的两大柱石是linux的namespace和cgroup两大基础能力。
namespace提供资源隔离能力,cgroup提供资源限制的能力。
linux提供6种不同的ns类型,对不同的资源进行隔离。分别是
Mount: 隔离文件系统挂载点UTS: 隔离主机名和域名信息IPC: 隔离进程间通信PID: 隔离进程的IDNetwork: 隔离网络资源User: 隔离用户和用户组的ID
现在我们重点关注network namespace。这是整个k8s网络的基础的基础。
因为有了network的隔离,所以我们进到容器里,感觉就是每个容器好像都有自己的网络设备(虚拟的),每个容器都可以随意监听自己的端口而不用担心端口冲突。
实践
network namespace相关操作命令是在ip netns 命令下。
可以先看一下help
1 | # ip netns help |
如果你不能执行ip netns。报这个粗
1 | Object "netns" is unknown, try "ip help". |
是因为你的linux内核版本不支持。我一开始用的centos6.5不行。然后换了个centos 7的就可以了。
CentOS6.5以前,内核不支持网络namespace,需要升级内核和iproute。升级到6.7以后的都可以。
创建一个network namespace
1 | ip netns add mynet |
查看一下
1 | # ip netns list |
在network ns创建后,会在/var/run/netns/目录下创建一个同名的挂载点
1 | ]# ls /var/run/netns/ -l |
使用ip netns exec进入network ns执行操作
查看网卡配置
1 | # ip netns exec mynet ip link list |
目前没有任何配置,只有一个lo 回环设备。
状态还是DOWN的。因此现在ping 本地也是不通的。
1 | # ip netns exec mynet ping 127.0.0.1 |
开启网络设备
进入ns,使用ip link set dev 命令将lo设备状态置为UP
1 | ip netns exec mynet ip link set dev lo up |

现在就可以ping通了。
现在我们还是只能ping通本地,还无法和外界通信。
要实现两个ns间互通的目标,需要借助veth peer
关于veth peer我们下节再讲,因为内容会比较多。然后继续我们的实验。