VNF生命周期管理系统设计与实现
2020-07-15郝慧杰
郝慧杰,肖 建,张 粮,洪 聪
(南京邮电大学,江苏 南京 210023)
0 引 言
网络功能虚拟化(network function virtualization,NFV)是一种实现软硬件解耦的新技术。NFV技术[1-3]一直以来都受到业界的广泛关注,其核心是通过特定的虚拟化技术,将通信网元功能分层解耦,实现网络自动化从而提升网络效益。虚拟网络功能(VNF)是虚拟机中封装的网络功能设备的软件实现,位于商用硬件NFV基础设施之上。VNF是NFV的核心部分,众所周知NFV的基础是虚拟网络功能和软件,能够降低成本并获得对网络运营的全面控制,同时具备灵活性和敏捷性的优势。NFV的大部分运营都集中在VNF如何在NFV基础设施中服务,未来,NFV中的重大进展将仅与VNF有关。虚拟网络功能作为NFV虚拟网络层的关键部分,实现对虚拟网络功能生命周期的管理,对NFV技术发展来说具有重大意义[4]。
目前在国内,研究VNF生命周期管理的公司也有许多(包括AT&T,思科,戴尔,微软,甲骨文,Verizon,Juniper等),但是大多数用于管理VNF生命周期实例化、监测、修复、缩放、更新和备份的方法成本高昂、繁琐和耗时。所以,目前VNF生命周期管理系统的研究在很多方面还不够完善和灵活。
基于以上问题,本系统在保证各个功能单位模块化的前提下,以标准的Linux的环境、接口、工具为基础,依托容器环境,通过VNF架构分析和软件模块化设计,实现了对Docker的状态的管理监控,包括安装、启动、停止、卸载、资源分配和释放等生命周期管理行为。
1 系统总体方案
该生命周期管理系统的功能需求如图1所示,软件部分包括用户交互层(命令行客户端)、业务控制层(生命周期管理核心算法)、数据支撑层(开源Redis数据库)。用户交互层用来下发用户指令,并及时响应用户请求,完成用户操作;业务控制层主要是实现虚拟网络生命周期管理状态监控和行为功能;数据支撑层实现整个系统的数据持久化,主要负责各模块进行相关数据的存储和查询。
图1 平台框架
本项目以标准的Linux的环境、接口、工具为基础,基于容器环境完成vnfc(虚拟化的网络功能模块组件)的开发,采用开源的高性能key-value数据库Redis来实现数据的存储和调度,使用Thrift软件框架,用来进行可扩展跨语言的服务开发实现RPC客户端和服务器通信。
2 软件部分关键技术
2.1 Thrift通信简述
Thrift是一个可伸缩的,并且跨语言的服务性的开发部署框架。Thrift通过一个中间语言IDL(interface definition language,接口定义语言)来定义RPC的数据类型和接口,然后通过特殊的编译器生成不同语言的代码,生成的代码中不但包含目标语言的接口定义、方法、数据类型,还包含有RPC协议层和传输层的实现代码。Thrift的架构如图2所示,Thrift实际上是一种C/S模式,通过多语言生成工具将Thrift文件转换成特定语言的接口文件,包括客户端部分和服务器部分,从而实现服务端和客户端跨语言的支持。用户根据实际需求,编写客户端或服务端代码[5]。用户定义好Thrift的IDL文件后,使用Thrift的编译器来生成相应语言的代码文件,之后服务器端提供服务,客户端调用服务。
图2 Thrift架构
选用Thrift通信机制的优势包括:支持非常多的语言绑定;Thrift文件生成目标代码,简单易用;消息定义文件支持注释;数据结构与传输表现的分离,支持多种消息格式;包含完整的客户端/服务端堆栈,可快速实现RPC;支持同步和异步通信。
Thrift可以说它是现在最优秀的分布式通信机制,实现了在大型分布式集群中各独立模块之间的高效协同。该框架具有可扩展性,能够支持跨编程语言的服务开发[6],能够高效创建服务接口,因此符合本系统高并发、大数据量的要求。
2.2 Redis数据库
Redis(remote dictionary server)[7]是一个开源的、支持网络、基于内存、支持Key-Value等多种数据结构、可持久化的高性能存储系统。它提供字符串,哈希,列表,队列,集合结构直接存取,支持原子性的操作,所以通常被称为数据结构服务器。可用于会话缓存,事件发布或订阅,数据库和消息中间件等场景。
Redis的持久化机制十分完备,所有数据都是保存在内存中,然后通过异步方式不定期地保存到磁盘上,也可以把每一次数据变化都写入到一个append only file里面。Redis支持master-slave模式的数据备份,可以通过复制功能自动实现同步的过程。当从数据库崩溃重启后,主数据库会自动同步数据,保证数据不丢失。而当主数据库崩溃时,将从数据库提升成主数据库继续提供服务,并在原来的主数据库启动后将其设置成新的主数据库的从数据库,将数据同步回来。数据同步提高了读取操作的可扩展性。Redis能读的速度是110 000次/s,写的速度是81 000次/s,所以性能非常高。
在实际应用中,当用户请求到达Redis服务器时,只是对业务数据进行读写,而没有对数据库进行任何的操作,这样就能大大提高读写的速度,从而达到高速响应的需求。这些缓存的数据仍然需要持久化,也就是存入数据库之中,所以在一个请求操作完Redis的读/写之后,会去判断该高速读/写的业务是否结束,如果不成立,则不会操作数据库;如果成立,则触发事件将Redis的缓存的数据以批量的形式一次性写入数据库,从而完成持久化的工作。Redis数据请求操作如图3所示。
图3 Redis数据请求操作
2.3 Go语言的优势
Go语言作为编译型语言,在数据类型上也支持得非常全面,除了传统的整型、浮点型、字符型、数组、结构等类型外,从实用性上考虑,也对字符串类型、切片类型、字典类型、复数类型、错误类型、管道类型、甚至任意类型进行了原生支持,并且用起来非常方便。比如字符串、切片类型,操作简便性几乎和python类似。与其他传统语言相比,Go语言通过丰富的内置类库实现了大量的接口函数,极大程度地简化了开发工作,开发者们只需调用相应的类库即可实现相关的功能[8-9]。
在异步的并发编程过程中,只能方便、快速地启动协程还不够。协程之间的消息通信,也是非常重要的,否则,各个协程不能协作无法控制。Go自诞生之日起就表明自己是为了简化多并发编程,Go既支持共享内存也支持消息传递的通信方式[10]。在Go语言中,使用基于消息传递的通信方式进行协程间通信,并且将消息管道(channel)作为基本的数据类型,使用类型关键字(chan)进行定义,并发操作时线程安全。
真正的高效率开发,是配置化的,并不需要写太多的代码,甚至根本就不需要写代码,即可完成逻辑实现,而这种方式对于后期的维护成本也是最优的,因为做到了高度的统一。Go的语言描述效率毋庸置疑(见图4),对上述所有公共组件的实现,均未超过1 000行代码,十分少的工作量就解决了通信上的问题。
图4 Go语言开发效率
本项目用Go语言编写一个客户端通过与服务端通信快速实现对容器的数据查询,数据存储,并可以进行资源调度和状态监控,大大提升了业务开发效率,节省了开发成本。
3 系统设计
3.1 容器的使用
由于虚拟机是一种十分笨重的虚拟化技术[11],在有限的物理资源条件下无法实现大规模节点伸缩,因而极大地降低了在大规模部署场景下的应用能力。而Docker容器技术具有轻量、隔离和快速部署的特点。容器相互之间不会有任何接口,完全使用沙箱机制。容器拥有独立的文件系统,安全且相互隔离的运行环境[12]。容器里的进程,使用到的资源都是虚拟的,这样与底层系统是完全隔离的。
Docker让用户可以轻松打包应用程序的代码、配置和依赖关系,然后移植到其他机器上,也实现虚拟化。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。容器可以方便地进行版本管理、随时修改、快速分享。
利用Docker的自身优势,可以实现环境一致性、运营效率、开发人员生产力和版本控制等目标。Docker相比于传统虚拟化方式具有更多的优势,不仅可以解决硬件管理的问题,也改变了虚拟化的方式。所以本项目选择Docker作为生命周期管理的实体。Docker生命周期如图5所示。
图5 Docker生命周期
3.2 VNF管理
VNF管理[13-15]主要是为了保证虚拟网络服务的正常运行和资源合理分配,从而对VNF进行一系列的相关操作。这些操作实现对网络生命周期管理,包括安装、启动、停止、卸载、资源分配和释放等。
本系统的实现如下:首先用户通过Thrift命令行客户端下发VNF生命周期管理的请求(包括安装、启动、停止、卸载、资源分配和释放),系统利用RPC通信将消息传递到Thrift的服务端,然后服务端对请求进行一系列的合法性检查,验证失败返回error。如果验证通过,程序会继续进行相应的业务逻辑处理下发,即对Docker镜像文件的安装、Docker的启动和终止等等,同时将当前数据存入Redis数据库中,最后将执行结果返回到客户端进行展示。系统流程如图6所示。
图6 VNF生命周期管理
4 实验检测
4.1 测试环境
通过简单的实验来测试VNF生命周期管理系统的运行,验证Redis数据库存储和Thrift通信接口测试,使用的测试环境如表1所示。
表1 实验环境和工具
4.2 数据库测试
在本项目中,Redis数据库有着不可替代的作用,数据库为系统的管理、运行、查询和实现数据存储等提供空间。数据库最常见的有两种问题,这两种问题导致的错误为数据一致性错误和输出错误。数据一致性错误来源于使用者提交的信息数据格式不正确,另外一种输出错误一般是网络和程序设计过程中的问题等导致,对于以上两种问题,将分别测试。测试项目如表2所示。
表2 数据库测试
4.3 通信接口测试
生命周期管理系统服务端与命令行客户端通过Thrift调用方式进行通信,因此需要对所有接口进行测试调用,以保证程序的正确运行。客户端下发VNF生命周期管理的请求(包括安装、启动、状态查看、停止、卸载、资源分配和释放)都需要进行测试,图7为下发命令进行状态查看。
图7 Docker状态查看测试
通过实验所有支持的命令行都能够通过Thrift通信接口下发成功,并返回预期的结果。
对系统的性能,利用客户端调用做最简单的阻塞式多次调用压力测试。用多个客户端多连接,多个线程,模拟发送请求。总共发送10 000 request 100client并发,执行五次时间如下:681 ms,543 ms,604 ms,542 ms,576 ms;平均时间:589.2 ms,16 972 request/s。
4.4 实验结果
实验得出,Redis数据库可以实现在任务执行过程中高效获取共享数据的分布式缓存,解决共享数据的存储问题。在并发性上,Thrift支持多进程,可以同时启用多个客户端,下发request服务端并发处理请求,耗时少,性能高。通过实验得出该方案在实用性、可扩展性、通用性等方面都有所改进,但是在客户端界面实现等方面还是存在一些问题需要再进行完善。
5 结束语
该系统主要借鉴前人经验,努力克服当前VNF生命周期管理系统中存在的缺点和限制,开发设计一套成本低、耗时少、简单易操作的生命周期管理系统。该系统以标准的Linux的环境、接口、工具为基础,基于容器环境完成vnfc(虚拟化的网络功能模块组件)的开发,采用开源的高性能key-value数据库Redis来实现数据的存储和调度,采用Thrift软件框架,用来进行可扩展跨语言的服务开发实现RPC客户端和服务器通信,实现对Docker的状态进行监控和生命周期管理。容器是操作系统级的一种虚拟化形式,它将应用程序依赖关系、所需的库和配置封装在同一操作系统的其他容器隔离的包中。容器能让应用程序以独立的方式运行,并且可以轻松迁移。随着向云原生的迁移,VNF微服务部署在容器中是发展的趋势。该系统将为Docker平台的普及发展提供助力,提高Docker平台的应用、开发、部署及运维应用的效率。