资讯详情

【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解

2 OpenvSwitch架构

2.1 OVS整体架构

  • ovs-vswitchd:实现交换功能和保护程序Linux内核兼容模块实现基于流的交换flow-based switching。
  • ovsdb-server:轻量级数据库服务主要保存整个数据库OVS配置信息,包括接口,交换内容,VLAN啊等等。ovs-vswitchd将根据数据库中的配置信息进行工作。
  • ovs-dpctl:配置交换机内核模块的工具可以控制转发规则。
  • ovs-vsctl:主要是获取或更改ovs-vswitchd该工具在操作时会更新配置信息ovsdb-server中数据库。
  • ovs-appctl:主要是向OVS一般不需要在守护过程中发送命令。
  • ovsdbmonitor:GUI工具来显示ovsdb-server中数据信息。
  • ovs-controller:一个简单的OpenFlow控制器.
  • ovs-ofctl:用来控制OVS作为OpenFlow交换机工作时的流表内容。

先看下OVS数据库服务是用户空间的主要组件ovsdb-server和守护进程ovs-vswitchd。kernel中是datapath内核模块。最上面的Controller表示OpenFlow控制器,控制器和OVS是通过OpenFlow协议连接,控制器不一定位于OVS在主机上,下面分别介绍图中的组件。

2.2 OVS组件详述

2.2.1 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配置也会自动更新,以保持与数据库同步。

ovs-vswitchd需要加载datapath只有核模块才能正常运行。自动配置datapathflows,所以我们不用再用了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内核模块信息如下:

2.2.2 ovsdb-server

ovsdb-server是OVS整个数据库服务的轻量级数据库服务OVS配置信息包括接口/交换内容/VLAN等,OVS主进程ovs-vswitchd根据数据库中的信息配置,下面是ovsdb-server进程详细信息。

  • /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是日志记录。

2.2.3 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将提到概念部分。

2.2.4 Controller

Controller指OpenFlow控制器。OpenFlow可通过控制器OpenFlow协议连接到任何支持OpenFlow例如,交换机OVS。控制器通过向交换机发送流表规则来控制数据流。除了可以通过OpenFlow控制器配置OVS中flows,也可以使用OVS提供的ovs-ofctl命令通过OpenFlow协议去连接OVS,从而配置flows,命令也可以正确OVS动态监控运行状态。

2.2.5 Datapath

在 OpenFlow Switch 在规则的语义中,交换机或桥梁被用作专业术语,称为 Datapath。Open vSwitch 的内核模块 openvswitch.ko 实现了多个 Datapath,每个 Datapath 可以有多个 Ports。每个 Datapath 通过关联流表(Flow Table)定义网络包的流向。Datapath 监控网卡接口设备,首先在流表中匹配监控的数据包,找到匹配的流表项后匹配相应的流表项 Actions 返回给 Datapath,描述数据处理行为。Datapath 支持空间支持数据交换。

关于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 ations, for handling similar future packets.

        为了说明datapath,来看一张更详细的架构图,图中的大部分组件上面都有提到:

        用户空间ovs-vswitchd和内核模块datapath决定了数据包的转发,首先,datapath内核模块收到进入数据包(物理网卡或虚拟网卡),然后查找其缓存(datapath flows),当有一个匹配的flow时它执行对应的操作,否则datapath会把该数据包送入用户空间由ovs-vswitchd负责在其OpenFlow flows中查询(图1中的First Packet),ovs-vswitchd查询后把匹配的actions返回给datapath并设置一条datapath flows到datapath中,这样后续进入的同类型的数据包(图1中的Subsequent Packets)因为缓存匹配会被datapath直接处理,不用再次进入用户空间。

        datapath专注于数据交换,它不需要知道OpenFlow的存在。与OpenFlow打交道的是ovs-vswitchd,ovs-vswitchd存储所有Flow规则供datapath查询或缓存。

        虽然有ovs-dpctl管理工具的存在,但我们没必要去手动管理datapath,这是用户空间ovs-vswitchd的工作。

