OpenVswitch架构概览
Open vSwitch的架构和模块与传统的物理交换机是一一对应的,包括控制面和数据平台,只是传统的物理交换机通常使用NP芯片来进行转发,而Openvswitch使用Linux内核模块做数据平面。OpenVswitch包括三个核心模块:ovs-vswitchd,ovsdb-server以及内核模块openvswitch datapath。每个模块有不同的功能
ovs-vswitchd功能模块介绍
ovs-vswitchd是一个守护进程,在用户启动该组件不久其就会脱离控制终端,作为OVS的管理和控制进程对外提供服务,一方面它通过unix Socket和OVSDB通信,加载OVSDB内的配置信息,也能把设备信息更新到服务器中,这部分属于设备的配置管理能力。另一方面其内置了多个协议的支持,包括MAC Learning, LLDP, STP等,同时其支持和拉远的控制器建立Openflow连接,通过Openflow协议下发控制流表给内核模块。内核模块和OVS-Vswitchd通过Netlink进行通信,Netlink相较于其他的IPC通信方式,其支持双工,而且是异步通信,支持组播,另外可以自定义协议族。总而言之,Netlink是一个高效的内核态和用户态通信方式,同时其可扩展性也很好。
Ovsdb-server功能模块介绍
ovsdb-server是一个轻量级的数据库服务,主要保存了整个OVS的配置信息,包括接口,交换内容,VLAN等等。其数据库结构如图所示:
从OVSDB的数据库结构可以看出网桥是支持SFlow,QoS, Mirror等可视化和调优功能,OVSDB对外提供Json RPC接口,提供CURD接口供客户端对数据库进行操作。
openvswitch datapath
openvswitchd.ko是内核中负责vswitch的快转面,根据openflow流表转发,并接收ovs-vswitchd的配置,内核模块在初始化以及做Port binding时,会注册钩子函数,把端口的报文处理接管到内核模块。当Datapath出现table miss情况时会把报文送入队列供用户控件的vswitchd模块读取,在用户空间有slow path的exact table的精确匹配与wildcard table的模糊匹配。而当Datapath配置了sflow时,也会将报文上送到控制面进行处理。
OpenVswitch 模块概述
| +-------------------+
| | ovs-vswitchd |<-->ovsdb-server
| +-------------------+
| | ofproto |<-->OpenFlow controllers
| +--------+-+--------+ _
| | netdev | |ofproto-| |
userspace | +--------+ | dpif | |
| | netdev | +--------+ |
| |provider| | dpif | |
| +---||---+ +--------+ |
| || | dpif | | implementation of
| || |provider| | ofproto provider
|_ || +---||---+ |
|| || |
_ +---||-----+---||---+ |
| | |datapath| |
kernel | | +--------+ _|
| | |
|_ +--------||---------+
||
physical
NIC
从上图可以看出vswitchd本身是分层的结构,最上面的daemon层主要用于和ovsdb通信,做配置的下发和更新等,中间是ofproto层,ofproto是交换机的控制平面实现,通过该模块可以和外界的SDN控制器建立Openflow通道,而在ofproto下层有两个插件,分别是ofproto provider和netdev,ofproto provider对接datapath,负责流表以及datapath的配置下发,以及报文上送等。在ovs的定义里,netdev代表了具体平台的设备实现,e.g. linux内核的net_device或者移植到交换机平台下的port等,struct netdev_class定义了netdev-provider的具体实现需要的接口,具体的平台实现需要支持这些统一的接口,从而完成netdev设备的创建,销毁,打开,关闭等一系列操作。