本博客主要介绍Openvswitch的一些总结和汇总,大部分内容来自网络摘抄。

什么是OpenvSwitch

  OpenvSwitch,简称OVS是一个虚拟交换软件,主要用于虚拟机VM环境,作为一个虚拟交换机,支持Xen/XenServer, KVM, and VirtualBox多种虚拟化技术。

  在这种某一台机器的虚拟化的环境中,一个虚拟交换机(vswitch)主要有两个作用:

  • 传递虚拟机VM之间的流量

  • 实现虚拟机和外部网络之间的通信

  整个OVS代码用C写的。目前有以下功能:

Standard 802.1Q VLAN model with trunk and access ports
NIC bonding with or without LACP on upstream switch
NetFlow, sFlow(R), and mirroring for increased visibility
QoS (Quality of Service) configuration, plus policing
GRE, GRE over IPSEC, VXLAN, and LISP tunneling
802.1ag connectivity fault management
OpenFlow 1.0 plus numerous extensions
Transactional configuration database with C and Python bindings
High-performance forwarding using a Linux kernel module

OpenvSwitch的组成

  • ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-based switching。

  • ovsdb-server:轻量级的数据库服务,主要保存了整个OVS的配置信息,包括接口啊,交换内容,VLAN啊等等。ovs-vswitchd会根据数据库中的配置信息工作。

  • ovs-dpctl:一个工具,用来配置交换机内核模块,可以控制转发规则。

  • ovs-vsctl:主要是获取或者更改ovs-vswitchd的配置信息,此工具操作的时候会更新ovsdb-server中的数据库。

  • ovs-appctl:主要是向OVS守护进程发送命令的,一般用不上。

  • ovsdbmonitor:GUI工具来显示ovsdb-server中数据信息。

  • ovs-controller:一个简单的OpenFlow控制器。

  • ovs-ofctl:用来控制OVS作为OpenFlow交换机工作时候的流表内容。

概念及工作流程

1. vswitch、Bridge、Datapath

在网络中,交换机和桥都是同一个概念,OVS实现了一个虚拟机的以太交换机,换句话说,OVS也就是实现了一个以太桥。那么,在OVS中,给一个交换机,或者说一个桥,用了一个专业的名词,叫做DataPath!要了解,OVS如何工作,首先需要知道桥的概念。

网桥也叫做桥接器,连接两个局域网的设备,网桥工作在数据链路层,将两个LAN连接,根据MAC地址来转发帧,可以看成一个“低层的路由器”(路由器工作在网络层,根据IP地质进行转发)。

2. 网桥的工作原理

网桥处理包遵循以下几条规则:

  • 在一个接口上接收到的包不会再往那个接口上发送此包。

  • 每个接收到的包都要学习其源MAC地址。

  • 如果数据包是多播或者广播包(通过2层MAC地址确定)则要向接收端口以外的所有端口转发,如果上层协议感兴趣,则还会递交上层处理。

  • 如果数据包的地址不能再CAM表中找到,则向接收端口以外的其他端口转发。

  • 如果CAM表中能找到,则转发给相应端口,如果发送和接收都是统一端口,则不发送。

注意,网桥是以混杂模式工作的。关于网桥更多,请查阅相关资料。

OVS中的bridge

一个桥就是一个交换机。在OVS中创建网桥的命令如下:

[root@xiexianbin_cn ~]# ovs-vsctl show
56542ec5-7c90-416e-908d-16494db83d62
    ovs_version: "2.3.1"
[root@xiexianbin_cn ~]# ovs-vsctl add-br br-ex
[root@xiexianbin_cn ~]# ovs-vsctl show
56542ec5-7c90-416e-908d-16494db83d62
    Bridge br-ex
        Port br-ex
            Interface br-ex
                type: internal
    ovs_version: "2.3.1"
[root@xiexianbin_cn ~]# ifconfig br-ex
br-ex     Link encap:Ethernet  HWaddr F2:BB:2A:13:60:4D  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

[root@xiexianbin_cn ~]# 

