OVS 架构、源码结构及数据流程

OVS 架构

OVS 是产品级的虚拟交换机,大量应用在生产环境中,支撑整个数据中心虚拟网络的运转。OVS 基于 SDN 的思想,将整个核心架构分为控制面和数据面,数据面负责数据的交换工作,控制面实现交换策略,指导数据面工作。OVS 架构、源码结构及数据流程_第1张图片

从整体上看,OVS 可以划分为三大块,管理面、数据面和控制面。数据面就是以用户态的 ovs-vswitchd 和内核态的 datapath 为主的转发模块,以及与之相关联的数据库模块 ovsdb-server,控制面主要是由 ovs-ofctl 模块负责,基于 OpenFlow 协议与数据面进行交互。而管理面则是由 OVS 提供的各种工具来负责,这些工具的提供也是为了方便用户对底层各个模块的控制管理,提高用户体验。下面就对这些工具进行一个逐一的阐述。

ovs-ofctl:这个是控制面的模块,但本质上它也是一个管理工具,主要是基于 OpenFlow 协议对 OpenFlow 交换机进行监控和管理,通过它可以显示一个 OpenFlow 交换机的当前状态,包括功能、配置和表中的项。使用时,有很多参数,我们可以通过 ovs-ofctl --help 查看。

OVS 架构、源码结构及数据流程_第2张图片

ovs-dpctl:用来配置交换机的内核模块 datapath,它可以创建,修改和删除 datapath,一般,单个机器上的 datapath 有 256 条(0-255)。一条 datapath 对应一个虚拟网络设备。该工具还可以统计每条 datapath 上的设备通过的流量,打印流的信息等,更过参数通过 ovs-dpctl --help 查看。

OVS 架构、源码结构及数据流程_第3张图片 

ovs-appctl:查询和控制运行中的 OVS 守护进程,包括 ovs-switchd,datapath,OpenFlow 控制器等,兼具 ovs-ofctl、ovs-dpctl 的功能,是一个非常强大的命令。ovs-vswitchd 等进程启动之后就以一个守护进程的形式运行,为了能够很好的让用户控制这些进程,就有了这个命令。详细可以 ovs-appctl --help 查看。ovs-vsctl:查询和更新 ovs-vswitchd 的配置,这也是一个很强大的命令,网桥、端口、协议等相关的命令都由它来完成。此外,还负责和 ovsdb-server 相关的数据库操作。 

 

OVS 源码结构

OVS 源码结构中,主要包含以下几个主要的模块,数据交换逻辑在 vswitchd 和 datapath 中实现,vswitchd 是最核心的模块,OpenFlow 的相关逻辑都在 vswitchd 中实现,datapath 则不是必须的模块。ovsdb 用于存储 vswitch 本身的配置信息,如端口、拓扑、规则等。控制面部分采用的是 OVS 自家实现的 OVN,和其他控制器相比,OVN 对 OVS 和 OpenStack 有更好的兼容性和性能。OVS 架构、源码结构及数据流程_第4张图片

从图中可以看出 OVS 的分层结构,最上层 vswitchd 主要与 ovsdb 通信,做配置下发和更新等,中间层是 ofproto ,用于和 OpenFlow 控制器通信,并基于下层的 ofproto provider 提供的接口,完成具体的设备操作和流表操作等工作。

dpif 层实现对流表的操作。

netdev 层实现了对网络设备(如 Ethernet)的抽象,基于 netdev provider 接口实现多种不同平台的设备,如 Linux 内核的 system, tap, internal 等,dpdk 系的 vhost, vhost-user 等,以及隧道相关的 gre, vxlan 等。

数据转发流程

通过一个例子来看看 OVS 中数据包是如何进行转发的。OVS 架构、源码结构及数据流程_第5张图片

1)ovs 的 datapath 接收到从 ovs 连接的某个网络端口发来的数据包,从数据包中提取源/目的 IP、源/目的 MAC、端口等信息。 

2)ovs 在内核态查看流表结构(通过 hash),如果命中,则快速转发。 

3)如果没有命中,内核态不知道如何处置这个数据包,所以,通过 netlink upcall 机制从内核态通知用户态,发送给 ovs-vswitchd 组件处理。 

4)ovs-vswitchd 查询用户态精确流表和模糊流表,如果还不命中,在 SDN 控制器接入的情况下,经过 OpenFlow 协议,通告给控制器,由控制器处理。 

5)如果模糊命中, ovs-vswitchd 会同时刷新用户态精确流表和内核态精确流表,如果精确命中,则只更新内核态流表。 

6)刷新后,重新把该数据包注入给内核态 datapath 模块处理。 

7)datapath 重新发起选路,查询内核流表,匹配;报文转发,结束。

端口类型

Normal port:用户可以把操作系统中的网卡绑定到Open vSwitch上,Open vSwitch会生成一个普通端口处理这块网卡进出的数据包。

Internal Port: 当设置端口类型为internal,Open vSwitch会创建一块虚拟网卡,此端口收到的所有数据包都会交给这块网卡,网卡发出的包会通过这个端口交给Open vSwitch。当Open vSwitch创建一个新网桥时,默认会创建一个与网桥同名的Internal Port,同时也创建一个与Port同名的Interface。三位一体,所以操作系统里就多了一块网卡,但是状态是down的。

Patch Port: 当机器中有多个Open vSwitch网桥时,可以使用Patch Port把两个网桥连起来。Patch Port总是成对出现,分别连接在两个网桥上,在两个网桥之间交换数据。

Tunnel Port: 隧道端口是一种虚拟端口,支持使用gre或vxlan等隧道技术与位于网络上其他位置的远程端口通讯。

OVS+DPDK

