openvswitch的原理和常用命令
一.Openvswitch工作原理
openvSwitch是一个高质量的、多层虚拟交换机,使用开源Apache2.0许可协议,由 Nicira Networks开发,主要实现代码为可移植的C代码。它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议(例如NetFlow, sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag)。此外,它被设计位支持跨越多个物理服务器的分布式环境,类似于VMware的vNetwork分布式vswitch或Cisco Nexus 1000 V。Open vSwitch支持多种linux 虚拟化技术,包括Xen/XenServer, KVM和VirtualBox。
openvswitch是一个虚拟交换软件,主要用于虚拟机VM环境,作为一个虚拟交换机,支持Xen/XenServer,KVM以及virtualBox多种虚拟化技术。在这种虚拟化的环境中,一个虚拟交换机主要有两个作用:传递虚拟机之间的流量,以及实现虚拟机和外界网络的通信。
内核模块实现了多个“数据路径”(类似于网桥),每个都可以有多个“vports”(类似于桥内的端口)。每个数据路径也通过关联一下流表(flow
table)来设置操作,而这些流表中的流都是用户空间在报文头和元数据的基础上映射的关键信息,一般的操作都是将数据包转发到另一个vport。当一个数据包到达一个vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息。当有一个匹配的流时它执行对应的操作。如果没有匹配,它会将数据包送到用户空间的处理队列中(作为处理的一部分,用户空间可能会设置一个流用于以后碰到相同类型的数据包可以在内核中执行操作)。
1.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 的配置信息,此工具操作的时候会更新ovsdb-server 中的数据库。
ovs-appctl:主要是向OVS 守护进程发送命令的,一般用不上。
ovsdbmonitor:GUI 工具来显示ovsdb-server 中数据信息。
ovs-controller:一个简单的OpenFlow 控制器
ovs-ofctl:用来控制OVS 作为OpenFlow 交换机工作时候的流表内容。
2. OpenvSwitch的工作流程
下图通过ovs实现虚拟机和外部通信的过程,通信流程如下:
1.VM实例 instance 产生一个数据包并发送至实例内的虚拟网络接口 VNIC,图中就是 instance 中的 eth0.
2.这个数据包会传送到物理机上的VNIC接口,如图就是vnet接口.
3.数据包从 vnet NIC 出来,到达桥(虚拟交换机) br100 上.
4.数据包经过交换机的处理,从物理节点上的物理接口发出,如图中物理机上的 eth0 .
5.数据包从 eth0 出去的时候,是按照物理节点上的路由以及默认网关操作的,这个时候该数 据包其实已经不受你的控制了.
注:一般 L2 switch 连接 eth0 的这个口是一个 trunk 口, 因为虚拟机对应的 VNET 往往会设置 VLAN TAG,
可以通过对虚拟机对应的 vnet 打 VALN TAG 来控制虚拟机的网络广播域. 如果跑多个虚拟机的话, 多个虚拟机对应的 vnet
可以设置不同的 vlan tag, 那么这些虚拟机的数据包从 eth0(4)出去的时候, 会带上TAG标记. 这样也就必须是 trunk
口才行。
3.OpenvSwitch简单应用实例
如下图所示,创建从物理机到物理机的网络拓扑:
通过以下命令即可实现:
root[@localhost](https://my.oschina.net/u/570656):~# ovs-vsctl add-br br0
root[@localhost](https://my.oschina.net/u/570656):~# ovs-vsctl add-port br0 eth0
root[@localhost](https://my.oschina.net/u/570656):~# 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:
# 删除控制器:
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= -- 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,因此,很显然,对于这个主机使用的network来说,在主机侧neutron-ovs-agent都会维护一个内部vlan,并且是一一对应的,用于不同network的虚拟机在板上的互相隔离,由于板内虚拟机通信不经过物理网口,因此,也不会受到网口带宽和物理交换机性能的影响。
- 跨板虚拟机通信:
这里以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= 清除tag
ovs-vsctl clear port br-eth1--br-mgmt tag ovs设置网桥MAC
ovs-vsctl set bridge br-storage other-config:hwaddr=fa::3e:fe:8f:
补充
openvswitch的原理和常用命令的更多相关文章
- Android ADB原理及常用命令
Android调试桥(ADB, Android Debug Bridge)是一个Android命令行工具,包含在SDK 平台工具包中,adb可以用于连接Android设备,或者模拟器,实现对设备的控制 ...
- Docker基础修炼2--Docker镜像原理及常用命令
通过前文的讲解对Docker有了基本认识之后,我们开始进入实战操作,本文先演示Docker三要素之镜像原理和相关命令. 本文的演示环境仍然沿用上一篇文章在本地Centos7中安装的环境,如果你本地没有 ...
- Git 工作原理以及常用命令操作
GIT工作原理 要了解GIT工作原理,先了解GIT的这几块区域: 工作区域划分 工作区:指的是本地工作空间,如果刚拉取下来的代码,没有修改的内容,这块区域是空白的 (modified-已修改状态) 暂 ...
- Nginx系列一:正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡
转自https://www.cnblogs.com/leeSmall/p/9351343.html 仅供个人学习 一.什么是正向代理.什么是反向代理 1. 正向代理,意思是一个位于客户端和原始服务器( ...
- Git的原理简介和常用命令
Git和SVN是我们最常用的版本控制系(Version Control System, VCS),当然,除了这二者之外还有许多其他的VCS,例如早期的CVS等.顾名思义,版本控制系统主要就是控制.协调 ...
- [转帖]RPM的原理及rpm命令常用参数
RPM的原理及rpm命令常用参数 2015年09月14日 15:39:43 lose_wait 阅读数 1298 https://blog.csdn.net/u012012939/article/de ...
- docker学习笔记(1)概述、原理学习、常用命令
一.Docker概述 Docker是基于Go语言实现的云开源项目,诞生于2013年初,目前主流的Linux操作系统已支持Docker,如Redhat RHEL6.5/CentOS6.5.Ubuntu ...
- linux iptables常用命令之配置生产环境iptables及优化
在了解iptables的详细原理之前,我们先来看下如何使用iptables,以终为始,有可能会让你对iptables了解更深 所以接下来我们以配置一个生产环境下的iptables为例来讲讲它的常用命令 ...
- Git 常用命令详解
Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...
随机推荐
- Python的3个方法:静态方法(staticmethod),类方法(classmethod)和实例方法
Python的方法主要有3个,即静态方法(staticmethod),类方法(classmethod)和实例方法,如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- PHP获取客户端的IP
function getClientIP(){ global $ip; if (getenv("HTTP_CLIENT_IP")) $ip = geten ...
- corethink功能模块探索开发(十八)前台页面插入jit前端数据可视化库
效果图: 1.静态文件放入View目录中 在View目录下新建Public目录,在Public目录下新建js.css目录. 把jit的资源放入对应目录中 2.在html中引入jit Applicati ...
- C语言自带快速排序对比插入排序
#include <stdio.h> #include <stdlib.h> #include <time.h> void getRandomArr (int ar ...
- 图形数据库 Neo4j 开发实战【转载】
简介: Neo4j 是一个高性能的 NoSQL 图形数据库.Neo4j 使用图(graph)相关的概念来描述数据模型,把数据保存为图中的节点以及节点之间的关系.很多应用中数据之间的关系,可以很直接地使 ...
- likely(x)与unlikely(x) __builtin_expect
本文讲的likely()和unlikely()两个宏,在linux内核代码和一些应用中可常见到它们的身影.实质上,这两个宏是关于GCC编译器内置宏__builtin_expect的使用. 顾名思义,l ...
- 腾讯天猫经常出现这些低级的bug!
对于程序员来说,bug很讨厌.每天重复着写代码.找bug.修改bug的动作.按理说互联网巨头的产品,bug应该比较少.但是实际上,无论是用百度.天猫.谷歌等产品,经常都会出现这些低级的bug,让人很火 ...
- CNN学习笔记:卷积神经网络
CNN学习笔记:卷积神经网络 卷积神经网络 基本结构 卷积神经网络是一种层次模型,其输入是原始数据,如RGB图像.音频等.卷积神经网络通过卷积(convolution)操作.汇合(pooling)操作 ...
- BZOJ 3689: 异或之
字典树可以$o(logn)查找第k大$ 使用$可持久化Trie 区间查找第k大,然后首先把每个数异或之后的最小丢进小根堆中,然后一个一个取出,取出后就再丢次小,一共取k次$ 总的时间复杂度为$O(kl ...
- Codeforces - 55D Beautiful numbers (数位dp+数论)
题意:求[L,R](1<=L<=R<=9e18)区间中所有能被自己数位上的非零数整除的数的个数 分析:丛数据量可以分析出是用数位dp求解,区间个数可以转化为sum(R)-sum(L- ...