转载自:https://opengers.github.io/openstack/openstack-base-use-openvswitch/
一:Open vSwitch介绍
(一)介绍
在过去,数据中心的服务器是直接连在硬件交换机上, 后来VMware实现了服务器虚拟化技术,使虚拟服务器(VMs)能够连接在虚拟交换机上,借助这个虚拟交换机,可以为服务器上运行的VMs或容器提供逻辑的虚拟的以太网接口,这些逻辑接口都连接到虚拟交换机上, 有三种比较流行的虚拟交换机:
VMware virtual switch, Cisco Nexus 1000V, 和Open vSwitch
Open vSwitch(OVS)是运行在虚拟化平台上的虚拟交换机, 其支持OpenFlow协议,也支持gre/vxlan/IPsec等隧道技术。 在OVS之前,基于Linux的虚拟化平台比如KVM或Xen上,缺少一个功能丰富的虚拟交换机,因此OVS迅速崛起并开始在Xen/KVM中流行起来,并且应用于越来越多的开源项目, 比如openstack neutron中的网络解决方案
在虚拟交换机的Flow控制器或管理工具方面,一些商业产品都集成有控制器或管理工具,比如Cisco 1000V的Virtual Supervisor Manager(VSM),VMware的分布式交换机中的vCenter。 而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技术
(二)OVS支持以下features
支持NetFlow, IPFIX, sFlow, SPAN/RSPAN等流量监控协议 精细的ACL和QoS策略 可以使用OpenFlow和OVSDB协议进行集中控制 Port bonding,LACP,tunneling(vxlan/gre/Ipsec) 适用于Xen,KVM,VirtualBox等hypervisors 支持标准的802.1Q VLAN协议 基于VM interface的流量管理策略 支持组播功能 flow-caching engine(datapath模块)
二:OVS架构
(一)OVS整体架构
用户空间主要组件有数据库服务ovsdb-server和守护进程ovs-vswitchd。kernel中是datapath内核模块。 最上面的Controller表示OpenFlow控制器,控制器与OVS是通过OpenFlow协议进行连接,控制器不一定位于OVS主机上, 下面分别介绍图中各组件
![](https://img-blog.csdnimg.cn/img_convert/64548f740858818ce5b69ef87a64cfcb.webp?x-oss-process=image/format,png)
添加图片注释,不超过 140 字(可选)
(二)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
...
(三)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-c