正文
中的Port
phy-br-ext
与
br-int
中的Port
int-br-ext
是一对Patch Port
可以使用
ovs-vsctl
创建patch设备,如下创建两个网桥
br0,br1
,然后使用一对
Patch Port
连接它们
ovs-vsctl add-br br0
ovs-vsctl add-br br1
ovs-vsctl \-- add-port br0 patch0 -- set interface patch0 type=patch options:peer=patch1 \-- add-port br1 patch1 -- set interface patch1 type=patch options:peer=patch0#结果如下#ovs-vsctl show
Bridge "br0"
Port "br0"
Interface "br0"
type: internal
Port "patch0"
Interface "patch0"
type: patch
options: {peer="patch1"}
Bridge "br1"
Port "br1"
Interface "br1"
type: internal
Port "patch1"
Interface "patch1"
type: patch
options: {peer="patch0"}
连接两个网桥不止上面一种方法,linux中支持创建
Veth
设备对,我们可以首先创建一对
Veth
设备对,然后把这两个
Veth
分别添加到两个网桥上,其效果跟OVS中创建Patch Port一样,只是性能会有差别
#创建veth设备对veth-a,veth-bip link add veth-a type veth peer name veth-b#使用Veth连接两个网桥ovs-vsctl add-port br0 veth-a
ovs-vsctl add-port br1 veth-b
Tunnel
OVS中支持添加隧道(Tunnel)端口,常见隧道技术有两种
gre
或
vxlan
。隧道技术是在现有的物理网络之上构建一层虚拟网络,上层应用只与虚拟网络相关,以此实现的虚拟网络比物理网络配置更加灵活,并能够实现跨主机的L2通信以及必要的租户隔离。不同隧道技术其大体思路均是将以太网报文使用隧道协议封装,然后使用底层IP网络转发封装后的数据包,其差异性在于选择和构造隧道的协议不同。Tunnel在OpenStack中用作实现大二层网络以及租户隔离,以应对公有云大规模,多租户的复杂网络环境。
OpenStack是多节点结构,同一子网的虚拟机可能被调度到不同计算节点上,因此需要有隧道技术来保证这些同子网不同节点上的虚拟机能够二层互通,就像他们连接在同一个交换机上,同时也要保证能与其它子网隔离。
OVS在计算和网络节点上建立隧道Port来连接各节点上的网桥
br-int
,这样所有网络和计算节点上的
br-int
互联形成了一个大的虚拟的跨所有节点的逻辑网桥(内部靠tunnel id或VNI隔离不同子网),这个逻辑网桥对虚拟机和qrouter是透明的,它们觉得自己连接到了一个大的
br-int
上。从某个计算节点虚拟机发出的数据包会被封装进隧道通过底层网络传输到目的主机然后解封装。
上面网桥
br-tun
中
Port "vxlan-080058ca"
就是一个
vxlan
类型tunnel端口。下面使用两台主机测试创建vxlan隧道
#主机192.168.7.21上ovs-vsctl add-br br-vxlan#主机192.168.7.23上ovs-vsctl add-br br-vxlan#主机192.168.7.21上添加连接到7.23的Tunnel Portovs-vsctl add-port br-vxlan tun0 -- set Interface tun0 type=vxlan options:remote_ip=192.168.7.23#主机192.168.7.23上添加连接到7.21的Tunnel Portovs-vsctl add-port br-vxlan tun0 -- set Interface tun0 type=vxlan options:remote_ip=192.168.7.21
然后,两个主机上桥接到
br-vxlan
的虚拟机就像连接到同一个交换机一样,可以实现跨主机的L2连接,同时又完全与物理网络隔离。
Interface
Interface是连接到Port的网络接口设备,是OVS与外部交换数据包的组件,在通常情况下,Port和Interface是一对一的关系,只有在配置Port为 bond模式后,Port和Interface是一对多的关系。这个网络接口设备可能是创建
Internal
类型Port时OVS自动生成的虚拟网卡,也可能是系统的物理网卡或虚拟网卡(TUN/TAP)挂载在ovs上。 OVS中只有”Internal”类型的网卡接口才支持配置IP地址
Interface
是一块网络接口设备,负责接收或发送数据包,Port是OVS网桥上建立的一个虚拟端口,
Interface
挂载在Port上。
Controller
OpenFlow控制器。OVS可以同时接受一个或者多个OpenFlow控制器的管理。主要作用是下发流表(Flow Tables)到OVS,控制OVS数据包转发规则。控制器与OVS通过网络连接,不一定要在同一主机上
datapath
OVS内核模块,负责执行数据交换。其内部有作为缓存使用的flows,关于datapath,下面会细说
流(flows)
flows是OVS进行数据转发策略控制的核心数据结构,区别于Linux Bridge是个单纯基于MAC地址学习的二层交换机,flows的存在使OVS作为一款SDN交换机成为云平台网络虚拟机化主要组件
OVS中有多种flows存在,用于不同目的,但最主要的还是OpenFlow flows这种,文中所提到的flows都是指OpenFlow flows
OpenFlow flows
OpenFlow是开源的用于管理交换机流表的协议。OpenFlow flows是OVS中最重要的一种flow,OpenFlow控制器使用这种flows定义OVS数据转发策略。OpenFlow flows支持通配符,优先级,多表数据结构
在OVS中,OpenFlow flows位于用户空间主进程
ovs-vswitchd
,OpenFlow flows可以有一个或者多个流表,每个流表中包括多条流表项,每条流表项包含:数据包头的信息、匹配成功后要执行的指令集(actions)和统计信息。 当数据包进入OVS后,OVS会将数据包和流表中的流表项进行匹配,如果发现了匹配的流表项,则执行该流表项中的指令集。
OVS常用作SDN交换机(OpenFlow交换机),其中控制数据转发策略的就是OpenFlow flows。OpenStack Neutron中实现了一个OpenFlow控制器用于向OVS下发OpenFlow flows控制虚拟机间的访问或隔离。本文讨论的默认是作为SDN交换机场景下
不是只有连接OpenFlow控制器才能配置OpenFlow flows,
ovs-ofctl
工具可以手动添加这种flows,可以查看
man ovs-ofctl
了解
“hidden” flows
OVS在使用OpenFlow flow时,需要与OpenFlow控制器建立TCP连接,若此TCP连接不依赖OVS,即没有OVS依然可以建立连接,此时就是
out-of-band control
模式,这种模式下不需要”hidden” flows
但是在
in-band control
模式下,TCP连接的建立依赖OVS控制的网络,但此时OVS依赖OpenFLow控制器下发的flows才能正常工作,没法建立TCP连接也就无法下发flows,这就产生矛盾了,因此需要存在一些”hidden” flows,这些”hidden” flows保证了TCP连接能够正常建立。关于
in-band control
详细介绍,参考OVS官方文档
Design Decisions In Open vSwitch
中
In-Band Control
部分
“hidden” flows优先级高于OpenFlow flows,它们不需要手动设置。可以使用
ovs-appctl
查看这些flows,下面命令输出内容包括
OpenFlow flows
,
"hidden" flows