Open vSwitch初探 - 架构篇

发表于 2018-03-20   |   分类于 技术

What is Open vSwitch?

按照官方的说法:Open vSwitch是一款高质量的多层虚拟交换机,以开源Apache 2许可证授权,非常适合在虚拟机环境中充当2层交换机。支持多种基于Linux的虚拟化技术,包括Xen / XenServer、KVM和VirtualBox。
支持Open Flow协议,所以可以很方便的通过编程实现大规模网络的自动化,被大量运用于SDN网络中。

因为在OpenStack提供的网络服务中也用到了ovs相关的技术,所以想对ovs有一些更加深入的了解,以下和大家分享。

Open vSwitch架构

构成组件

目前了解来看,Open vSwitch有三个比较核心的东西:

  1. ovs-vswitchd:一个实现交换机的守护进程。
  2. ovsdb-server:一个轻量级的数据库服务器,用于ovs-vswitchd查询以获取其配置。
  3. openvswitch.ko:一个配套的基于流来实现交换的Linux内核模块。

为了方便配置和管理,所以有了下面这些工具:

  1. ovs-dpctl:用来配置交换机内核模块
  2. ovs-vsctl:用于查询和更新ovs-vswitchd的配置信息,操作对象为ovsdb-server。更新配置时,命令会等待配置在ovs-vswitchd生效后才返回。
  3. ovs-appctl:向ovs-vswitchd发送命令。
  4. ovs-ofctl: 用来配置交换机的flow相关。

组件关系

ovs framework.png

用户空间(ovs-vswitchd)

上图是我对ovs整体框架的一个总结。通过图片可以看到,用户空间运行了两个进程:ovs-vswitchd和ovsdb-server。ovsdb-server将ovs-vswitchd的配置持久化到db中,ovs-vswitchd是一个守护进程,它会向ovsdb-server读取相关配置信息,并且如果有配置需要更新也会将其同步到ovsdb-server中。它们之间的通信是通过unix domain socket进行的。ovsdb通常是一个文件保存在linux的存储系统里面,一般它的路径是/etc/openvswitch/conf.db

内核空间(openvswitch.ko)

在内核空间中,open vSwitch则提供了一个内核模块:openvswitch.ko来支持数据流的交换。
从图上也可以看出:内核空间和用户空间的交互是通过Netlink协议实现的

每一个ovs网桥或者说ovs交换机,都有一个内核空间的datapath与之相对应,可以说这个datapath就是网桥或交换机的实体,数据流都是受它控制。而它则是根据flow table这张表进行数据都转发。每一个datapath在内核中都有一个flow table,当数据包匹配到表中的某一项时,就会执行该项指定的action,转发数据包。

两种转发通路

快速通路

当datapath接收到数据包后,能直接查询到内核空间对应的flow table,并将该数据包转发。

慢速通路

而如果内核中的flow table中找不到匹配的项时,内核空间就会与用户空间进行交互,通过ovs-vswitchd查询数据库判断数据包应该发送到哪个端口上,并将该行为缓存到内核中的flow table中,下一次就不再需要通过用户空间查询了。

上述两种通路工作详情可以参考下图。
ovs_fast_slow.png

发表新评论

© 2017 Powered by Typecho
苏ICP备15035969号-3