openvswitch的原理和常⽤命令(部分信息借鉴于网友技术分享)
第一部分 .Openvswitch⼯作原理
openvSwitch是⼀个⾼质量的、多层虚拟交换机,使⽤开源Apache2.0许可协议,由 Nicira Networks开发,主要实现代码为可移植的C代码。它的
⽬的是让⼤规模⽹络⾃动化可以通过编程扩展,同时仍然⽀持标准的管理接⼝和协议(例如NetFlow, sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag)。ft外,它被设计位⽀持跨越多个物理服务器的分布式环境,类似于VMware的vNetwork分布式vswitch或Cisco Nexus 1000 V。Open vSwitch⽀持多种linux 虚拟化技术,包括Xen/XenServer, KVM和VirtualBox。
openvswitch是⼀个虚拟交换软件,主要⽤于虚拟机VM环境,作为⼀个虚拟交换机,⽀持Xen/XenServer,KVM以及virtualBox多种虚拟化技术。在这种虚拟化的环境中,
⼀个虚拟交换机主要有两个作⽤:传递虚拟机之间的流量,以及实现虚拟机和外界⽹络的通信。
内核模块实现了多个“数据路径”(类似于⽹桥),每个都可以有多个“vports”(类似于桥内的端⼝)。每个数据路径也通过关联⼀下流表(flowtable)来设置操作,⽽这些流表中的流都是⽤户空间在报⽂头和元数据的基础上映射的关键信息,⼀般的操作都是将数据包转发到另⼀个vport。当⼀ 个数据包到达⼀个vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息。当有⼀个匹配的流时它执⾏对应的操作。如果没 有匹配,它会将数据包送到⽤户空间的处理队列中(作为处理的⼀部分,⽤户空间可能会设置⼀个流⽤于以后碰到相同类型的数据包可以在内核中执
⾏操作)。
.OpenvSwitch的组成
ovs的主要组成模块如下图所⽰:
ovs-vswitchd:OVS守护进程是,OVS的核⼼部件,实现交换功能,和Linux内核兼容模块⼀起,实现基于流的交换(flow-based switching)。它和上层 controller 通信遵从 OPENFLOW 协议,它与 ovsdb-server 通信使⽤ OVSDB 协议,它和内核模块通过netlink通信,它⽀持多个独⽴的 datapath(⽹桥),它通过更改flow table 实现了绑定和VLAN等功能。
ovsdb-server:轻量级的数据库服务,主要保存了整个OVS 的配置信息,包括接⼝啊,交换内容,VLAN啊等等。ovs-vswitchd 会根据数据库中的配置信息⼯作。它于 manager 和 ovs-vswitchd 交换信息使⽤了OVSDB(JSON-RPC)的⽅式。
ovs-dpctl:⼀个⼯具,⽤来配置交换机内核模块,可以控制转发规则。
ovs-vsctl:主要是获取或者更改ovs-vswitchd 的配置信息,ft⼯具操作的时候会更新ovsdb-server 中的数据库。
ovs-appctl:主要是向OVS 守护进程发送命令的,⼀般⽤不上。
ovsdbmonitor:GUI ⼯具来显⽰ovsdb-server 中数据信息。
ovs-controller:⼀个简单的OpenFlow 控制器
ovs-ofctl:⽤来控制OVS 作为OpenFlow 交换机⼯作时候的流表内容。
- OpenvSwitch的⼯作流程
下图通过ovs实现虚拟机和外部通信的过程,通信流程如下:
1.VM实例 instance 产⽣⼀个数据包并发送⾄实例内的虚拟⽹络接⼝ VNIC,图中就是 instance 中的 eth0. 2.这个数据包会传送到物理机上的VNIC接⼝,如图就是vnet接⼝.
数据包从 vnet NIC 出来,到达桥(虚拟交换机) br100 上.
数据包经过交换机的处理,从物理节点上的物理接⼝发出,如图中物理机上的 eth0 .
数据包从 eth0 出去的时候,是按照物理节点上的路由以及默认⽹关操作的,这个时候该数 据包其实已经不受你的控制了.
注:⼀般 L2 switch 连接 eth0 的这个⼝是⼀个 trunk ⼝, 因为虚拟机对应的 VNET 往往会设置 VLAN TAG, 可以通过对虚拟机对应的 vnet 打 VALN TAG 来控制虚拟机的⽹络⼴播域. 如果跑多个虚拟机的话, 多个虚拟机对应的 vnet 可以设置不同的 vlan tag, 那么这些虚拟机的数据包从 eth0(4) 出去的时候, 会带上TAG标记. 这样也就必须是 trunk ⼝才⾏。
3.OpenvSwitch简单应⽤实例
如下图所⽰,创建从物理机到物理机的⽹络拓扑:
通过以下命令即可实现:
root@localhost:~# ovs-vsctl add-br br0
root@localhost:~# ovs-vsctl add-port br0 eth0
root@localhost:~# ovs-vsctl add-port br0 eth1
4.Openvswitch常见操作
添加⽹桥:
ovs-vsctl add-br br0
列出所有⽹桥: ovs-vsctl list-br
判断⽹桥是否存在: ovs-vsctl br-exists br0
将物理⽹卡挂载到⽹桥上: ovs-vsctl add-port br0 eth0
列出⽹桥中的所有端⼝: ovs-vsctl list-ports br0
列出所有挂载到⽹卡的⽹桥: ovs-vsctl port-to-br eth0
查看ovs的⽹络状态: ovs-vsctl show
删除⽹桥上已经挂载的⽹⼝: ovs-vsctl del-port br0 eth0
删除⽹桥:
ovs-vsctl del-br br0
设置控制器:
ovs-vsctl set-controller br0 tcp:ip:6633
删除控制器:
ovs-vsctl del-controller br0
设置⽀持OpenFlow Version 1.3:
ovs-vsctl set bridge br0 protocols=OpenFlow13
删除OpenFlow⽀持设置:
ovs-vsctl clear bridge br0 protocols
设置vlan标签:
ovs-vsctl add-port br0 vlan3 tag=3 -- set interface vlan3 type=internal
删除vlan标签:
ovs-vsctl del-port br0 vlan3
查询 VLAN: ovs-vsctl show ifconfig vlan3
查看⽹桥上所有交换机端⼝的状态: ovs-ofctl dump-ports br0
查看⽹桥上所有的流规则: ovs-ofctl dump-flows br0
查看ovs的版本: ovs-ofctl -V
给端⼝配置tag
ovs-vsctl set port br-ex tag=101
第二部分.Neutron使用
openvswitch⽹络通信的基本原理
Openstack在创建虚拟机进⾏⽹络配置的时候⼤致分为两个步骤:
1、Nova-compute通过调度在主机侧创建虚拟机,并且创建好linux bridge,是否创建linux⽹桥取决于是否把安全组的功能打开,创建好bridge和veth类型的点对点端⼝,连接bridge设备和br-int⽹桥。
2、Neutron-ovs-agent周期任务扫描到⽹桥上的端⼝发送rpc请求到neutron-server侧,获取端⼝的详细信息,进⾏⽹络配置,当然,不同类型的
⽹络会进⾏不同的处理,OVS当前⽀持,vlan、vxlan、flat、gre类型的⽹络。
具体虚拟机通信分为以下两种情况:
同板虚拟机通信
在报⽂⼊⼝⽅向打上vlan,在br-int⽹桥上进⾏⼆层的隔离,对neutron-ovs-agent来说,这个是⼀个内部vlan,因ft,很显然,对于这个主机使⽤的network来说,在主机侧neutron-ovs-agent都会维护⼀个内部vlan,并且是⼀⼀对应的,⽤于不同network的虚拟机在板上的互相隔离,由于板内虚拟机通信不经过物理⽹⼝,因ft,也不会受到⽹⼝带宽和物理交换机性能的影响。
跨板虚拟机通信:
这⾥以vlan类型⽹络举例,network的segment_id为100,即vlan为100,虚拟机出来的报⽂在进⼊br-int⽹桥上被打上内部的vlan,举例来说打上vlan 3,下⾏的流量在经过对应的⽹络平⾯后,vlan会进⾏对应的修改,通过ovs的flow table把vlan修改成真实的vlan值100;上⾏流量在br-int⽹桥上通过flow table把vlan 100修改成内部的vlan 3,flat⽹络原理类似,下⾏流量会在br-eth通过flow table strip_vlan送出⽹⼝,vxlan类型的⽹络稍有不同,不过原理也是类似。
添加两个虚拟端⼝,互为peer
ip link add mgmt-eth2 type veth peer name eth2-mgmt ip link set mgmt-eth2 up
ip link set eth2-mgmt up
把上⾯的两个端⼝加到桥上
ovs-vsctl add-port br-mgmt mgmt-eth2
修改ovs的数据库
ovs-vsctl set interface mgmt-eth2 type=patch
ovs-vsctl set interface mgmt-eth2 options:peer=eth2-mgmt
把上⾯的两个端⼝加到桥上
ovs-vsctl add-port br-eth2 eth2-mgmt
ovs-vsctl set interface eth2-mgmt type=patch
ovs-vsctl set interface eth2-mgmt options:peer=mgmt-eth2
ovs-vsctl add-port br-eth2 eth2
注意通过上⾯的⽅法添加完后,会在ifconfig中把上⾯的新加的port(如:mgmt-eth2, eth2-mgmt)⼀并显⽰出来
上⾯的1~4可以⽤下⾯的步骤来代替,且新加的veth不会出现在ifconfig中:
ovs-vsctl add-br br-mgmt ovs-vsctl add-br br-eth2
ovs-vsctl add-port br-mgmt mgmt-eth2 -- set Interface mgmt-eth2 type=patch options:peer=eth2-mgmt
##############
ovs-vsctl add-port br-eth2 eth2-mgmt -- set Interface eth2-mgmt type=patch options:peer=mgmt-eth2 ovs-vsctl add-port br-eth2 eth2
移除
ovs-vsctl del-fail-mode ovs-br
设置fail-mode
ovs-vsctl set-fail-mode br-ex secure
设置tag
ovs-vsctl set port eth0-stor tag=102
清除tag
ovs-vsctl clear port br-eth1--br-mgmt tag
ovs设置⽹桥MAC
ovs-vsctl set bridge br-storage other-config:hwaddr=fa:16:3e:fe:8f:79