【SDNLAB独家译稿】(接本系列上一篇《OpenVirteX体系结构之组件(二)》,本文翻译第三章3.1-3.2小节,其他部分的翻译会陆续发布。)
3 操作与子系统
这一部分描述了OpenVirteX和它诸多子系统的内部工作原理。这些子系统允许OVX操作第两部分所描述的组件以用来实现OpenFlow网络的虚拟化。
3.1 系统概述
3.2 启动与关闭
3.3 事件循环
3.4 网络发现
3.5 虚拟化与去虚拟化
3.6 状态同步
3.7 弹性
3.8 持续性
3.9 JSONRPC API
3.1 系统概述
OVX被分为如下几个主要部分:
- 面向网络的南向接口:用于建立和维持基础设施(PhysicalNetwork),管理OVX和数据路径(datapath)之间的OpenFlow信道。
- 面对租户的北向接口:呈现由软件交换机(OVXSwitches)和虚拟链路(OVXLinks)构成的虚拟网络中的每个租户,管理OVXSwitches和租户控制器之间的OpenFlow信道。
- 全局映射Global map(OVXMap,PhysicalPort.ovxPortMap):完成虚拟网络和物理网络之间的相互映射,并且连接这两个网络。
- API server:监听JSONRPC调用系统配置和系统/网络状态信息。
Global mapping在创建OVXNetwork时完成,虚拟网络和物理网络的信道管理在分离的IO循环中完成。对于每个消息,循环会做如下处理:1)有一个源或目的OVXNetwork;2)必须穿过北向南向分界,也就是必须调用virtualize()和devirtualize()方法。 OVX南北向接口的这种默认解耦状态使在运行时期动态重配置OVXNetwork成为了可能,可通过API调用来操纵全局映射,并且允许OVX保留到网络的连接即使在租户不存在的情况下。
第3部分主要描述子系统和机制,使得OVX可通过函数调用的方式来创建隔离的虚拟OpenFlow网络。
3.2 启动和关闭
这个部分描述了OVX的启动和关闭过程。
3.2.1 主进程启动
OVX的main函数在OpenVirtex.java[package net.onrc.openvirtex.core]中。main函数解析系统设置的命令行参数,并且启动OpenVirteXController,OpenVirteXController实现OVX的可运行状态,记录如下系统配置信息:
- 系统配置文件路径(目前OVX还未使用)
- OVX南向接口监听OpenFlow连接的主机和端口
- OVX持续性存储应该连接的主机和端口
- 工作线程的最大数量
- 租户网络的最大数量
- 轮询PhysicalNetWork的统计数据率
对于完整列表,请查看OpenVirteXcontroller类的构造器或者是OVX的帮助函数。
为了初始化这些设置,OpenVirteXController,按如下顺序:
1. 初始化单个PhysicalNetwork实例
2. 尝试连接数据库(database)来恢复原先的虚拟网络配置(如果存在的话)
3. 开启API server
4. 初始化北向信道处理程序
OVX在第3步监听API调用,在第4步与datapath连接,这时我们认为OVX已经初始化。
3.2.2 PhysicalNetwork部署/南向信道初始化
随着交换机连接到OVX,二者之间的链路被发现,PhysicalNetwork结构也被部署。在per-datapath的基础上OVX初始化网络拓扑发现,per-datapath为每个交换机创建了PhysicalSwitch类和SwitchDiscoveryManger类的一个实例。先前提到,从交换机的角度,OVX更像是一个控制器。因此,在OVX作为控制器时,连接的建立遵循OpenFlow握手的过程。图3.1展示了交换机的状态机。
图3.1 南向接口与datapath握手的状态机,OVX作为控制器
SwitchChannelHandler[net.onrc.openvirtex.core.io]在ChannelState枚举中实现该状态机。每个ChannelState值代表datapath可到达的状态,并且定义了特定状态消息的处理方法。ChannelState也定义了一个默认的行为,但特定状态方法重写了这个行为无论datapath是否处于特定状态。
OVX仅在datapath到达WAIT_DESCPRIPTION_STAT_REPLY状态时将datapath映射到PhysicalSwitch上。OVX在握手期间通过datapath提供的信息配置PhysicalSwitch,并且将PhysicalSwitch加入PhysicalNetwork。一旦SwitchDiscoveryManger映射到它的PhysicalSwitch,并且PhysicalSwitch的StatisticsManger可用,这时datapath被认为处于ACTIVE状态。一个处于ACTIVE状态的物理交换机将参与网络发现和事件循环。状态和拓扑发现的细节将在3.4节讨论,事件循环将在3.3节讨论。
3.2.3 租户网络(OVXNetwork)/北向信道初始化
租户网络通过API调用来实现创建、配置和初始化。
OVX网络的创建按照如下步骤:
1. 声明OVXNetwork,使用的地址块,连接到OVX的租户控制器
2. 从可用的物理交换机中创建OVXSwitch
3. 向OVXSwitch添加虚拟端口(OVXPorts)
4. 添加虚拟链路(OVXLinks)、主机(Hosts)、BVSes,交换路由(SwitchRoutes)
5. 如果使用手动配置,为OVXLink和SwitchRoute指定路径
6. 为OVXLink和SwitchRoute添加备份路径(可选)
7. 初始化OVXNetwork
在内部,这些命令促使OVX完成:
1. 实例化虚拟组件
2. 在全局映射中将虚拟组件映射到PhysicalNetwork组件上
3. 让虚拟组件到达ACTIVE状态,依照依赖顺序,启动OVXNetwork
第一个列表中的步骤需要调用一个或多个API[net.onrc.openvirtex.api.server],这些调用由租户处理程序(tenant handles[api.server.handlers.tenant])处理。表1显示了用于映射的租户处理、实例化的虚拟元素和参数:
注意,创建虚拟组件和路径,需要了解可用的物理组件和网络拓扑结构。还要注意,上面的表格是不完整的API处理程序列表,仅仅列出了在OVXNetwork初始化中发挥作用的元素。本章提供了一个完整的API调用及其语法列表,在3.9节会详细介绍API服务器。
图3.2展示了第二个列表中第三步初始化OVXNetwork的过程。
图3.2 租户网络的启动过程,通过调用API服务器开始
如前所述,每个用于实现组件接口的类均包含register()和boot()方法来完成部分初始化过程。需要注意的是初始化遵循一定的顺序,首先初始化的组件状态将影响随后初始化的组件。OVX各种对象之间的状态依赖关系见图3.3。
图3.3:OVX组件依赖关系图。箭头方向表示“影响...的状态”的关系,反向箭头表示“影响...的映射”关系。例如,移除一个OVXPort,意味着任何OVXLinks、主机和连接到该端口的SwitchRoutes被删除。相应地,OVXSwitch必须从portMap中删除该端口,OVXNetwork必须从链路集合删除任何已经被删除的OVXLinks。黑色箭头表示限于任何物理或虚拟部分的查询,绿色虚线箭头表示物理到虚拟的直接依赖。当在谈论内部状态同步时我们还会重提图3.3。
ControllerChannelHandler [net.onrc.openvirtex.core.io]实现了租户控制器与OVXSwitch实例握手的状态机,如图3.4中所示。
图3.4 控制器状态机,从OVX作为datapath的角度上看
3.2.4系统关闭
关机通过OpenVirtexShutdownHook[net.onrc.openvirtex.core.io]来实现,它调用了
OpenVirteXController.terminate方法来处理。此方法关闭网络和租户面向的信道,注销该PhysicalNetwork(即已停止状态),并从其数据库断开与OVX连接。考虑到PhysicalNetwork已经部署,并且OVXNetworks存在时,关机过程需要按照图3.3中依赖关系图规定的顺序依次销毁。
未完待续,更多精彩即将呈现!
译自:北邮FNL实验室张歌,http://ovx.onlab.us/documentation/architecture/