openvswitch和namespace的搭配使用

记录一下关于使用ip命令操作namespace的方法,刚好装了openvswitch,搭配ovs进行一下联合测试。

先简单介绍一下namespace的相关概念
Namespace是Linux提供的一种内核级别环境隔离的方法
这里引用一张图

openvswitch和namespace的搭配使用_第1张图片
image.png

namespace实际上有6中,比如说容器的实现也正是利用了namespace,这里只是单纯的说明一下网络命名空间

Network NameSpace实质上是为了支持kvm、容器等虚拟化所打造的一个虚拟化网络环境,他使得你可以创建不同的命名空间,并且每个命名空间都是相对独立的,有自己的ip、arp、route,并且每个命名空间都相互不影响。
举个简单的例子:docker容器namespace点对点通信
这里说明了操作不同的ns可以给ns所对应的container中添加netdev,也就刚好说明了container的隔离性。

拓扑结构如下

openvswitch和namespace的搭配使用_第2张图片
image.png

先创建两个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的功能都符合预期

你可能感兴趣的:(openvswitch和namespace的搭配使用)