按照官方的说法:Open vSwitch是一款高质量的多层虚拟交换机,以开源Apache 2许可证授权,非常适合在虚拟机环境中充当2层交换机。支持多种基于Linux的虚拟化技术,包括Xen / XenServer、KVM和VirtualBox。
支持Open Flow协议,所以可以很方便的通过编程实现大规模网络的自动化,被大量运用于SDN网络中。
因为在OpenStack提供的网络服务中也用到了ovs相关的技术,所以想对ovs有一些更加深入的了解,以下和大家分享。
目前了解来看,Open vSwitch有三个比较核心的东西:
为了方便配置和管理,所以有了下面这些工具:
上图是我对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
。
在内核空间中,open vSwitch则提供了一个内核模块:openvswitch.ko来支持数据流的交换。
从图上也可以看出:内核空间和用户空间的交互是通过Netlink协议实现的
每一个ovs网桥或者说ovs交换机,都有一个内核空间的datapath与之相对应,可以说这个datapath就是网桥或交换机的实体,数据流都是受它控制。而它则是根据flow table这张表进行数据都转发。每一个datapath在内核中都有一个flow table,当数据包匹配到表中的某一项时,就会执行该项指定的action,转发数据包。
当datapath接收到数据包后,能直接查询到内核空间对应的flow table,并将该数据包转发。
而如果内核中的flow table中找不到匹配的项时,内核空间就会与用户空间进行交互,通过ovs-vswitchd查询数据库判断数据包应该发送到哪个端口上,并将该行为缓存到内核中的flow table中,下一次就不再需要通过用户空间查询了。
上述两种通路工作详情可以参考下图。