docker的网络中OVS是一个重要概念,使用软件实现了交换机功能。再加上vxlan(overlay)隧道技术,实现了跨主机通信。

      OVS是一个虚拟交换机,利用软件的方式实现交换功能,所以也叫软件交换机,跟传统的物理交换机相比,虚拟交换机同要具备很多有点:1.配置灵活,因为是软件实现的,一台物理服务器上可以配置数十太或者数百台虚拟交换机,而且端口数目可以灵活选择  2. 成本低廉,通过软件的方式可轻易达到10Gbps的交换速度。

 

      原文:https://blog.csdn.net/qq_32261399/article/details/77456577

     

  一.OpenVSwitch是什么

  OVS是一个高质量的,多层虚拟交换机(网络分层的层),其目的是让大规模网络自动化可以通过编程扩展,同事仍然支持标准的管理借口和协议:NetFlow,SFlow等,并且它还支持多个物理机的分布式环境。

什么是虚拟交换?就是利用软件的方式形成交换部件,所以也叫软件交换机,跟传统的物理交换机相比,虚拟交换机同要具备很多优点:1配置灵活,因为是软件实现的,一台物理服务器上可以配置书十台或者数百台虚拟交换机,而且端口数目可以灵活选择。2成本低,通过软件的方式可轻易达到10Gbps的交换速度。  所以OVS是一个虚拟交换机,可以用来组成虚拟网络,虚拟机还有其他类型的不同的架构。

  二.虚拟网络

  浅显的理解就是使用虚拟交换机组成的网络,就是虚拟网络(和物理网络相比),如图所示:

 

  三.OVS组件

  OVS的内部组件,简单来看,OVS由着三大不封构成:

 

   1.OVSDB-server:OVS的数据库服务器,用来存储虚拟交换机的配置信息。它与manager和ovs-vswitch交换信息使用了OVSDB(json-rpc)的方式。

  2.Ovs-vswitchd:OVS的核心部件,它和上层controller通信遵从OPENFLOW协议,它与ovsdb-sever通信使用OVSDB协议,它和内核模块通过netlink通信,它支持多个独立的datapath(网桥),它通过更改flowtable实现了绑定,和VLAN等功能。

  3.ovs kernel module: OVS的内核模块,处理包交换和隧道,缓存flow,如果在内核的缓存中找到转发规则则转发,否则发向用户空间去处理。

  四、OVS结构详解

      OVS到底由哪些模块组成,以及个模块的作用。如图:

       ovs-vswitchd 主要模块,实现switch的daemon,包括一个支持流交换的Linux内核模块;

  ovsdb-server 轻量级数据库服务器,提供ovs-vswitchd获取配置信息;

  ovs-brcompatd 让ovs-vswitch替换Linuxbridge,包括获取bridge ioctls的Linux内核模块;

  ovs-dpctl 用来配置switch内核模块;一些Scripts and specs 辅助OVS安装在Citrix XenServer上,作为默认switch;

  ovs-vsctl 查询和更新ovs-vswitchd的配置;

  ovs-appctl 发送命令消息,运行相关daemon;

  ovsdbmonitorGUI工具,可以远程获取OVS数据库和OpenFlow的流表。

  此外,OVS也提供了支持OpenFlow的特性实现,包括

  ovs-openflowd:一个简单的OpenFlow交换机;

  ovs-controller:一个简单的OpenFlow控制器;

  ovs-ofctl 查询和控制OpenFlow交换机和控制器;

  ovs-pki :OpenFlow交换机创建和管理公钥框架;

  ovs-tcpundump:tcpdump的补丁,解析OpenFlow的消息;

  运行原理:

  内核模块实现了多个“数据路径”(类似于网桥),每个都可以有多个“vports”(类似于桥内的端口)。每个数据路径也通过关联一下流表(flow table)来设置操作,而这些流表中的流都是用户空间在报文头和元数据的基础上映射的关键信息,一般的操作都是将数据包转发到另一个vport。当一个数据包到达一个vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息。当有一个匹配的流时它执行对应的操作。如果没有匹配,它会将数据包送到用户空间的处理队列中(作为处理的一部分,用户空间可能会设置一个流用于以后碰到相同类型的数据包可以在内核中执行操作)。

  五、示例

  1. 物理机器之间通过虚拟交换机

 

  可以看到虚拟机的两个网卡是虚拟交换机虚拟出来的两个端口。

  2. 一台物理机上的虚拟机之间的虚拟交换机

 

 

      原文链接:https://www.cnblogs.com/bakari/p/8097439.html

  Linux Bridge#

  和物理网络一样,虚拟网络要通信,必须借助一些交换设备来转发数据。因此,对于网络虚拟化来说,交换设备的虚拟化是很关键的一环。

  上文「网络虚拟化」已经大致介绍了 Linux 内核为了满足网络虚拟化的要求,实现了一套虚拟交换设备——Bridge。本文重点介绍下 Bridge 的加强版——Open vSwitch(OVS),并从 Bridge 过渡到 OVS 的缘由讲起,让大家有个全面的认识。

  借助 Linux Bridge 功能,同主机或跨主机的虚拟机之间能够轻松实现通信,也能够让虚拟机访问到外网,这就是我们所熟知的桥接模式,一般在装 VMware 虚拟机或者 VirtualBox 虚拟机的时候,都会提示我们要选择哪种模式,常用的两种模式是桥接和 NAT。

  NAT 也很好理解,可以简单理解为当虚拟机启用了 NAT 模式之后,宿主机便通过 DHCP 为其生成可以访问外网的 IP,当 VM 访问外网的时候,就可以用该 IP 访问,其实就是宿主机为其做了地址转换。更详细的内容请自行搜索了解。

  物理交换机有个重要的功能,就是虚拟局域网(VLAN),是对局域网(LAN)的软件化升级。一般,两台计算机通过一台交换机连接在一起就构成了一个 LAN。

  一个 LAN 表示一个广播域,这意味着这个 LAN 中的任何节点发的数据包,其他节点都能收到,这有两个问题,一个是容易形成广播风暴,造成网络拥塞,另一个是广播包无法隔离,比如节点 B 不想接收节点 A 的包,但节点 A 强行要发,这就有点说不过去了。

  解决这个问题的方案就是 VLAN,VLAN 能够对广播包进行有效隔离,它的做法是从软件上将交换机的端口虚拟出多个子端口,用 tag 来标记,相当于将交换机的端口划分多个 LAN,同一个 LAN 中的节点发出的数据包打上本 LAN 的 tag,这样,其他 LAN 中的节点就无法收到包,达到隔离的目的。

  Bridge 本身是支持 VLAN 功能的,如下图所示,通过配置,Bridge 可以将一个物理网卡设备 eth0 划分成两个子设备 eth0.10,eth0.20,分别挂到 Bridge 虚拟出的两个 VLAN 上,VLAN id 分别为 VLAN 10 和 VLAN 20。同样,两个 VM 的虚拟网卡设备 vnet0 和 vnet 1 也分别挂到相应的 VLAN 上。这样配好的最终效果就是 VM1 不能和 VM2 通信了,达到了隔离。

  Linux Bridge + VLAN 便可以构成一个和物理交换机具备相同功能的虚拟交换机了。对于网络虚拟化来说,Bridge 已经能够很好地充当交换设备的角色了。

  OVS#

  但是为什么还有很多厂商都在做自己的虚拟交换机,比如比较流行的有 VMware virtual switch、Cisco Nexus 1000V,以及 Open vSwitch。究其原因,主要有以下几点(我们重点关注 OVS):

  1)方便网络管理与监控。OVS 的引入,可以方便管理员对整套云环境中的网络状态和数据流量进行监控,比如可以分析网络中流淌的数据包是来自哪个 VM、哪个 OS 及哪个用户,这些都可以借助 OVS 提供的工具来达到。

  2)加速数据包的寻路与转发。相比 Bridge 单纯的基于 MAC 地址学习的转发规则,OVS 引入流缓存的机制,可以加快数据包的转发效率。

  3)基于 SDN 控制面与数据面分离的思想。上面两点其实都跟这一点有关,OVS 控制面负责流表的学习与下发,具体的转发动作则有数据面来完成。可扩展性强。

  4)隧道协议支持。Bridge 只支持 VxLAN,OVS 支持 gre/vxlan/IPsec 等。

  5)适用于 Xen、KVM、VirtualBox、VMware 等多种 Hypervisors。

  ......

  除此之外,OVS 还有很多高级特性,详情可以查阅官网自行了解。

  下面简单看下 OVS 的整体架构,如下图所示,OVS 在 Linux 用户态和内核态都实现了相应的模块,用户态主要组件有数据库服务 ovsdb-server 和守护进程 ovs-vswitchd。内核态中实现了 datapath 模块。

  其中, ovs-vswitchd 和 datapath 共同构成了 OVS 的数据面,控制面由 controller 模块来完成,controller 一般表示的是 OpenFlow 控制器,在 OVS 中,它可以借由第三方来完成,只要支持 OpenFlow 协议即可。

  这里额外提一点,很多的一些产品级的虚拟交换机都是自身集成了控制器,比如 Cisco 1000V 的 Virtual Supervisor Manager(VSM),VMware 的分布式交换机中的 vCenter,而 OVS 是把这个事交由第三方去做,这么做的意义还是比较大的,可以让自己的产品很好地融入到各种解决方案中。

  OpenFlow
  OpenFlow 是控制面和数据面通信的一套协议,我们常常把支持 OpenFlow 协议的交换机称为 OpenFlow 交换机,控制器称为 OpenFlow 控制器,业界比较知名的 OpenFlow 控制器有 OpenDaylight、ONOS 等。

  OpenFlow 是一个独立的完整的流表协议,不依赖于 OVS,OVS 只是支持 OpenFlow 协议,有了支持,就可以使用 OpenFlow 控制器来管理 OVS 中的流表。OpenFlow 不仅仅支持虚拟交换机,某些硬件交换机也支持 OpenFlow 协议。

  ovs-vswitchd
  ovs-vswitchd 是 OVS 的核心组件,它和内核模块 datapath 共同构成了 OVS 的数据面。它使用 OpenFlow 协议与 OpenFlow 控制器通信,使用 OVSDB 协议与 ovsdb-server 通信,使用 netlink 和 datapath 内核模块通信。

  ovsdb-server
  ovsdb-server 是 OVS 轻量级的数据库服务,用于整个 OVS 的配置信息,包括接口、交换内容、VLAN 等,ovs-vswitchd 根据这些配置信息工作。

  OpenFlow 控制器
  OpenFlow 控制器可以通过 OpenFlow 协议连接到任何支持 OpenFlow 的交换机,比如 OVS 。控制器通过向交换机下发流表规则来控制数据流向。

  Kernel Datapath
  datapath 内核模块和 ovs-vswitchd 是相互协作工作的,datapath 负责具体的收发包,而 ovs-vswitchd 通过 controller 下发的流表规则指导 datapath 如何转发包。

  举个例子,datapath 从主机物理网卡 NIC 或者 VM 的 虚拟网卡 vNIC 收到包,如果是第一次收到包,datapath 不知道怎么处理这个包,于是将其丢给 ovs-vswitchd , ovs-vswitchd 决定该如何处理这个包之后又丢给 datapath,datapath 根据 ovs-vswitchd 的指示执行相应的动作,是丢弃还是从哪个口传出去。同时,ovs-vswitchd 会让 datapath 缓存好这个包的动作,下次再来就可以直接执行动作。

  如果不是第一次收到包,就是按照之前缓存好的动作执行,这样极大地提高了数据处理的速度。

  本文先对 OVS 有个初步印象,下文再详细介绍 OVS 的其他组件。



转载于:https://www.cnblogs.com/lnlvinso/p/11203829.html

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