2.3 Open vSwitch 的工作原理

        Bridge 处理数据帧遵循以下几条规则:

  • 在一个 Port 上接收到的帧不会再往此 Port 发送此帧。
  • 接收到的帧都要学习其 Source MAC 地址。
  • 如果数据帧是多播或者广播包(通过 2 层 MAC 地址确定)则要向接收 Port 以外的所有 Port 转发,如果上层协议感兴趣,则还会递交上层处理。
  • 如果数据帧的地址不能在 CAM(MAC-Port Mapping)表中找到,则向接收 Port 以外的所有 Port 转发。
  • 如果 CAM 表中能找到,则转发给相应 Port,如果发送和接收都是同一个 Port,则不发送。
  • 网桥是以混杂模式工作的,所有 MAC 地址的数据帧都能够通过。

        用户空间 ovs-vswitchd 和内核模块 Datapath 决定了数据包的转发,如2.2.5节图示:

  1. 内核态的 Datapath 监听接口设备流入的数据包。
  2. 如果 Datapath 在内核态流表缓存没有找到相应的匹配流表项则将数据包传入(upcall)到用户态的 ovs-vswitchd 守护进程处理。
  3. (可选)用户态的 ovs-vswitchd 拥有完整的流表项,通过 OpenFlow 协议与 OpenFlow 控制器或者 ovs-ofctl 命令行工具进行通信,主要是接收 OpenFlow 控制器南向接口的流表项下发。或者根据流表项设置,ovs-vswitchd 可能会将网络包以 Packet-In 消息发送给 OpenFlow 控制器处理。
  4. ovs-vswitchd 接收到来自 OpenFlow 控制器或 ovs-ofctl 命令行工具的消息后会对内核态的 Flow Table 进行更新。或者根据局部性原理,用户态的 ovs-vswitchd 会将刚刚执行过的 Datapath 没有缓存的流表项注入到 Flow Table 中。
  5. ovs-vswitchd 匹配完流表项之后将数据包重新注入(reinject)到 Datapath。
  6. Datapath 再次访问 Flow Table 获取流表项进行匹配。
  7. 最后,网络包被 Datapath 根据流表项 Actions 转发或丢弃。

        上述,Datapath 和 ovs-vswitchd 相互配合中包含了两种网络包的处理方式:

  • Fast Path:Datapatch 加载到内核后,会在网卡上注册一个钩子函数,每当有网络包到达网卡时,这个函数就会被调用,将网络包开始层层拆包(MAC 层,IP 层,TCP 层等),然后与流表项匹配,如果找到匹配的流表项则根据既定策略来处理网络包(e.g. 修改 MAC,修改 IP,修改 TCP 端口,从哪个网卡发出去等等),再将网络包从网卡发出。这个处理过程全在内核完成,所以非常快,称之为 Fast Path。
  • Slow Path:内核态并没有被分配太多内存,所以内核态能够保存的流表项很少,往往有新的流表项到来后,老的流表项就被丢弃。如果在内核态找不到流表项,则需要到用户态去查询,网络包会通过 netlink(一种内核态与用户态交互的机制)发送给 ovs-vswitchd,ovs-vswitchd 有一个监听线程,当发现有从内核态发过来的网络包,就进入自己的处理流程,然后再次将网络包重新注入到 Datapath。显然,在用户态处理是相对较慢的,故称值为 Slow Path。在用户态的 ovs-vswtichd 不需要吝啬内存,它包含了所有流表项,这些流表项可能是 OpenFlow 控制器通过 OpenFlow 协议下发的,也可能是 OvS 命令行工具 ovs-ofctl 设定的。ovs-vswtichd 会根据网络包的信息层层匹配,直到找到一款流表项进行处理。如果实在找不到,则一般会采用默认流表项,比如丢弃这个包。

        当最终匹配到了一个流表项之后,则会根据 “局部性原理(局部数据在一段时间都会被频繁访问,是缓存设计的基础原理)” 再通过 netlink 协议,将这条策略下发到内核态,当这条策略下发给内核时,如果内核的内存空间不足,则会开始淘汰部分老策略。这样保证下一个相同类型的网络包能够直接从内核匹配到,以此加快执行效率。由于近因效应,接下来的网络包应该大概率能够匹配这条策略的。例如:传输一个文件,同类型的网络包会源源不断的到来。

2.4 ovs-*工具的使用及区别