当我们创建了一个交换机(网桥)以后,此时网络功能不受影响,但是会产生一个虚拟网卡,br-ex,之所以会产生一个虚拟网卡,是为了实现接下来的交换机(网桥)功能。有了这个交换机后,还需要为这个交换机增加端口(port),一个端口,就是一个物理网卡,当网卡加入到这个交换机之后,其工作方式就和普通交换机的一个端口的工作方式类似了。

[root@xiexianbin_cn ~]# ovs-vsctl add-port br-ex eth0
[root@xiexianbin_cn ~]# ovs-vsctl show
56542ec5-7c90-416e-908d-16494db83d62
    Bridge br-ex
        Port "eth0"
            Interface "eth0"
        Port br-ex
            Interface br-ex
                type: internal
    ovs_version: "2.3.1"
[root@xiexianbin_cn ~]# 

这里要特别注意,网卡加入网桥以后,要按照网桥的工作标准工作,那么加入的一个端口就必须是以混杂模式工作,工作在链路层,处理2层的帧,所以这个port就不需要配置IP了。

因此,修改eth0的配置文件/etc/sysconfig/network-scripts/ifcfg-eth0,如下:

[root@xiexianbin_cn ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet
NM_CONTROLLED=no
BOOTPROTO=none
#NETMASK=255.255.248.0
#HWADDR=00:9C:02:96:8F:98
UUID=c092094a-c6e5-449d-9d05-11d9cb43256e
[root@xiexianbin_cn ~]# 

DEVICE=eth0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSPort
OVS_BRIDGE=br-ex
BOOTPROTO=none
HOTPLUG=no

DEVICE=eth0
HWADDR=00:9C:02:96:8F:98
TYPE=Ethernet
UUID=c092094a-c6e5-449d-9d05-11d9cb43256e
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static

首先,这里显示了一个名为br-ex的桥(交换机),这个交换机有两个接口,一个是eth0,一个是br-ex,上面说到,创建桥的时候会创建一个和桥名字一样的接口,并自动作为该桥的一个端口,那么这个虚拟接口的作用,一方面是可以作为交换机的管理端口,另一方面也是基于这个虚拟接口,实现了桥的功能。

那么接下来你可能会问,通常的交换机不都是有一个管理接口,可以telnet到交换机上进行配置吧,那么在OVS中创建的虚拟交换机有木有这种呢,有的!上面既然创建交换机br-ex的时候产生了一个虚拟网口br-ex,那么,你给这个虚拟网卡配置了IP以后,就相当于给交换机的管理接口配置了IP,此时一个正常的虚拟交换机就搞定了。

为br-ex配置IP的方法是添加/etc/sysconfig/network-scripts/ifcfg-br-ex文件,如下:

[root@xiexianbin_cn ~]# cat /etc/sysconfig/network-scripts/ifcfg-br-ex
DEVICE=br-ex
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
IPADDR=10.169.19.117
NETMASK=255.255.248.0
GATEWAY=0.0.0.0
#GATEWAY=10.169.19.1
#DNS1=223.5.5.5
#DNS2=223.6.6.6
#DOMAIN=openstack.xiexianbin.cn
NAME="openstack br-ex"
IPV6INIT=no
IPV6_AUTOCONF=no
[root@xiexianbin_cn ~]# 

前面已经说到,OVS主要是用来在虚拟化环境中。虚拟机之间一个虚拟机和外网之间的通信所用,如下是一个典型的结构图:

ovs-vsctl work struct

  1. VM实例instance产生一个数据包并发送至实例内的虚拟网络接口VNIC,图中就是instance中的eth0。

  2. 这个数据包会传送到物理节点上的VNIC接口,如图就是vnet接口。

  3. 数据包从vnet NIC出来,到达桥(虚拟交换机)br100上。

  4. 数据包经过交换机的处理,从物理节点上的物理接口发出,如图中物理节点上的eth0。

  5. 数据包从eth0出去的时候,是按照物理节点上的路由以及默认网关操作的,这个时候该数据包其实已经不受你的控制了。