范国伟
(中国人民大学信息学院,北京 100000)
商业软件具有功能丰富多样、版本频繁更新等特点,为了满足用户需求,软件开发公司通常选择敏捷开发模式。虽然该模式减轻了前端开发人员的压力,但是后期运维工作量明显增加,这一问题在Web 应用软件中表现的尤其明显。近年来,容器技术逐渐向轻量化、可移植方向发展,这就为DevOps 云平台设计创造了有利条件和技术支持。设计基于容器的DevOps 云平台系统,成为现阶段软件公司实现产品从前端开发到运行维护全生命周期管理的一种优先选择。
DevOps 系统的组成架构共分为5 个模块,各模块实现的基本功能如下:(1)资源管理模块。为进一步提高资源利用率,在资源管理中引入了集群管理的概念。利用MooseFS 集群、Kubernetes 集群,将分散在平台各处的资源整合到一起,为资源的调用、存储等提供必要的支持。(2)项目管理模块。项目经理可根据系统开发需要,创建新的项目。还可以通过权限管理,为每个成员赋予不同的权限,加快开发进度。在任务管理中,创建任务计划,并利用任务汇报表随时掌握任务进度。(3)在线开发模块。支持在线编辑代码和调试程序。在文件管理中,管理员可执行获取代码、删除代码等操作。开发人员还可以自定义代码编辑的快捷键,进一步提高软件开发的效率。(4)镜像管理模块。包括镜像制作、上传、删除等内容,确保该平台上始终有充足的镜像满足工作人员的使用需求。(5)应用管理模块。在程序完成开发并经过在线调试确定不存在问题后,将所有代码进行编译打包,并形式存储,生成应用。运维人员可对该应用进行发布、升级、删除等操作。该平台的组成架构如图1 所示。
图1 基于容器的DevOps 云平台架构
2.1.1 集群管理模块设计。DevOps 云平台的部署环境中包含了大量的工作节点,集群管理的核心功能在于根据运行需要添加、删除节点,从而实现资源利用的最优化。进行设计时需要注意,如果集群中资源不能满足应用需要时,应添加新的节点,保证应用正常运行;当集群中资源过剩时,则删除多余节点。集群管理模块面向的对象是Node 节点,而非Master 节点。为了防止误操作,还需要设计节点验证,方法是添加一个由Master 节点产生的token 验证码,每24h 刷新一次。具体流程如下:(1)在添加节点时,控制节点调用Cluster Ctrl::get_token () 分别向Master 节点和Node 节点发送请求token 数据。(2)当Node 节点接收token 验证码后,向Master 节点发出“加入集群”的请求。Master 在接收该请求后,将控制节点提供的token 码,与Node 发送请求中的token 码进行配对。(3)若配对成功,则响应该请求,将token 码和请求结果返回控制节点,由控制节点完成Node 节点的添加。整个流程如图2 所示。
图2 添加Node 节点流程
2.1.2 存储管理模块设计。在DevOps 云平台开发中,以容器作为应用部署环境,如果容器因为各种原因无法正常使用,则内部存储数据也会随之丢失。为进一步提高数据的安全性、完整性,可选择存储卷作为数据存储载体,除了提供较大容量的存储环境外,还能够支持容器与物理机之间无障碍的数据交换。通常情况下,存储卷应用于单台物理机上,而不适合在集群中应用。要想将存储卷内的信息资源达到跨主机共享的效果,进一步优化文件保存和调用的操作体验,可以将存储卷与MooseFS 文件系统加以整合。具体设计流程如下:(1)选择两个或多个容器(pod),首先将这些容器的存储卷合并,实现数据的整合,然后在物理机上建立新的MooseFS 文件,后台调用静态成员函数create Volume(),并对存储卷进行初始化;(2)按照同样的方式,将其他容器也进行数据合并,最后将多台物理机上的MooseFS 文件整合,即可得到MooseFS Flie 系统;(3)在对空间进行限制过程中需要采用静态方法get Volume (S path) 获取Volume 对象,并配合参数对调整对象采用setquota(Ssize)的方法实现空间分配。其存储架构如图3 所示。
图3 存储卷架构图
2.2.1 项目的创建。系统管理员掌握着创建项目的权限。管理员可利用自身掌握的权限,进入到Gitlab 服务器中,指定一个远程代码仓库,调用task Create()函数进行创建,并进行初始化。之后再选择项目经理,全权负责该项目的运行和管理。
2.2.2 任务管理模块设计。该模块的功能除了支持项目的新建、删除外,还包括项目进度、项目人员的管理以及任务管理。以任务管理为例,项目经理负责任务分配。创建新的任务后,分别分配给开发组和运维组。开发人员领取项目开发任务后,根据任务需求完成开发。具体设计流程如下:
2.2.2.1 任务创建后,调用set Task Depend()进行设置,并定期编制开发进度表汇报给项目经理,方便监督开发进度。待taskependence 表完成开发任务后,进行任务提交。
2.2.2.2 运维人员领取运维任务后,根据项目特点、运维需求分析,开展项目的运行维护。定期编制运维进度表,维护功能是由getTaskByUser () 完成。该函数会在task 表中查找depend_count 值为0 的任务,并汇报给项目经理。完成运维任务后,进行提交。反馈的任务如下:
2.2.2.3 项目经理以提交的任务汇报表作为依据,对项目开发进度进行实时监督,避免出现任务延期的情况。最后经由task Check() 函数对任务进行审核,无误后顺利完成项目开发任务。整个设计流程如图4 所示。
图4 任务管理流程图
2.2.3 操作管理。为了防止出现误操作导致系统功能受到影响,对于系统中涉及到的敏感操作,均要求由项目经理审核。只有在审核通过后才能继续下一步的操作。以镜像删除操作为例,用户首先要提交“删除镜像”的操作请求;该请求发送至项目经理后,进行请求审查。若该操作符合要求,则批准此操作,向对应接口发送请求,由用户自行完成镜像删除的操作;若该操作不符合要求,则否决此操作。这就避免了运维人员误操作将镜像删除,导致开发人员无法正常开展镜像调试的情况,从而保证了系统开发的顺利进行。需要注意的是,操作管理面向的对象为系统中的敏感操作,对于其他常规操作则不作审核,从而减轻系统负担。
2.3.1 文件管理模块设计。支持在线开发是DevOps 云平台的特色功能,将开发环境从原来的物理平台,转移到容器云上,一方面有利于开发程序和编程代码的安全保存,有效解决信息丢失和泄露的问题,另一方面也能够实现开发环境和运维环境的一致性,对DevOps 云平台的运行稳定也有一定的帮助。Web项目开发过程中,会生成海量化的代码文件、配置文件,做好文件管理尤为重要。文件管理的设计流程如图5 所示。
图5 文件管理流程图
获取访问权限的用户从系统登录界面完成验证后,进入到系统主界面,从工具栏中选择“打开”选项,找到需要管理的文件,正常读取文件后显示内容。管理员经检查,确定文件不存在问题后,可选择上传文件、移动文件、删除文件等操作。
2.3.2 代码编辑。编写代码是Devops 云平台设计的核心工作,有些代码编辑器可提供代码高亮、代码折叠、自动缩进等功能,为程序员提供了诸多便利。目前技术成熟度极高、应用比较广泛的在线代码编辑器有ACE、Monaco 等几种。其中ACE 具有集成方式简单、不易受网络性能影响等特点。在代码编辑设计流程如下:
2.3.2.1 编辑器配置文件获取,编辑器设置文件获取是Coding OL::get Edit Con FIle () 函数完成的,并向后台发送消息,程序员可根据自己的偏好设置快捷键。在登录系统之后,调出快捷键菜单栏,在自定义快捷键之后,从前台发送请求快捷键的信息,后台通过Conf File Op::readconfig()接收请求之后将设置信息保存在editor.json 配置文件中。当下一次用户登录系统后,激活配置文件,用户可调用快捷键。配置文件如下:
2.3.2.2 编辑器设置,在前端接收到数据后调用set Edit Conf()进行下一步操作,然后通过ace.edit() 函数获取ACE 编辑器对象,结合不同的设置编辑不同的函数;
2.3.2.3 代码断网保存,在线开发平台必须要考虑在突然断网之后的代码保存问题,在ACE 代码编辑器中设有一个定时器,可由管理员手动设置间隔时间。然后每隔一段时间就检查一次是否出现断网情况,若检测到断网情况,则将用户最新编辑并且尚未保存的代码,自动保存在本地,防止代码断网丢失的问题。
2.3.3 在线调试。在线编辑代码、完成程序开发后,还要通过在线调试,检测程序是否存在BUG。特别是基于Web 前端的程序开发,开发人员除了要确保代码本身不存在逻辑问题,还要经常性的检查Web 页面的呈现效果。因此,在线调试的重要性不言而喻。其设计流程为:(1)准备在线调试所需的环境。选择单个容器进行测试,保证容器端口对用户开放,使用户能够直接进行访问;(2)启动在线调试功能。运行Web 项目,如果该项目存在语法错误,可直接在网页中暴露出来。调试人员可根据显示结果,针对语法错误进行代码修改。然后刷新一次项目,直到语法错误消失。配置内容如下:
2.4.1 镜像制作。要想使系统中的容器能够满足应用运行的需要,必须要提供多种可供选择的镜像。制作镜像既是镜像管理的首要环节,也是保障系统运行的关键步骤。基于线上平台的镜像制作,无须访问底层物理机,除了简化运行流程外,对保障数据信息的安全也有积极帮助。现阶段制作镜像的工具有2种流程:(1)DockerFile 工具,主要支持用户自定义基础镜像,在此基础上嵌入配置文件,自动构建镜像;(2)Commit 工具,是将某个正在运行的容器作为镜像,在该容器中执行Linux 命令进行环境配置,配置结束后即可得到镜像。现以DockerFile 工具为例,其制作流程如图6 所示。
图6 镜像制作流程图
2.4.2 镜像上传。制作好的镜像,需要将镜像信息完全保存至镜像仓库,以便功能正常发挥。镜像信息保存的过程即为镜像上传。为了方便后期进行镜像管理(添加、维护、删除),需要在镜像信息中添加Layer 文件。对于成功上传的镜像信息,后期可通过调用Layer 文件的方式,查找目标信息,或检索维护记录,从而实现快速操作。
系统测试在仿真环境下进行,使用虚拟机代替物理服务器。共用13 台虚拟机,其中2 台为Web 服务器,用于处理用户请求;1 台为Nginx 服务器,用于将用户提出请求转移到Web 服务器中。除此之外,还配置了数据库集群、MooseFS 集群等,具体的测试环境如表1 所示。
表1 测试环境说明表
3.2.1 在线开发可靠性测试。基于DevOps 云平台的在线开发模块,假如在开发过程中出现断电、断网的情况,能否将已经编写但是尚未保存的代码进行自动保存,是衡量在线开发可靠性的重要指标。针对这一指标开展性能测试,操作流程为:开发人员正常登录系统后,在主界面上选择“在线开发”模块,新建一个文件,点击工具栏的“打开”选项,在弹出的选择页面中,打开test.php 文件,并在该文件中添加add 函数,然后保存。任意编写一段代码,此时将网络断开,等待10s 后关闭浏览器。然后将网络重新连接,并打开浏览器,在搜索栏中采用关键字检索刚才的项目,并双击打开。系统在页面加载完毕后,会自动检查本地缓存,判断是否有可供选择的保存代码。如果有,则弹出“检测到test.php 文件有本地缓存,是否选择恢复?”的提示框,如图7所示。开发人员点击“确认”后,之前的代码完全恢复,则说明DevOps 云平台的在线开发功能可靠。
图7 代码恢复测试图
3.2.2 网页响应速度测试。DevOps 云平台系统的全部功能,都是基于Web 网页来实现的,为了优化用户的操作体验,必须要尽可能的提高网页响应速度。通过开展网页响应速度测试也能够在一定程度上判断该系统的性能。
3.2.2.1 数据库查询接口测试。云平台运行期间,需要频繁进行数据访问、调用、存储等操作,因此该项测试中选择数据库查询接口,测试其在多个用户并发访问情况下的响应速度。试验中分别选择100、200。300。500 个并发数,每个并发数测试15次,然后求平均值。试验结果记录见表2。
表2 数据库查询接口测试结果
在实际使用中,数据库查询结果的反馈时间在2s 以内,用户体验良好;2-5s 则一般,超过5s 体验较差。从测试结果来看,在并发数为100 时,响应时间为0.264s;并发数为500 时,相应时间为0.338s,均明显低于2s,故该系统的响应速度较快,操作体验较好。
3.2.2.2 资源创建接口测试。为了提高响应速度和减少系统资源占用,该测试中利用在线调试接口作为资源创建接口,测试方法如下:
用户登录系统后,根据选择的镜像配置,在后台新建一个容器,在获取容器地址后开始测试。测试内容主要包括3 部分,分别是信息传递时间、信息处理查询时间、容器创建时间。其中,信息传递时间检测难度较大,而另外2 个参数可通过修改程序获得,因此本次测试只选择信息处理时间和容器创建时间作为研究对象。为最大程度上消除结果误差,进行了4 组测试,每组分别在1 个、5 个、10 个和20 个并发的情况下检测响应速度,结果如表3 所示。
表3 任务创建接口测试表
结合表3 可知,在并发数为1 的情况下,该系统的平均响应时间仅为1.86s;而并发数为5 个时,响应时间则需要2.34s,属于一般速度;继续增加并发数至20 个时,响应时间则需要6.04s,属于较慢速度。根据平均响应时间的变化规律来看,数据处理时间与响应时间的变化规律不符合,而容器创建时间与响应时间的变化规律基本一致。由此可得,容器创建时间是导致系统响应时间增加的关键因素。创建容器的数量越多,则占用的系统资源响应增加,物理机的负荷加大,进而导致响应时间延长。为了验证这一结论,在物理机上编写脚本进行测试,脚本如下:
如上,使用脚本创建容器用时2 分19 秒,减去等待时间,则每个容器创建的平均用时为2.25s。由此验证了上述结论,即容器数量增加会导致相应速度变慢。针对此类情况,可以选择创建虚拟机的方式,将多余的容器创建请求分担到虚拟机上,这样就能够减轻物理机上的并发数,从而达到提高响应速度的目的。
为了更好地满足用户需求,同时也是缩短开发周期,现阶段的软件开发越来越多的使用敏捷开发模式。该模式虽然为软件开发创造了便利,但是异构环境下服务器部署和运维的工作量明显增加。基于容器的DevOps 云平台,实现了项目开发、运维管理、环境部署的一体化,为软件的在线开发创造了更好的环境。从系统功能上来看,该系统除了支持在线开发外,还能够实现镜像管理、进度调控等一系列功能。并且通过系统测试,证明了DevOps 云平台的在线开发具有较强的可靠性,网页响应具有及时性,具有推广应用价值。