2.4.1 ovs-vsctl

        ovs-vsctl是一个管理或配置ovs-vswitchd的高级命令行工具,高级是说其操作对用户友好,封装了对数据库的操作细节。它是管理OVS最常用的命令,除了配置flows之外,其它大部分操作比如Bridge/Port/Interface/Controller/Database/Vlan等都可以完成。

 2.4.2 ovsdb-tool

        ovsdb-tool是一个专门管理OVS数据库文件的工具,不常用,它不直接与ovsdb-server进程通信。

 2.4.3 ovsdb-client

        ovsdb-client是ovsdb-server进程的命令行工具,主要是从正在运行的ovsdb-server中查询信息,操作的是数据库相关。

 2.4.4 ovs-ofctl

        ovs-ofctl是专门管理配置OpenFlow交换机的命令行工具,我们可以用它手动配置OVS中的OpenFlow flows,注意其不能操作datapath flows和”hidden” flows。

         ovs-vsctl是一个综合的配置管理工具,ovsdb-client倾向于从数据库中查询某些信息,而ovsdb-tool是维护数据库文件工具。

参考链接

Openvswitch总体架构与代码结构_慕课手记

OpenvSwitch 架构解析与功能实践_qq_0105的博客-CSDN博客

Openvswitch手册(1): 架构,SSL, Manager, Bridge - popsuper1982 - 博客园

Openvswitch手册(2): OpenFlow Controller - popsuper1982 - 博客园

OpenvSwitch完全使用手册_Better_Mee的博客-CSDN博客_openvswitch完全使用手册

云计算底层技术-使用openvswitch | opengers

 《重识云原生系列》专题索引: 

  1. 第一章——不谋全局不足以谋一域
  2. 第二章计算第1节——计算虚拟化技术总述
  3. 第三章云存储第1节——分布式云存储总述
  4. 第四章云网络第一节——云网络技术发展简述
  5. 第四章云网络4.2节——相关基础知识准备
  6. 第四章云网络4.3节——重要网络协议
  7. 第四章云网络4.3.1节——路由技术简述
  8. 第四章云网络4.3.2节——VLAN技术
  9. 第四章云网络4.3.3节——RIP协议
  10. 第四章云网络4.3.4节——OSPF协议
  11. 第四章云网络4.3.5节——EIGRP协议
  12. 第四章云网络4.3.6节——IS-IS协议
  13. 第四章云网络4.3.7节——BGP协议
  14. 第四章云网络4.3.7.2节——BGP协议概述
  15. 第四章云网络4.3.7.3节——BGP协议实现原理
  16. 第四章云网络4.3.7.4节——高级特性
  17. 第四章云网络4.3.7.5节——实操
  18. 第四章云网络4.3.7.6节——MP-BGP协议
  19. 第四章云网络4.3.8节——策略路由
  20. 第四章云网络4.3.9节——Graceful Restart(平滑重启)技术
  21. 第四章云网络4.3.10节——VXLAN技术
  22. 第四章云网络4.3.10.2节——VXLAN Overlay网络方案设计
  23. 第四章云网络4.3.10.3节——VXLAN隧道机制
  24. 第四章云网络4.3.10.4节——VXLAN报文转发过程
  25. 第四章云网络4.3.10.5节——VXlan组网架构
  26. 第四章云网络4.3.10.6节——VXLAN应用部署方案
  27. 第四章云网络4.4节——Spine-Leaf网络架构
  28. 第四章云网络4.5节——大二层网络
  29. 第四章云网络4.6节——Underlay 和 Overlay概念
  30. 第四章云网络4.7.1节——网络虚拟化与卸载加速技术的演进简述
  31. 第四章云网络4.7.2节——virtio网络半虚拟化简介
  32. 第四章云网络4.7.3节——Vhost-net方案
  33. 第四章云网络4.7.4节vhost-user方案——virtio的DPDK卸载方案
  34. 第四章云网络4.7.5节vDPA方案——virtio的半硬件虚拟化实现
  35. 第四章云网络4.7.6节——virtio-blk存储虚拟化方案
  36. 第四章云网络4.7.8节——SR-IOV方案
  37. 第四章云网络4.7.9节——NFV
  38. 第四章云网络4.8.1节——SDN总述
  39. 第四章云网络4.8.2.1节——OpenFlow概述
  40. 第四章云网络4.8.2.2节——OpenFlow协议详解
  41. 第四章云网络4.8.2.3节——OpenFlow运行机制
  42. 第四章云网络4.8.3.1节——Open vSwitch简介
  43. 第四章云网络4.8.3.2节——Open vSwitch工作原理详解
  44. 第四章云网络4.8.4节——OpenStack与SDN的集成
  45. 第四章云网络4.8.5节——OpenDayLight
  46. 第四章云网络4.8.6节——Dragonflow

标签: 二极管模块mee75

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台