network + open vswitch / xunijiaohuanji / Open Virtual Switch
s
What is Open vSwitch?
Open vSwitch is a production quality, multilayer virtual switch licensed under the open source Apache 2.0 license. It is designed to enable massive network automation through programmatic extension, while still supporting standard management interfaces and protocols (e.g. NetFlow, sFlow, IPFIX, RSPAN, CLI, LACP, 802.1ag). In addition, it is designed to support distribution across multiple physical servers similar to VMware's vNetwork distributed vswitch or Cisco's Nexus 1000V. See full feature list here
open vswitch
https://www.jianshu.com/p/fe60bfc4eaea
一.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: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,因此,很显然,对于这个主机使用的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类型的网络稍有不同,不过原理也是类似。
这里再来一张我自己画的图
1. 添加两个虚拟端口,互为peer ip link add mgmt-eth2 type veth peer name eth2-mgmt ip link set mgmt-eth2 up ip link set eth2-mgmt up 2. 把上面的两个端口加到桥上 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 3. 把上面的两个端口加到桥上 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 4. 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
END
原文地址:https://www.cnblogs.com/lindows/p/11671893.html
- Spring Boot 1.5.x新特性:动态修改日志级别
- XMPP客户端库Smack 4.0.6版开发之二
- Spring Cloud实战小贴士:版本依赖关系
- 如何优雅的用Python做接口自动化测试
- 忘记oracle的sys用户密码怎么修改以及Oracle 11g 默认用户名和密码
- hibernate链接数据库链接池c3p0配置
- Oracle中session和processes的设置
- ssh相关原理学习与常见错误总结
- PyQt5 GUI应用程序工具包入门(1)
- grpc部署初体验
- Java中的ReentrantLock和synchronized两种锁机制的对比
- 用Python从零开始创建区块链
- 基于 Python 的僵尸网络将 Linux 机器变成挖矿机器人
- Oracle导入导出常用命令
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 技术篇-pyperclip库实现读取写入剪切板,超简单
- 基于consul的Docker-overlay跨多宿主机容器网络
- Python 微信机器人-向指定名称的好友发送微信消息
- JavaScript技术篇-js提升网页视频播放速率,提高慕课网视频播放速度
- 使用docker五步搭建ELK日志收集分析系统
- HDFS之SequenceFile和MapFile
- 配置ELK技术栈来分析apache tomcat日志
- LVS DR模式搭建,keepalived + lvs
- Ubuntu安装docker
- DockerFile简介与实例
- Elasticsearch2.3官方Dockerfile解析
- openstack架构解析
- Linux服务器基础网络配置
- 负载均衡集群介绍,LVS介绍,LVS的调度算法,LVS的NAT模式搭建
- 03 实战 Ansible-Playbook之初始化服务器