摘 要
云计算基础设施的快速普及,使得软件架构也发生了重大变化,微服务架构已成为近年来实现云化软件架构的事实标准。在提高了架构灵活性和扩展性的同时,微服务架构也给软件交付带来了挑战:开发团队、应用数量的增多带来了软件交付过程中沟通成本和流程成本的剧增;部署环境的多样化和配置的个性化带来了应用的不可控性,提高了部署失败的风险;使用传统的虚拟机部署导致成本高昂,扩展性差。以上一些问题已严重制约了业务发展。
为了解决以上问题,本文设计并实现了一套微服务应用交付系统,系统具有快速集成应用代码,发布至云平台,并通过 UI 界面实现一键部署等功能。本文根据企业内部软件发布现状进行了需求分析,采用 Docker 容器承载微服务应用,采用Kubernetes 提供容器编排接口。根据需求对系统各模块功能进行了设计和实现,包括持续集成、PaaS 部署、应用管理等模块。最后对系统进行了测试和测试结果分析,验证了系统的功能指标和性能指标达到了设计目的,证明了系统的可用性。
本文研究的系统解决了目前软件交付流程缓慢、交付版本质量差的问题,版本发布周期从以前的以天为单位减少为以小时为单位,并且部署过程安全、可控。同时,系统也极大的简化了云平台的运维操作,增强了微服务架构的服务治理能力,推动了软件团队的 DevOps 改造。
关键词:云计算 微服务 应用交付 容器
ABSTRACT
With the rapid spread of cloud computing, software architecture has also undergone major changes, and microservice architecture has become the de facto standard in implementing cloud computing software architecture in recent years. While increasing the flexibility and scalability of the architecture, microservices also pose a challenge to software delivery: the increase in the number of development teams and applications has led to a dramatic increase in communication costs and process costs in the software delivery process; The personalization of configuration and configuration brings uncontrollable application and increases the risk of deployment failure; traditional virtual machine architecture has high cost and poor scalability. Some of the above problems have seriously restricted business development.
In order to solve the above problems, this paper designs and implements a microservice-based application delivery management system. The system can quickly integrate application code to the PaaS cloud platform, and realize one-click deployment through the UI interface. This paper analyzes the requirements according to the status quo of the internal software release of the enterprise, uses the Docker container to carry the micro-service application, and uses Kubernetes to provide the container orchestration interface. According to the requirements, the functions of each module of the system are designed and implemented, including continuous integration, PaaS deployment, application delivery and other functions. Finally, the system is tested and the test results are analyzed. It shows that the system's functional indicators and performance indicators have reached the design goal and verified the system's usability.
The system studied in this paper solves the problem that the current software delivery process is slow and the delivery version quality is poor. The version release period is reduced from the previous day to the hour, and the deployment process is safe and controllable. At the same time, the system also greatly simplified the operation and maintenance of the cloud platform, enhanced the service management capabilities of the micro-service architecture, and promoted the DevOps transformation of the software team.
Key words:Cloud computing Microservice Application delivery Container
目 录
1绪论
1.1研究背景与意义
云计算和云产品服务的发展,使得软件的架构和开发模式发生了重大变化。近几年来,越来越多的企业IT系统在逐步的地向基于计算基础设施的IT系统演变,与此同时软件产品的运行环境已经发生了深刻变化,软件本身的架构设计与实现也向云化和微服务化转型[1].云化软件是为了支撑基于云计算基础设施的服务化开发、构建和部署而生的一类软件的统称,它具备面向服务、弹性伸缩、灵活扩展等特点,要求使用滚动升级和灰度发布,并大量采用DevOps模式来开发[2].微服务架构是近年来业界在实践云化软件架构中总结出来的一种架构模式,它提倡将单一应用程序划分成一组小的服务,每个服务以单一进程或一组相关进程的形式存在,服务之间通过HTTP等轻量级协议进行通信。微服务的构建一般基于具体的、可拆分的业务需求,能够独立部署、测试和上线。由于微服务架构分布式发布的特性,传统IT软件的部署运行环境已不再适应,本文采用Docker容器技术来解决这个问题。Docker是一种轻量级虚拟化技术,它将应用和依赖的框架中间件等运行环境都打包到镜像中[3],用户应用进程在Docker容器中运行,不再依赖宿主机提供开发语言等计算机环境的支持。
Docker技术也带动了云计算PaaS平台的发展,软件向PaaS平台交付的形式从代码变为的Docker镜像,实现了应用和运行平台的解耦,不仅给开发应用带来了便利,PaaS也无须再准备各种语言技术栈的环境和处理复杂的打包过程。之前通用的软件设计模式使用单体式架构,应用程序的开发、测试、打包和部署阶段作为一个整体而存在。微服务将应用分为了自治的小应用,每个服务被独立的开发、测试和部署,提高了应用的灵活性、扩展性和高可用性[4].然而,软件的微服务化和容器化也给应用的持续交付带来了挑战,大量的微服务在部署和运行过程中,需要PaaS平台提供完整的服务治理功能,包含服务的构建、发布、升级、删除等另一方面,微服务开发会涉及多个团队,多种职能部门的共同合作:多个开发团队为了共同的需求开发各自的应用,开发完成后提交测试,测试通过后需向运维团队提交上线需求,运维团队审核需求和大量服务的测试结果生成发布版本,最后再向生产环境发布。无论哪一个环境延期都会导致最后的发布延期,使得应用无法按时交付,导致公司蒙受损失。此外,大量的环境差异和配置差异也会加剧软件交付质量的不确定性。软件发布应该是一个快速且可重复的过程,只有通过快速的集成、测试和发布,减少发布版本之间的差异,才能快速发现和修复错误,降低版本发布前夕的风险。本课题源自着者实习期间所在项目组所面临的实际需求和实际项目,为解决应用软件在微服务架构下交付效率低下,故障率高,运维繁重等问题,设计并实现一套面向微服务的应用交付系统。
1.2国内外研究概况
亚马逊于2006年推出了自己的弹性计算云服务[5],为企业和个人客户提供虚拟机计算资源。随后,微软、谷歌等公司也推出了自己的云计算基础设施解决方案。2010年7月,NASA和英特尔、戴尔等厂商共同宣布开放OpenStack项目源代码,这是一个基础设施即服务(IaaS),让任何人都可以自行创建和提供云计算服务[6].CloudFoundry发布的用于应用托管的PaaS项目[7],开启了以开源PaaS为核心构建平台层服务能力的变革,随后Docker公司的前身dotCloud公司开源了着名的容器项目Docker,它在CloudFoundry的基础上创造性的通过容器镜像的方式实现了应用的打包和发布方式,解决了应用环境管理的痛点。Docker发布正式开源版本后,容器技术成为云计算领域的一个新的热点,CoreOS公司随后也推出了自己的容器技术Rocket[8].在容器编排领域,Orchard在Fig项目中首次提出容器编排(ContainerOrchestration)的概念[9],在容器资源管理调度和应用编排领域,形成了最主要的三种生态:Google的Kubernetes、Apache基金会的Mesos和Docker的Swarm.Kubernetes源自Google内部的集群管理系统Borg的开源版本[10],2014年6月Kubernetes正式开源,它涵盖容器集群资源管理调度,以及不同类型应用的应用管理组件,比如服务发现、负载均衡、灰度发布等。Mesos生态主要由Mesosphere、Twitter等公司推动,其中包括应用管理框架Marathon和Chronos[11],前者用来管理web等长期运行任务后者用于管理批量任务,由于早先在大数据集群领域的深耕,Mesos能很好的支持超大规模集群的大数据项目。
Docker公司希望自己的容器生态向上生长,推出了Swarm容器资源调度管理组件,并收购Fig推出了Compose应用编排组件。此外,OpenStack社区也推出了用于部署和管理容器集群的项目,可通过Magnum来部署和管理Kubernetes、Swarm、Mesos集群[12].这其中,最为主流的便是Kubernetes生态,除了Kubernetes项目本身,还包含了容器监控项目Prometheus[13],以及Fluentd、OpenTracing、CNI等一系列容器生态的工具和项目。以Kubernetes为代表的面向DevOps敏捷开发的开源应用和部署开发工具链与平台,具备分部署水平扩展能力的开源数据库和中间件,如MySQL/PostgreSQL/MangoDB、RabbitMQ/Kafka消息队列、Redis缓存,以及业界流行的SpringforJava、RubyonRails、Sinatra等,均获得快速发展。在持续集成领域,1999年KentBeck在《极限编程》一书中提出经常对代码库进行集成的好处,由此形成了持续集成的雏形[14].2006年,JezHumble、ChrisRead和DanNorth阐述了部署流水线对于软件交付的意义[15].2009年,Flickr公司的工程师提出了DevOps的概念:Dev和Ops的矛盾可以通过技术升级和文化构建来解决[16].DevOps中包括了一组技术:运维自动化、持续交付、高频部署、Docker内容,并提出了"基础设施即代码"这个问题。这期间,有一系列开源或商业持续集成工具涌现而出:CruiseControl、Jenkins、Hudson、ThoughWorksGo等[17].其中最为流行的属开源持续集成平台Jenkins[18],他拥有简明的UI、丰富的可扩展插件和庞大的社区环境,可以满足用户持续构建的绝大多数需求。
总体来看,我国云计算起步较晚,市场规模偏小。IaaS目前仍然是国内占比最大、增长最快的云计算领域[19],其中,以阿里云、腾讯云以及华为云为代表的厂商开始不断扩展海外市场,与亚马逊AWS,微软等国际巨头正面竞争[21].PaaS相关的研究和产品还普遍偏少,但随着Docker等容器技术的火热,各厂商已经开始以Docker和Kubernetes为基础来开发自己的容器云和PaaS服务[22].阿里云发布了围绕运用和微服务的企业级分布式应用平台EDAS;华为云也于2018年发布了FusionStage平台,它是一个专注于金融、政务和电信等行业的PaaS平台。尽管如此,国内PaaS平台的相关研究仍处在起步阶段,市场份额占比也较为有限。面向微服务的DevOps推动了运维和研发组织的变革,传统的基于瀑布模式的开发组织形态,通过将架构、设计、开发、测试等专业化分组来组件团队[23];而微服务演变成为一个功能完整的自治型团队。与此同时,云计算的变革也正朝着从面向基础设施和资源的开发运维到面向容器化应用的开发运维而演变。
1.3论文的主要研究内容
本文根据着者实习期间所在公司的实际项目完成,公司主要为政府客户的数字化转型提供私有云解决方案。公司为满足云化软件的要求,使用微服务架构作为公司内软件开发的主要架构。通过对业界主流虚拟化方案的调研,发现Docker能屏蔽本地主机和云端环境的差异,实现应用的快速打包和发布,是容器云PaaS架构的不二之选。Kubernetes在Docker容器的基础上实现调度编排,并提供了丰富的接口。基于以上调研,本文提出一种基于Docker容器引擎和Kubernetes容器编排技术,面向微服务架构的应用交付解决方案。本文首先对云计算和容器等相关技术进行了深入的学习、论证和选型,确定了应用服务所采用的底层架构方案。在此基础上,设计并实现了微服务应用的持续集成方案,该方案通过对源代码的分支管理和版本管理,在经过编译和静态检查等步骤后产出符合上线要求的软件交付件,进而制作出Docker镜像。其次,本文设计并实现了一套基于Docker容器化应用的部署交付系统,通过该系统,用户可以自行搭建PaaS环境,并以此为底层环境,实现微服务应用的自动化部署、滚动升级、自动化卸载、自动化回滚以及应用自恢复等操作。最后,对整个系统进行了测试和测试结果分析,验证了系统达到了需求分析时的功能指标和性能指标。本系统的核心在于能快速的将应用源代码交付成应用程序。主要是将应用制作为应用镜像,并提交至PaaS平台进行快速部署,通过全套的自动化交付流程让微服务架构模式真正落实到软件的生产流程中,并获得软件研发效率和质量的收益。系统拥有简明的UI和简单的操作方法,大大简化了应用发布的流程。
论文共分为六个章节,各章节的主要内容安排如下:第一章是绪论。本章首先说明了微服务和云计算背景下应用交付系统的研究意义,接着介绍了国内外在云计算、容器云、容器编排、持续集成等领域的研究现状。最后针对研究背景与面临的问题,提出了一种解决软件交付效率的系统化解决方案。第二章是需求分析。本章首先分析了目前企业内部版本交付和应用部署的现状和碰到的问题;然后根据前述的设计目标分别对系统的持续集成模块和应用管理模块做了详细的需求分析;接着对系统在安全性、易用性等方面的非功能性需求提出了设计要求;最后介绍了系统用到的核心理论和关键技术。第三章是系统设计方案。首先根据需求分析,对系统的软件层次架构进行了设计,确定了三层逻辑结构。然后并介绍了系统组成元素和系统功能模块的划分。接着对系统的功能模块进行了详细设计,分别阐释了各个模块的功能和设计要点,并对数据库表进行可设计。第四章是系统实现。本章首先对开发环进行了选型和确立,然后对基于Jenkins的持续集成系统的搭建,配置,管理进行了详细阐述,对自动化部署模块各个工作流的工作流程和实现方式进行了详细说明。第五章是系统测试。本章完成对系统主要功能模块的测试以及对测试结果的展示和分析,并论证系统是否达到设计目标。第六章是终结与展望。本章对研究成果进行了展望,同时也提出了论文当前的不足之处。
【由于本篇文章为硕士论文,如需全文请点击底部下载全文链接】
2 应用交付系统的需求分析
2.1 问题与现状分析
2.2 应用交付系统功能需求分析
2.3 非功能性需求分析
2.4 系统关键技术基础
3 应用交付系统的设计
3.1 应用交付系统总体设计
3.2 系统各功能模块设计
3.3 数据库设计
3.4 本章小结
4 应用交付系统实现
4.1 开发环境
4.2 系统各功能模块实现
4.3 数据库软件的实现
4.4 本章小结
5 应用交付系统测试
5.1 测试工具和环境
5.2 功能测试
5.3 性能测试
5.4 测试结果分析
5.5 本章小结
6 总结与展望
6.1 全文总结
本文的主要工作内容如下:
(1)分析了交付系统的研究背景和意义,调研了云计算、容器云以及持续集成等领域的国内外发展现状;
(2)根据项目发布现状进行了需求分析,对系统进行了技术选型,介绍了系统所采用的关键技术;(3)针对需求分析,设计了微服务应用交付系统的软件层次架构以及功能模块;
(4)以系统需求分析为基础,对持续集成、PaaS 部署、应用管理等功能模块进行了功能逻辑的代码编写和系统实现;
(5)最后对整个系统进行了联调,并在功能指标和性能指标两方面对系统进行了详尽的测试,证明了系统达到了设计目标,且具备了为生产环境提供服务的条件。本文针对企业内部实现微服务化转型时应用发布低效,团队沟通成本高等现状,结合持续集成和微服务应用发布的特点,设计并实现了面向微服务的应用交付系统。该系统以业界流行的容器云作为底层架构,采用 Kubernetes 作为 PaaS 平台的服务调度机制,Jenkins 提供持续集成调度能力,实现了从应用源代码到线上项目的整个应 用生命周期的集成和管理。
系统主要分为持续集成、PaaS 部署和应用管理三大模块,持续集成模块实现应用的源码版本管理、编译打包、静态扫描以及镜像制作等过程,PaaS 部署模块实现虚拟化基础环境的部署,应用管理模块为微服务应用提供部署、升级、回滚、卸载以及自恢复等功能。
本文实现的系统提升了微服务的治理能力,降低了运维成本,使得快速高效发布应用成为可能。微服务架构下的软件运维模式和传统数据中心高度精细化的人工干预模式不同,前者在管理的应用对象、规模和复杂度上呈指数级增长。本文所研究的系统面对以上挑战,较好的完成了应用交付自动化的任务,将运维管理人员从传统数据中心的烦琐低效、保姆式的管理监控中解放出来,转变为自动化地,非人工操作的模式,使得应用交付的效率有了极大的提高。
6.2 存在不足
由于开发时间有限、对系统架构和业界需求的理解不足等因素,本文研究的系统还存在诸多的不足,主要表现在以下几个方面:
(1)系统功能还较为薄弱,主要体现在缺少日志审计、集群监控和运维能力等方面。要进一步提升系统的微服务治理能力,运维和监控仍是非常重要的环节。
(2)系统整体化不强,外部依赖较多。系统目前的持续集成能力仍然依赖单独的持续集成服务器。此外,镜像管理仍然依赖 Docker registry 提供的管理页面,后期会将这些功能都集成到系统自身的 web 管理页面上,使得系统更加一体化。
(3)系统页面缺乏引导和说明,交互逻辑较为复杂,一定程度上提升了用户的使用门槛。
6.3 展望
本文研究的微服务应用交付系统,增强了微服务治理能力,降低了运维成本,提升了软件工程生产力,但是仍然存在很大的提升空间。后期的工作主要会在以下几个方面做出优化和改进:
(1)完善和改进系统功能。一是持续集成功能目前仍采用单独的系统,后续功能会将该模块直接集成到系统中来,和镜像仓库一道组成交付中心,用户可在系统上直接集成代码,管理镜像,甚至浏览 DockerHub 公有仓库。二是增加面向服务集群的管理功能,使得添加、删除和管理物理节点更加方便。
(2)提升应用发布的灵活性和可控性。生产网应用管理可能会随着业务需求和环境的变化而朝着复杂化的方向发展。系统也会朝着加强环境管理和应用管理的细粒度化和精细化的方向发展:针对测试需求,支持更复杂的环境配置和业务配置,支持灰度测试、A/B 测试、金丝雀测试等功能;针对发布和线上需求,支持应用根据地域和流量等因素进行灰度发布,灰度升级等操作。
(3)对系统的易用性方面做出改善。页面加强引导和说明,简化交互逻辑,对用户遗漏和缺失的步骤能直接引导补全;其次,提升前端页面的视觉展示效果,比如在用户新建、删除资源的同时会有相应的动画提示,加强用户的心理暗示和使用舒适度。
(4)提升系统的运维能力。目前系统在监控和日志方面有所不足,将来会将工作重点放在集群监控,日志采集上面,并对常见运维故障提供相应的运维手段。另外,考虑到系统对接的分布式集群越来越大,后期将会提升系统在运维方面的故障溯源和故障定位能力,加强集群对整个系统逻辑拓扑的掌控和了解。
致 谢
参考文献
【由于硕士论文篇幅较长,此页面不展示全文,如需全文,请点击下方下载全文链接】