1、介绍
在过去,数据中心的服务器是直接连在硬件交换机上。后来 VMware 实现了服务器虚拟化技术,使虚拟服务器(VMs)能够连接在虚拟交换机上,借助这个虚拟交换机,可以为服务器上运行的 VMs 或容器提供逻辑的虚拟的以太网接口,这些逻辑接口都连接到虚拟交换机上,有三种比较流行的虚拟交换机:
Open vSwitch(OVS)是运行在虚拟化平台上的虚拟交换机, 其支持 OpenFlow 协议,也支持gre / vxlan / IPsec 等隧道技术。 在 OVS 之前,基于 Linux 的虚拟化平台比如 KVM 或 Xen 上,缺少一个功能丰富的虚拟交换机,因此 OVS 迅速崛起并开始在 Xen / KVM 中流行起来,并且应用于越来越多的开源项目, 比如 openstack neutron 中的网络解决方案。
在虚拟交换机的 Flow 控制器或管理工具方面,一些商业产品都集成有控制器或管理工具,比如
而 OVS 则需要借助第三方控制器或管理工具实现复杂的转发策略。 例如 OVS 支持 OpenFlow 协议,我们就可以使用任何支持 OpenFlow 协议的控制器来对 OVS 进行远程管理。 OpenStack Neutron 中的 ML2 插件也能够实现对 OVS 的管理。 但这并不意味着 OVS 必须要有一个控制器才能工作。在不连接外部控制器情况下,OVS 自身可以依靠 MAC 地址学习实现二层数据包转发功能,就像 Linux Bridge。
在基于 Linux 内核的系统上,应用最广泛的还是系统自带的虚拟交换机 Linux Bridge,它是一个单纯的基于 MAC 地址学习的二层交换机,简单高效,但同时缺乏一些高级特性,比如 OpenFlow、VLAN tag、QOS、ACL、Flow 等,而且在隧道协议支持上,Linux Bridge 只支持 vxlan,OVS 支持 gre / vxlan / IPsec 等,这也决定了 OVS 更适用于实现 SDN 技术。
2、OVS 支持以下 features
二、OVS 架构
1、OVS 整体架构
用户空间主要组件如下:
最上面的 Controller 表示 OpenFlow 控制器,控制器与OVS是通过OpenFlow协议进行连接,控制器不一定位于 OVS 主机上。
2、ovs-vswitchd
ovs-vswitchd 守护进程是 OVS 的核心部件,它和 datapath 内核模块一起实现 OVS 基于流的数据交换。 作为核心组件,
使用 openflow 协议与上层 OpenFlow 控制器通信
使用 OVSDB 协议与 ovsdb-server 通信
使用 netlink 和 datapath 内核模块通信
ovs-vswitchd 在启动时会读取 ovsdb-server 中配置信息,然后配置内核中的 datapaths 和所有OVS switches,当 ovsdb 中的配置信息改变时(例如使用 ovs-vsctl 工具),ovs-vswitchd 也会自动更新其配置以保持与数据库同步。
# ps -ef |grep ovs-vs root 22176 22175 0 Jan17 ? 00:16:56 ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
ovs-vswitchd 需要加载 datapath 内核模块才能正常运行。它会自动配置 datapath flows,因此我们不必再使用 ovs-dpctl 去手动操作 datapath,但 ovs-dpctl 仍可用于调试场合。
在 OVS 中,ovs-vswitchd 从 OpenFlow 控制器获取流表规则,然后把从 datapath 中收到的数据包在流表中进行匹配,找到匹配的 flows 并把所需应用的 actions 返回给datapath, 同时作为处理的一部分,ovs-vswitchd 会在 datapath 中设置一条 datapath flows 用于后续相同类型的数据包可以直接在内核中执行动作,此 datapath flows 相当于 OpenFlow flows 的缓存。 对于 datapath 来说,其并不知道用户空间 OpenFlow 的存在。datapath 内核模块信息如下
# modinfo openvswitch
filename: /lib/modules/3.10.0-327.el7.x86_64/kernel/net/openvswitch/openvswitch.ko
license: GPL
description: Open vSwitch switching datapath
rhelversion: 7.2
srcversion: F75F2B83324DCC665887FD5
depends: libcrc32c
intree: Y
...
3、ovsdb-server
ovsdb-server 是 OVS 轻量级的数据库服务,用于整个 OVS 的配置信息,包括接口 / 交换内容 / VLAN 等,OVS 主进程 ovs-vswitchd 根据数据库中的配置信息工作,下面是 ovsdb-server 进程详细信息。
ps -ef |grep ovsdb-server root 22166 22165 0 Jan17 ? 00:02:32 ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/var/run/openvswitch/db.sock --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir --log-file=/var/log/openvswitch/ovsdb-server.log --pidfile=/var/run/openvswitch/ovsdb-server.pid --detach --monitor
/etc/openvswitch/conf.db 是数据库文件存放位置,文件形式存储保证了服务器重启不会影响其配置信息,ovsdb-server 需要文件才能启动,可以使用 ovsdb-tool create 命令创建并初始化此数据库文件 --remote=punix:/var/run/openvswitch/db.sock 实现了一个 Unix sockets 连接,OVS 主进程ovs-vswitchd 或其它命令工具(ovsdb-client)通过此 socket 连接管理 ovsdb。
/var/log/openvswitch/ovsdb-server.log 是日志记录。
4、OpenFlow
OpenFlow 是开源的用于管理交换机流表的协议。OpenFlow 在 OVS 中的地位可以参考上面架构图,它是 Controller 和 ovs-vswitched 间的通信协议。 需要注意的是,OpenFlow 是一个独立的完整的流表协议,不依赖于 OVS,OVS 只是支持 OpenFlow 协议, 有了支持,我们可以使用OpenFlow 控制器来管理 OVS 中的流表,OpenFlow 不仅仅支持虚拟交换机,某些硬件交换机也支持 OpenFlow 协议。
OVS 常用作 SDN 交换机(OpenFlow交换机),其中控制数据转发策略的就是 OpenFlow flow。OpenStack Neutron 中实现了一个 OpenFlow 控制器用于向 OVS 下发 OpenFlow flows 控制虚拟机间的访问或隔离。 本文讨论的默认是作为 SDN 交换机场景下。
OpenFlow flow 的流表项存放于用户空间主进程 ovs-vswitchd 中,OVS 除了连接 OpenFlow 控制器获取这种 flow, 文章后面会提到的命令行工具 ovs-ofctl 工具也可以手动管理 OVS 中的OpenFlow flow,可以查看 man ovs-ofctl 了解。
在 OVS 中,OpenFlow flow 是最重要的一种 flow,然而还有其它几种 flows 存在,文章下面 OVS概念部分会提到。
5、Controller
Controller 指 OpenFlow 控制器。 OpenFlow 控制器可以通过 OpenFlow 协议连接到任何支持OpenFlow 的交换机,比如 OVS。 控制器通过向交换机下发流表规则来控制数据流向。 除了可以通过 OpenFlow 控制器配置 OVS 中 flows,也可以使用 OVS 提供的 ovs-ofctl 命令通过 OpenFlow协议去连接 OVS,从而配置 flows,命令也能够对 OVS 的运行状况进行动态监控。
6、Kernel Datapath
下面讨论场景是 OVS 作为一个 OpenFlow 交换机。
datapath 是一个 Linux 内核模块,它负责执行数据交换。关于 datapath,The Design and Implementation of Open vSwitch 中有描述:
The datapath module in the kernel receives the packets first, from a physical NIC or a VM’s virtual NIC. Either ovs-vswitchd has instructed the datapath how to handle packets of this type, or it has not. In the former case, the datapath module simply follows the instructions, called actions, given by ovs-vswitchd, which list physical ports or tunnels on which to transmit the packet. Actions may also specify packet modifications, packet sampling, or instructions to drop the packet. In the other case, where the datapath has not been told what to do with the packet, it delivers it to ovs-vswitchd. In userspace, ovs-vswitchd determines how the packet should be handled, then it passes the packet back to the datapath with the desired handling. Usually, ovs-vswitchd also tells the datapath to cache the actions, for handling similar future packets.
为了说明 datapath,来看一张更详细的架构图,图中的大部分组件上面都有提到
用户空间 ovs-vswitchd 和 内核模块 datapath 决定了数据包的转发。
首先,datapath 内核模块收到进入数据包(物理网卡或虚拟网卡), 然后查找其缓存(datapath flows), 当有一个匹配的 flow 时它执行对应的操作, 否则 datapath 会把该数据包送入用户空间由 ovs-vswitchd 负责在其 OpenFlow flows 中查询(上图中的 First Packet),ovs-vswitchd 查询后把匹配的 actions 返回给 datapath 并设置一条 datapath flows 到 datapath 中, 这样后续进入的同类型的数据包(上图中的 Subsequent Packets)因为缓存匹配会被datapath 直接处理,不用再次进入用户空间。
datapath 专注于数据交换,它不需要知道 OpenFlow 的存在。与 OpenFlow 打交道的是 ovs-vswitchd,ovs-vswitchd 存储所有 Flow 规则供 datapath 查询或缓存。
虽然有 ovs-dpctl 管理工具的存在,但我们没必要去手动管理 datapath,这是用户空间 ovs-vswitchd 的工作。
转载(原博客内容更完善):SDN实验---OVS了解(转载) - 山上有风景 - 博客园
(SAW:Game Over!)