Open vSwitch框架解析

声明:

本博客欢迎转载,但请保留原作者信息!

作者:华为云计算工程师 林凯

团队:华为杭州研发中心OpenStack社区团队


本文是在个人学习过程中整理和总结,由于时间和个人能力有限,错误之处在所难免,欢迎指正!

 

OpenvSwitch是什么?

        Open vSwitch(以下简称为OVS),英文全称:OpenVirtual Switch,顾名思义,Open vSwitch就是开放虚拟交换。我们可以把他理解成一种标准,它旨在通过编程扩展,使庞大的网络自动化(配置、管理、维护),同时还支持标准的管理接口和协议。

        也可以把OVS理解成开源虚拟交换机,可以运行在各类虚拟化平台(如KVM,Xen)上的虚拟机交换机。在虚拟化平台上,OVS 可以为动态变化的端点提供 2 层交换功能,很好的控制虚拟网络中的访问策略、网络隔离、流量监控等等。

 

OVS有哪些东西?

        在 OVS 中, 有几个非常重要的概念:

        Bridge: Bridge 代表一个以太网交换机(Switch),一个主机中可以创建一个或者多个 Bridge 设备。

        Port: 端口与物理交换机的端口概念类似,每个 Port 都隶属于一个 Bridge。

        Interface: 连接到 Port 的网络接口设备。在通常情况下,Port 和 Interface 是一对一的关系, 只有在配置 Port 为 bond 模式后,   Port 和 Interface 是一对多的关系。

        Controller:OpenFlow 控制器。OVS 可以同时接受一个或者多个 OpenFlow 控制器的管理。

        datapath: 在 OVS 中,datapath 负责执行数据交换,也就是把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。

        Flow table: 每个 datapath 都和一个“flowtable”关联,当 datapath 接收到数据之后, OVS 会在 flow table 中查找可以匹配的 flow,执行对应的操作, 例如转发数据到另外的端口。

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

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

        

OVS的整体框架

        OVS提供了两种数据转发通路: 一种是完全工作在用户态的慢速通道;另一种则是利用了专门的Linux内核模块的快速通道。

Open vSwitch框架解析_第1张图片        

图1 Open vSwitch模块结构图

         上图是OpenvSwitch的模块结构图,主要分为三个部分,分别是外部控制器(Off-box)、用户态部分(User)和内核态部分(Kernel)。

         外部控制器:OpenvSwitch的用户可以从外部连接OpenFlow控制器对虚拟交换机进行配置管理,可以指定流规则,修改内核态的流表信息等。

         用户态:主要包括ovs-vswitchd和ovsdb-server两个进程。ovs-vswitchd是执行OVS的一个守护进程,它实现了OpenFlow交换机的核心功能,并且通过netlink协议直接和OVS的内核模块进行通信。交换机运行过程中,ovs-vswitchd还会将交换机的配置、数据流信息及其变化保存到数据库ovsdb中,因为这个数据库由ovsdb-server直接管理,所以ovs-vswitchd需要和ovsdb-server通过Unix的soket机制进行通信以获得或者保存配置信息。数据库ovsdb的存在使得OVS交换机的配置能够被持久化存储,即使设备被重启后相关的OVS配置仍旧能够存在。

         内核态:openvswitch_mod.ko是内核态的主要模块,完成数据包的查找、转发、修改等操作,一个数据流的后续数据包到达OVS后将直接交由内核态,使用openvswitch_mod.ko中的处理函数对数据包进行处理。

 

OVS是怎么处理数据流量?

 

OVS交换机负责数据流发送的相关流程:

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

(2)      OVS在内核状态下查看流表结构(通过Hash),观察是否有缓存的信息可用于转发这个数据包。

(3)      假设数据包是这个网络设备发来的第一个数据包,在OVS内核中,将不会有相应的流表缓存信息存在,那么内核将不会知道如何处置这个数据包。所以内核将发送upcall给用户态。

(4)      位于用户态的ovs-vswitchd进程接收到upcall后,将检查数据库以查询数据包的目的端口是哪里,然后告诉内核应该将数据包转发到哪个端口,例如eth0。

(5)      内核执行用户此前设置的动作。即内核将数据包转发给端口eth0,进而数据被发送出去。

 

        OVS交换机负责数据流接收的流程与上述流程类似,OVS为每个与外部相连的网络注册一个句柄,一旦这些设备在线上接收到了数据包,OVS将它转发到用户空间,并检查它应该发往何处以及应该对其采取什么动作。例如:如果是一个VLAN数据包,那么首先需要去掉VLAN tag,然后转发到对应的端口。

 

        至此,OVS的框架初步解析就完成了。


你可能感兴趣的:(云计算,OpenStack技术专刊)