李长亮, 汤志福
(中远海运科技股份有限公司,上海 200135)
随着2020年1月1日全国高速公路取消省界收费站,司乘用户和高速公路从业人员对现有收费系统数据传输的及时性和准确性有了更高的要求,各地区收费业务相关系统应用程序的升级频率逐步加快。以宁夏回族自治区高速公路收费站为例,其站级应用程序在2020年5月上旬平均每天升级1次,全区共有81个收费站,每次升级都需要3个运维人员花费1 h时间才能完成,不仅运维效率低、运维成本高,而且较易出错。目前软件行业内的应用程序远程自动部署技术已较为成熟,在很多互联网公司都得到了实践应用,取得了很多成果。例如,以容器技术为核心的容器(即服务平台)在各保险、证券和股份制银行信用卡中心等金融机构中的微信银行等关键系统中得到了成功应用,满足高并发场景的业务需求,取得了较好的应用效果。
本文主要研究高速公路收费系统基于CentOS的应用程序远程自动部署及其实践应用,为后续的应用程序自动化运维和自动化监控提供参考。
1)Tomcat:Tomcat 服务器是一个开源的Web 应用服务器,属于轻量级应用服务器,普遍应用于中小型系统中和并发访问用户不是很多的场合。
2)Jenkins:Jenkins是一个开源的可扩展的持续集成、交付和部署(软件/代码的编译、打包、部署)的基于Web界面的平台。对于允许持续集成和持续交付的项目而言,无论采用何种平台,都能处理任意类型程序的构建或持续集成。
3)SSH(Secure Shell):SSH是由IETF的网络小组制定的建立在应用层基础上的安全协议。SSH较为可靠,专门用来为远程登录会话和其他网络服务提供安全性协议。利用 SSH 协议可有效防止在远程管理过程中发生信息泄露问题。SSH最初是UNIX系统上的一个程序,后来迅速扩展到了其他操作平台中。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台,几乎所有的UNIX平台(包括CentOS)都可运行SSH。
4)Docker:Docker 是一个开源的应用容器引擎,既能让开发者打包其应用和依赖包到一个可移植的容器中,并发布到所有流行的 Linux 机器上,又可实现虚拟化。容器完全采用沙箱机制,相互之间没有任何接口,性能开销极低。
5)Docker镜像(Images):Docker 镜像可看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源和配置等文件以外,还包含一些为运行准备的配置参数(如匿名卷、环境变量和用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像是 Docker 运行容器的前提。
6)Docker容器(Container):Docker容器类似于一个文件夹,包含某个应用程序运行所需的所有内容,可对容器进行启动、停止、迁移和删除等操作。每个Docker容器都是独立、隔离和安全的应用平台。Docker容器通过镜像创建,换言之,容器是镜像运行起来的一个实例。
7)Docker仓库(Registry):Docker仓库是用来集中存放Docker镜像的模块。
对于应用程序远程自动部署而言,需解决的核心问题有2个,分别是远程操作和自动部署。
1)远程操作是指远程操作机器内的应用程序:
(1)若应用程序是Java语言开发的,则可在机器内采用Tomcat应用服务器部署该应用程序。Tomcat提供远程管理功能,可对部署在该应用服务器内的应用程序进行远程部署、卸载、停止和启动等操作。因此,可借助Tomcat的远程管理功能实现远程操作机器内的Java应用程序。
(2)若应用程序不是Java语言开发的,可借助CentOS系统内的SSH协议实现远程操作机器内的应用程序。
2)自动部署是指在不人为干预的情况下完成对应用程序的部署。这些部署工作可手动完成,但很耗时。采用自动部署的方式既能显著提高生产力,又能改进软件的整体质量。在整个生命周期内(包括部署在内)都使用好的工具,既能将人的干预最小化,又能节省时间。一旦去除人的干预,软件的质量就会变得更加容易预测。开源的Jenkins成功实现了自动部署功能,已在很多领域得到应用,取得了很好的效果。本文即采用Jenkins实现应用程序远程自动部署。
应用程序远程自动部署系统架构见图1,主要由自动部署模块和应用程序2部分组成,其中自动部署模块包含单任务远程自动部署组件、任务执行监测组件、批量任务执行组件和持续集成组件等。
图1 应用程序远程自动部署系统架构
1)单任务远程自动部署组件:提供在单个远程服务器上自动部署应用程序的功能。
2)任务执行监测组件:能自动、实时监测单个任务的执行过程和结果,使运维人员能及时跟踪处理,并为后续的自动运维和自动监控提供技术支撑。
3)批量任务执行组件:可同时触发大批量任务,并依次执行各任务。
4)持续集成组件:当应用程序有新版本时,新版本可持续集成和自动部署。
控制流程见图2,相关说明如下:
图2 控制流程
1)省中心服务器集群包括自动部署服务器和Docker仓库服务器。自动部署服务器安装Jenkins和相关插件,同时包含Docker,以方便生成新的Docker镜像;Docker仓库服务器主要用来存储所有的Docker镜像。
2)省中心服务器集群和收费站站级服务器均在同一个网络内,方便进行通信交互。
3)自动部署服务器发起远程自动部署任务指令,根据每个任务指令的实际配置情况下发Java应用程序的执行文件。Docker镜像从Docker仓库服务器上拉取。
当采用Java语言开发应用程序时,必须在生产环境中将该程序部署到Web应用服务器中。目前Tomcat是应用较广泛的Web应用服务器,该方案主要依赖Tomcat的远程管理功能。同时,利用Jenkins实现单任务远程部署和持续集成功能。
Tomcat的远程管理功能默认是关闭的,开启时需在Tomcat内新增部署用户和添加名为“manager-script”的角色,同时允许该用户拥有该角色和远程访问Manager站点。配置完成之后重启Tomcat即可。
单个任务的构建流程见图3(采用Jenkins的“Deploy to container Plugin”插件)。
图3 单个任务的构建流程
单个任务构建之后的操作界面见图4,其中:WAR/EAR files是待部署应用程序执行文件的名字;Credentials是第一步配置的远程服务中Tomcat远程管理的账户和密码。
图4 单个任务构建之后的操作界面
Jenkins中的任务可人工单个触发,当任务很多时,若能批量触发任务,则能极大地降低错误发生的概率,并提高工作效率。
批量执行Jenkins中的任务:获取当前Jenkins登录用户的Token,在每个任务配置页面的“构建触发器”模块勾选“触发远程构建”,在身份验证令牌中输入该用户的Token。这样就可在Jenkins服务器内执行指定格式的Url指令,触发单个任务的执行。换言之,批量执行这些Url指令即可批量触发对应任务的执行。
利用Tomcat的远程管理功能远程部署应用程序有很大的局限性,主要体现在只能处理部署在该Tomcat应用服务器内的应用程序,对于采用其他语言开发的应用程序,需采用其他更通用的方式。
可将应用程序及其依赖包打包到一个Docker容器内,通过部署该Docker镜像达到部署应用程序的目的。同时,采用Jenkins提供单个任务的远程部署功能和新版本的持续集成功能。
应用程序开发测试完成之后,可直接采用Docker命令生成Docker镜像。同时,可将相关命令封装在批处理脚本内,自动生成Docker镜像(在编译生成Docker镜像之前,需先编写Dockerfile,再调用Docker build命令生成镜像)。
镜像生成之后,需将镜像推送到私有仓库内,以方便远程机器按需下载使用。Harbor是构建企业级私有Docker镜像仓库的开源解决方案,提供友好的Web UI界面、角色和用户权限管理及用户操作审计等功能。Harbor支持离线安装,通过离线安装包即可完成安装。配置好可访问的IP地址,启动Harbor之后即可对外提供服务。
采用Docker tag命令重命名镜像(增加版本号信息以区分版本);采用Docker push命令将镜像通过网络推送至Harbor仓库内。
在构建新任务时,首先配置远程服务器的SSH site,然后在“构建”内选择“增加构建步骤”,选择“Execute Shell Script on remote host using SSH”编写要执行的Shell脚本,具体Shell脚本执行流程见图5。
图5 Shell脚本执行流程
批量执行Jenkins内的任务:首先,获取当前Jenkins登录用户的Token,在每个任务配置页面触发远程构建模块,设置该用户的Token;随后,在Jenkins服务器内批量执行指定格式的Url指令,触发批量任务的执行(该处理方式与第2.3节中的处理方式一致)。
基于CentOS的Java程序自动部署方案已在宁夏路网与监测应急处置中心(以下简称“宁夏路网中心”)部署实施,该方案负责更新宁夏全省高速公路收费站的站级程序,包含部站客户端和部站服务端。部署方案任务截图见图6。
图6 宁夏路网中心基于CentOS的Java程序自动部署方案任务截图
宁夏路网中心采用一台CentOS服务器作为自动部署服务器,当每次Java应用程序测试完成且可部署时,运维人员将程序可执行文件(WAR包)拷贝至该服务器的固定目录内,执行分发脚本,分发WAR包到84个任务目录内。
实施该方案之前,全省84个收费站单个应用程序的更新部署任务需要3个运维人员花费1 h时间才能完成。实施该方案之后,此项任务仅需1个运维人员花费0.5 h时间就可完成,且只需盯着任务执行结果即可(若任务执行失败,再执行一次即可),部署效率提高了6倍。若同时更新部站客户端和部站服务端,实施该方案之前合计需要6 h,实施该方案之后合计仅需0.75 h(Jenkins可并行执行多项任务,但因自动部署服务器性能的原因,同时执行的任务数量有限制),部署效率提高了8倍,极大地提高了运维效率,降低了运维成本和出错的概率。
本文主要对高速公路行业内的应用程序远程自动部署方案进行了研究,以期达到降本增效、有效促进和提升高速公路行业设备运维水平的目的。实践结果表明,该方案适用于高速公路领域需远程部署应用程序的场景和系统中。
在应用程序部署完成之后,还需对应用程序进行自动监控、自动维护等管理,这是未来重点研究和实践的方向。