记录一下关于使用ip命令操作namespace的方法,刚好装了openvswitch,搭配ovs进行一下联合测试。
先简单介绍一下namespace的相关概念
Namespace是Linux提供的一种内核级别环境隔离的方法
这里引用一张图
namespace实际上有6中,比如说容器的实现也正是利用了namespace,这里只是单纯的说明一下网络命名空间
Network NameSpace实质上是为了支持kvm、容器等虚拟化所打造的一个虚拟化网络环境,他使得你可以创建不同的命名空间,并且每个命名空间都是相对独立的,有自己的ip、arp、route,并且每个命名空间都相互不影响。
举个简单的例子:docker容器namespace点对点通信
这里说明了操作不同的ns可以给ns所对应的container中添加netdev,也就刚好说明了container的隔离性。
拓扑结构如下
先创建两个namespace
[root@docker_server ~]# ip netns add ns1
[root@docker_server ~]# ip netns add ns2
然后再创建两组veth
veth的概念引用博客:Linux-虚拟网络设备-veth pair
简单说就是:成对出现,两个相互连接的命名空间(两个设备间相当于用网线直接连接在一起)
[root@docker_server ~]# ip link add type veth
[root@docker_server ~]# ip link add type veth
默认会创建下面两对点到点的veth
veth0---veth1
veth2---veth3
或者这样创建自定义命名设备
ip link add veth0 type veth peer name veth1
ip link add veth2 type veth peer name veth2
把veth1/veth3划到ns1/ns2中,并配置ip
[root@docker_server ~]# ip link set veth1 netns ns1
[root@docker_server ~]# ip link set veth3 netns ns2
[root@docker_server ~]# ip netns exec ns1 ip addr add 192.168.1.1/24 dev veth1
[root@docker_server ~]# ip netns exec ns2 ip addr add 192.168.1.2/24 dev veth3
[root@docker_server ~]# ip netns exec ns1 ip link set dev veth1 up
[root@docker_server ~]# ip netns exec ns2 ip link set dev veth3 up
[root@docker_server ~]# ip netns exec ns1 ip addr show veth1
15: veth1@if14: mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 42:21:16:e1:1b:d2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.1.1/24 scope global veth1
valid_lft forever preferred_lft forever
inet6 fe80::4021:16ff:fee1:1bd2/64 scope link
valid_lft forever preferred_lft forever
[root@docker_server ~]# ip netns exec ns2 ip addr show veth3
17: veth3@if16: mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 06:78:37:29:b4:2a brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.1.2/24 scope global veth3
valid_lft forever preferred_lft forever
inet6 fe80::478:37ff:fe29:b42a/64 scope link
valid_lft forever preferred_lft forever
先ping一下,测试一下namespace的功能
[root@docker_server ~]# ip netns exec ns1 ping -c1 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
--- 192.168.1.2 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
在把veth1/veth3的点对点设备veth0/veth2划到ovs0中,并up端口
[root@docker_server ~]# ovs-vsctl add-port ovs0 veth0
[root@docker_server ~]# ovs-vsctl add-port ovs0 veth3
[root@docker_server ~]# ip link set dev veth0 up
[root@docker_server ~]# ip link set dev veth2 up
[root@docker_server ~]# ovs-vsctl show
03a08428-3278-4a6c-835b-29f4d91e5da2
Bridge "ovs0"
Port "veth2"
Interface "veth2"
Port "ovs0"
Interface "ovs0"
type: internal
Port "veth0"
Interface "veth0"
Port "gre1"
Interface "gre1"
type: gre
options: {remote_ip="172.16.0.2"}
从ns1上ping ns2
[root@docker_server ~]# ip netns exec ns1 ping -c1 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=2.48 ms
--- 192.168.1.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.484/2.484/2.484/0.000 ms
[root@docker_server ~]#
ovs,namespace,veth的功能都符合预期