网络命名空间(namespace)

命名空间(Linux namespace)是linux内核针对实现容器虚拟化映入的一个特性。我们创建的每个容器都有自己的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样,命名空间保证了容器之间互不影响。

命名空间和cgroups是软件集装箱化(Docker)的大部分新趋势的主要内核技术之一。 简单来说,cgroups是一种计量和限制机制,它们控制您可以使用多少系统资源(CPU,内存)。 另一方面,命名空间限制了您可以看到的内容。 由于命名空间进程有自己的系统资源视图。

一、作用
项目中使用网络命名空间,用来隔离不同空间的应用。命名空间的使用类似虚拟化技术,在同一台物理机上,创建多个命名空间相互独立、各个空间的进程独立运行,互不干扰。

二、Linux上的操作

容器里改名字的代码 容器 命名空间_网络设备

三、如何使两个命名空间ping通

容器里改名字的代码 容器 命名空间_虚拟网络_02


① 创建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指令后得到:

容器里改名字的代码 容器 命名空间_网络设备_03


网卡中的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通