热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin


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内核模块才能正常运行。它会自动配置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内核模块信息如下:


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 actions, 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

本文由mdnice多平台发布



推荐阅读
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • Hadoop发行版本选择指南:技术解析与应用实践
    本文详细介绍了Hadoop的不同发行版本及其特点,帮助读者根据实际需求选择最合适的Hadoop版本。内容涵盖Apache Hadoop、Cloudera CDH等主流版本的特性及应用场景。 ... [详细]
  • 本文详细介绍了在腾讯云服务器上配置 phpMyAdmin 的方法,包括安装、配置和解决常见问题。通过这些步骤,您可以轻松地在腾讯云环境中部署并使用 phpMyAdmin。 ... [详细]
  • MySQL InnoDB Double Write机制详解
    本文深入探讨了MySQL InnoDB存储引擎的Double Write技术,该技术通过在内存和磁盘上创建数据页的副本,确保了部分写失效(Partial Page Write)情况下的数据完整性和可靠性。同时,文章介绍了InnoDB以页为单位进行读取和更新的机制,并详细解析了Double Write的工作原理。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 福克斯新闻数据库配置失误导致1300万条敏感记录泄露
    由于数据库配置错误,福克斯新闻暴露了一个58GB的未受保护数据库,其中包含约1300万条网络内容管理记录。任何互联网用户都可以访问这些数据,引发了严重的安全风险。 ... [详细]
  • 网络出版服务许可证申请指南
    本文详细介绍了网络出版服务许可证的办理条件、适用企业范围及具体流程,帮助相关企业和个人了解并顺利完成许可证的申请。文章由专业机构提供,旨在为读者解答在互联网出版领域遇到的技术和合规问题。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 使用Nginx反向代理实现多域名端口映射
    本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 当 WebLogic 连接的数据源数据库密码发生更改时,需要在域目录的 config 文件夹下的 jdbc 配置文件中更新相应的密码。本文将详细介绍如何安全地修改和验证这些配置文件中的加密密码。 ... [详细]
  • 深入理解Docker网络管理
    本文介绍了Docker网络管理的基本概念,包括为什么需要Docker网络管理以及Docker提供的多种网络驱动模式。同时,文章还详细解释了Docker网络相关的命令操作,帮助读者更好地理解和使用Docker网络功能。 ... [详细]
  • 利用RabbitMQ实现高效延迟任务处理
    本文详细探讨了如何利用RabbitMQ实现延迟任务,包括其应用场景、实现原理、系统设计以及具体的Spring Boot实现方式。 ... [详细]
author-avatar
富农032884
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有