DPDK平台提供的接口库,可以将底层环境资源做抽象,即在系统中新增了环境抽象层(EAL),将网卡驱动在用户态实现,系统只需在网卡初始化时设置网卡驱动接口即可将网卡收到的报文直接交给用户空间进程进行处理,网卡发送报文时也通过调用用户态定义的发送报文接口将报文直接发送到对应网卡。在OVS的vswitchd进程中新起一个数据收发接管线程(TO-Thread)用于接管系统的OVS中由datapath执行的数据包接收和发送的功能。数据包的流表匹配则直接进行用户态流表匹配。

OVS+DPDK接收报文处理机制:当报文到达网卡,EAL层根据网卡初始化和驱动层初始化中绑定的用户态网卡驱动,将报文发送到用户空间交给TO-Thread线程进行接管,在该线程中将进行报文的解析、与内核协议栈通信和获取报文key值的操作,然后在vswitchd进程中凭借报文key值完成用户态流表匹配。用户态流表匹配的操作与传统的OVS一样,但若命中流表项本系统将直接交由TO-Thread线程进行action处理,最终将报文通过该接管线程转发出去或丢弃。接收报文的过程中不经过OVS中内核态的datapath进程的处理和内核态流表的匹配。

OVS+DPDK发送报文处理机制:发送报文时,先经过协议栈的封装处理,将封装好的报文匹配用户态流表,获取action操作。若为隧道转发则还需进行隧道头封装,将报文发往对应的VTEP端口。在隧道转发过程中可能涉及OVS中内部端口多次转发,并在相应端口做报文处理,报文最终要发出的端口通过流表匹配获得。TO-Thread线程将报文直接发往OVS出端口绑定的网卡,由网卡发送到网络中。

OpenFlow技术

OpenFlow的核心思想是将传统网络设备的转发动作进行分解,原来一步完成的动作现由OpenFlow虚拟交换机和控制器协作完成,从而将网络设备转发过程中的数据平面和控制平面分离以实现网络处理层次的扁平化。在这种分离架构中,研究人员可以通过高层的控制平面灵活、高效地定制个性化的转发策略或测试新的网络协议等,从而在现有网络结构的基础上实现和部署新型网络架构。

在OpenFlow虚拟网络中,通常包括两类最重要的组件:OpenFlow虚拟交换机和控制器。虚拟交换机通过其维护的流表(Flow Table)决定数据包如何转发,流表定义了许多包括一系列匹配字段(如数据包入口、IP地址、协议类型、链路层地址、端口号等)、计数器机动作(如转发、丢弃、修改包头域等)的流表项(Flow entry),在转发时虚拟交换机将抽取数据包信息并与流表项中的字段进行匹配,一旦匹配成功就执行相应的动作。虚拟交换机只负责根据流表指示转发数据却不关心流表如何制定,实际上流表由控制器制定并下发给虚拟交换机,并且控制器可以随时经网络以OpenFlow定义的形式维护虚拟交换机中的流表,OpenFlow就是通过这种方式实现数据平面与控制平面分离的。

流表结构

流表在OVS中充当传统物理交换机的MAC表和路由表的角色,数据包在交换机内部端口间的转发规则由流表中的流表项决定。OVS中的流表由多个流表项组成,匹配域是流表匹配的关键字段,主要包括入端口号和报文各层头字段信息。匹配域和优先级唯一指定一条流表项,由于匹配字段包含了链路层、网络层和传输层的大部分标识,会存在一个数据包可与多个流表项中的匹配字段相匹配,优先级则在存在冲突时用于标识流表项的执行顺序。计数器用于统计数据量的相关信息,例如匹配成功的报文数和丢弃的报文数等。指令集表示当数据包匹配到该流表项时,需要执行的动作。超时时间用于设定流表项的超时时间,当流表项到达超时时间将被系统删除。

总结

OVS分为用户层和内核层,用户层包括一些模块,以daemon程序存在,实现了以下功能:交换机和流表的实现,交换机管理组件,数据库,和内核层之间的交互。当OVS服务启动时会运行以下三个daemon:ovs-vswitchd,是交换机的核心实现模块;ovsdb-server,管理虚拟交换机和流表的配置的数据库系统;ovs-brcompatd,keeps the compatibility with the traditional bridges。

其中最重要的是ovs-vswitchd,他直接通过netlink协议和内核进行交互。Ovs-vstl是一个配置交换机的小工具,显然,需要先和ovs-vswitchd进行交互。ovs-vswitchd将交换机的配置和变更信息保存到数据库中,该数据库由vsdb-server直接管理,因此,ovs-vswitchd对数据库的信息增减也得先和vsdb-server进行交互,via Unix domain socket, in order to retrieve or save the configuration information,这也是为什么OVS的配置能够开机保留。

Ovs-vsctl可以完成大部分的openvswitch的管理,ovs-appctl也可以通过发送一些内部命令给ovs-vswitchd完成一些简单操作。但有时候需要直接管理内核的datapath,这种情况下你可以使用ovs-dpctl去使ovs-vswitchd直接管理内核层的datapath,而不需要database。

当需要和ovsdb-server通信做一些数据库操作时,可以使用ovsdb-client,如果想不通过ovsdb-server直接管理数据库可以通过ovsdb-tool工具。
OVS可以通过openflow协议进行远程管理,实现软件定义网络,sFlow是一个数据包监控和分析协议,两者都可以通过ovs-ofctl进行配置管理。

OVS 为了方便用户操作,提供了很多管理工具,我们平常在使用过程中只需记住每个工具的作用,具体的命令可以使用 -h 或 --help 查看。

 原文链接:https://mp.weixin.qq.com/s/wS24Ul8N-hph3UXyLEqJFw

你可能感兴趣的:(服务器,运维,开发语言,linux,数据库)