深入理解 Open vSwitch(二):体系结构

1、什么是 OVS

OVS(Open vSwitch)是一款生产级别的开源虚拟交换机,为支撑网络虚拟化而生,支持大部分的交换机功能,如数据报文交换、网络隔离、数据报文修改、QoS 等,同时还支持 OpenFlow 协议。

2、OVS 体系结构

OVS 体系结构如下图所示:

image

  • ovs-vswitchd:运行在用户空间的 OVS 守护进程,是 OVS 最核心的组件,主要工作包括通过 OpenFlow 协议与 SDN 控制器通信,以及指导 datapath(负责报文转发的组件)如何处理网络报文。
  • ovsdb-server:运行在用户空间的 OVS 数据库服务器,主要工作包括存储持久化的配置信息,接收配置信息并同步到 ovs-vswitchd,同时从 ovs-vswitchd 中获取状态信息。
  • datapath:OVS 内核模块,负责执行所有的网络报文转发工作。

ovs-vswitchd 通过 OpenFlow 协议与 OpenFlow 控制器通信,并通过 OVSDB 协议与 ovsdb-server 通信。除此之外,ovs-vswitchd 还通过 netlink 与 datapath 通信。

在 OVS 启动后,我们可以通过 ps 指令看到两个 OVS 相关的进程,即 ovs-vswitchd 和 ovsdb-server:

$ ps aux |grep ovs
root      1720  0.0  0.0  19968   360 ?        S<s  Aug26   0:00 ovsdb-server: monitoring pid 1721 (healthy)
root      1721  0.0  0.1  20232  2664 ?        S<   Aug26   0:01 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
root      1747  0.0  0.1  24636  2048 ?        S<s  Aug26   0:00 ovs-vswitchd: monitoring pid 1748 (healthy)
root      1748  0.0  0.4  24800  8272 ?        S<L  Aug26   0:00 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

3、OVS 组件

从上一章节我们得知,OVS 由三个组件组成:ovs-vswitchd、ovsdb-server 和 datapath。

3.1、ovs-vswitchd

ovs-vswitchd 是 OVS 最核心的组件,运行在用户空间。该程序通过 OVSDB 协议从 ovsdb-server 读取所需的配置信息,然后将这些配置信息传给 OVS bridge。同时,ovs-vswitchd 还会将 OVS bridge 的状态数据和统计信息同步给 ovsdb-server。

image

3.2、ovsdb-server

像流表这种临时数据会存储在 datapath 和 ovs-vswitchd 中,而像网桥、端口、拓扑这些持久化的配置信息,则存储在 OVSDB 数据库中。ovsdb-server 负责接收配置信息和读取 OVSDB 数据库。

3.3、datapath

在 OVS 实现中,datapath 指的是负责网络报文转发的组件。在当前版本中(2.13.4),OVS 支持内核模块 datapath 以及 DPDK datapath。以内核 datapath 为例,这一 datapath 在内核中缓存了 OpenFlow 流表(实际上是根据 OpenFlow 流表所生成的流缓存),并在接收到与流表相匹配的报文时执行相应的 action。在大多数情况下,内核 datapath 都会在内核空间匹配并处理报文,这正是 OVS 高性能的原因。

4、OVS 报文处理

在 OVS 实现中,有快速路径(fast path)和慢速路径(slow path)两种概念。其中,内核 datapath 代表了 fast path,ovs-vswitchd 代表了 slow path。OpenFlow 流表存储在 slow path 中,为了提高报文转发性能,OVS 在 fast path 中维护了相应的流缓存,具体的报文处理流程如下图所示:

image

当一个网络连接的第一个报文到达本机网卡之后,首先是 OVS datapath 接收到这个报文。但是,此时 datapath 并不知道应该如何处理这种类型的报文,因为所有的 OpenFlow 流表都存储在 ovs-vswitchd 中。因此,datapath 会把这个报文上送到 ovs-vswitchd。ovs-switchd 在 OpenFlow 流表中查找此类报文相应的规则,并按照规则来生成类似 OpenFlow action、但更简单的规则,然后,ovs-vswitchd 将报文以及这些新生成的规则一同返回给 datapath。datapath 按照规则处理完报文之后,还会将规则缓存在内核中。当 datapath 再次收到此类型的报文时,就会直接使用这些缓存的规则。datapath 将无法匹配流表的报文上送到 ovs-vswitchd 的这一过程,叫做 upcall

5、总结

本文简单介绍了 Open vSwitch 的概念、体系结构、三个主要组件,以及 ovs-vswitchd 组件和 datapath 组件是如何协同处理报文的。

参考资料

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注