网络命名空间(namespace)
命名空间(Linux namespace)是linux内核针对实现容器虚拟化映入的一个特性。我们创建的每个容器都有自己的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样,命名空间保证了容器之间互不影响。
命名空间和cgroups是软件集装箱化(Docker)的大部分新趋势的主要内核技术之一。 简单来说,cgroups是一种计量和限制机制,它们控制您可以使用多少系统资源(CPU,内存)。 另一方面,命名空间限制了您可以看到的内容。 由于命名空间进程有自己的系统资源视图。
一、作用
项目中使用网络命名空间,用来隔离不同空间的应用。命名空间的使用类似虚拟化技术,在同一台物理机上,创建多个命名空间相互独立、各个空间的进程独立运行,互不干扰。
二、Linux上的操作
三、如何使两个命名空间ping通
① 创建2个网络命名空间
#ip netns add netns0
#ip netns add netns1
②模拟创建一根网线
1.先创建1对veth虚拟网络设备
veth设备特点
a、veth和其它的网络设备都一样,一端连接的是内核协议栈
b、veth设备是成对出现的,另一端两个设备彼此相连
c、一个设备收到协议栈的数据发送请求后,会将数据发送到另一个设备上去
# ip link add name vnet0 type veth peer name vnet1
创建veth
ip addr show指令后得到:
网卡中的inek/ether这个是Mac地址,一个网卡的物理地址,16进制6byte,全球唯一。
et
BROADCAST,MULTICAST,M-DOWN>:这个叫net_device flag 网络设备的标识
BROADCAST:表示网卡有广播地址,可以发送广播。
MULTICAST:表示网卡可以发送多播报
注意:这两个虚拟网络设备都属于“default” 或“global”命名空间,和物理网卡一样。
③添加网卡到命名空间
# ip link set vnet0 netns netns0
# ip link set vnet1 netns netns1
④给两个主机分别配置ip(进入命名空间启动网卡然后给网卡配置ip),然后互ping
# ip netns exec netns0 ip link set vnet0 up
# ip netns exec netns1 ip link set vnet1 up
# ip netns exec netns0 ip a add 192.168.0.2/24 dev vnet0
# ip netns exec netns1 ip a add 192.168.0.3/24 dev vnet1
# ip netns exec netns0 ping 192.168.0.3
connect: 网络不可达
⑤添加路由(互相配置对端ip为网关,为什么?)
# ip netns exec netns0 ip route add 192.168.0.3 dev vnet0
# ip netns exec netns1 ip route add 192.168.0.2 dev vnet1
# ip netns exec netns0 ping 192.168.0.3 -c 2
此时ping通