南山行者
作者南山行者2019-11-13 17:25
系统工程师, 某银行

云应用管理平台技术研究

字数 7034阅读 2103评论 0赞 3

1 引言

我司在2015年建设了以微服务架构为核心理念的云计算平台SCAP,随着业务与技术的发展,SCAP所承载的应用和服务的数量将逐渐增长。而研发和运维过程中存在的不足逐渐制约了SCAP平台发展壮大。
首先,在开发过程中,开发人员的本机环境缺少能直接模拟生产的可调试环境。其次,在测试过程中,多个项目同时开发与测试,造成测试环境不稳定;全网测试时,需要准备可测试环境,准备与恢复阶段的工作量大。再次,在上线过程中,目前自动化上线不足,仍存在手工上线操作;上线后仍需人工来确保上线的准确性,验证部署是否成功;上线时间仍以分钟计,项目数量增多而造成上线时间长,上线人员投入大量时间用于部署应用。最后,应用之间的隔离性不强,假设某一应用对资源占用过多,易使得应用服务器可用性下降,将造成整个应用服务器中全部应用无法正常运行。
现有的应用管理方式较为粗放,既没有统一的应用管理系统或配置管理系统,也缺乏应用持续部署能力。因此,有必要建立统一的云平台应用管理体系,形成应用持续部署能力,实现开发、测试和发布一体化,进一步提升开发效率、上线效率,提升研发能力。

2 容器技术及其应用现

目前在主流的分布式应用的持续部署能力建设中,已经采用容器技术,它用于将应用及应用所运行的环境(服务器、中间件、操作系统等)打包,并可在开发、测试、生产等多个环境中无差别部署运行,既能解决持续集成、版本控制,又可以实现快速部署、应用隔离,还能实现资源合理利用。
容器是一种可在资源隔离的过程中,运行应用程序及其依赖程序的操作系统级别虚拟化技术。不同于虚拟机,它是一种轻量级技术,它将应用程序运行时所需要的组件打包为单个、可重复使用的镜像文件,将该镜像文件运行在独立的环境中,在内存、CPU、磁盘、网络等方面实现了与其他应用的隔离。
容器虚拟化与传统虚拟机存在本质的不同。容器虚拟化是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统;而传统虚拟机则在硬件层面上实现。容器虚拟化具有如下优点:1)更快速的交付和部署,可以实现一处创建,处处使用;2)更高效的虚拟化,属于内核级虚拟化,不需要额外的虚拟机管理器,性能和效率更高,启动时间为秒级;3)更轻松的迁移和扩展,容器几乎可以在任意平台上运行,这种兼容性可以满足用户平台迁移和扩展的需求;4)更简单的管理,容器中所有修改都是增量方式进行分发和更新,能够实现自动化的管理。

2.1 关键技术

2.1.1 容器虚拟化技术

目前典型的容器虚拟化技术有Docker、rocket、Pouch,均支持OCI标准,即有标准化的容器创建、启动工具,以及容器的运行时和镜像标准。
Docker是一个跨平台、可移植并且简单易用的容器解决方案,是以Docker容器为资源分割和调度的基本单位,封装了整个软件运行时环境,用于构建、发布和运行分布式应用的平台。Docker可在容器内部快速自动化地部署应用,并通过操作系统内核技术(namespaces、cgroups等)为容器提供资源隔离与安全保障。
Docker版本更新策略是按季度发布稳定版本,目前已经分为CE版本和EE版本,前者面向开源社区,后者面向企业应用(收费)。当前较为常用的开源版本是V1.9版本,为2017年发布,并在多数互联网公司得到应用,其缺陷在开源社区也有解决方案。
Rocket是一种与Docker类似的容器引擎,具有相同的基础框架。可通过rtk命令来运行应用容器,在安全性、可组合型方面较Docker而言有较大的改进。
Pouch是阿里巴巴推出的开源容器技术,其特点是轻量、快速高效、可移植性高、资源占用少等,是基于LXC研发的t4与Docker技术的结合。在2017年双十一期间,Pouch容器规模达到百万级,实现在线业务全部Pouch容器化。

2.1.2 镜像管理

容器技术的原动力之一就是在不同的机器上可以创造无差别的应用运行环境,镜像发布就能方便的实现“在某台机器上导出一个容器并且在另外一台机器上导入”,容器的迁移操作也可通过镜像分发的方式达成。原生的Docker容器将镜像存储在registry中,可支持线上和线下的镜像分发,但在大规模的分布式环境下其性能、可用性较差,因此有多种开源的镜像分发技术用于支持在分布式环境下的镜像分发。
腾讯研发了FID(Faster Image Distribution System for Docker)系统,向200个节点分发500M镜像文件速度是原生registry的10倍,部署更为方面。
阿里巴巴研发了并开源了镜像分发工具“蜻蜓”,该工具是基于P2P技术的通用文件分发系统,解决了大规模文件分发场景下耗时高、成功率低、带宽占用高等难题,其速度比Docker原生方式提升了57倍,数据源网络出口流量降低99.5%以上。
其他技术公司如VMware研发了Harbor系统,IBM也研发了Wharf架构。

2.1.3 容器管理

对容器实施有效管理是大规模应用Docker的另一个重要技术难点,包括如何批量创建、调度和管理容器。
Docker Compose机制是对容器对象进行配置和集群管理,编排容器对象如何在运行环境中快速部署,以及如何验证部署成功。Docker Swarm是支持Docker集群管理的工具,它将若干台Docker主机抽象成一个整体,可通过统一入口管理Docker主机上的资源。Swarm接收Docker客户端的请求,调度适合的节点运行容器。
除了上述Docker原生的管理工具外,容器管理工具或平台还有谷歌公司的Kubernetes分布式系统支撑平台、Apache的Mesos开源分布式资源管理框架以及能支持上述全部管理工具的Rancher。

2.2 应用现状

自2014年起,容器技术在国内得到普遍关注与广泛应用。阿里巴巴在2017年双十一期间利用自研的Pouch容器,部署了百万级规模的容器云,实现在线业务全部Pouch容器化。腾讯在其游戏云业务上广泛采用Docker容器技术,以支撑海量的实时游戏业务,并自研了Gaia平台用以管理和调度底层资源。新浪微博在其混合云的架构中采用Docker技术,利用弹性扩缩容的特点以应对春晚红包、突发事件等峰值流量情况。
在金融行业,容器技术也得到了广泛应用。上海证券交易所与数人云合作搭建了企业内部容器云,利用该容器云解决统一资源调度、标准化软件发布、集中监控与部署等问题。民生银行利用Docker 搭建了金融移动设备开放平台(MDOP),该平台为金融移动设备的应用开发提供应用分发、监控、数据采集、消息推送、认证中心等服务,支撑行内POS、PAD、MIT、VTM 等多个渠道设备的统一接入和管理。蚂蚁金服通过基于Docker 的CaaS 层来为上层提供计算存储网络资源,以提高资源的利用率与交付速度,并用来隔离底层IaaS 的不同。平安科技利用Docker研发了容器云Padis,并实现了Mesos+Marathon 框架,可以完成应用程序的快速创建、运行、快速缩容扩容。高盛公司拟计划将其90%的计算业务,近5000个应用迁移到Docker容器中。恒生电子利用Docker技术,并自研了部分配置管理工具,实现了金融交易系统配置、部署、运维自动化。

3 云应用管理平台研究

3.1 我司的痛点

自从SCAP云平台建成后,我司开放平台迎来了蓬勃发展。SCAP云平台作为分布式的微服务架构,属于PaaS层。它的研发推动了开放平台的发展,但在开发、测试、运维等多个环节存在诸多问题,逐渐成为制约研发运维能力与效率的瓶颈。
一是在开发过程中,开发人员缺乏能直接模拟生产的、独立的测试环境。在测试中经常与多个项目同时并发测试,而易造成测试环境不稳定,测试窗口期少。
二是在上线过程中,缺乏持续集成与部署的理念与实践,自动化上线与验证不足。自动化上线不足造成上线时间仍然偏长,开发测试环境的多次修改上线,占用了上线人员过多的工作量。部分环境不一致导致仍然需要手工修改配置,不仅风险大,而且繁琐耗时长。自动化验证不足导致上线后无法确认上线准确性,只能通过人工手段再次确认。
三是在系统运维过程中,由于应用运行在同一WEB或应用服务器中,应用之间的隔离性不强。应用并不是独享运行环境,而是与其他应用共享线程、数据库连接、内存、网络等多种资源。因此单个应用造成内存泄漏与溢出、线程耗尽、数据连接耗尽、网络带宽耗尽等异常,容易导致同一服务器中其他应用的可用性受到影响。

3.2 云应用管理平台的目标

为解决上述痛点,本文提出建立云应用管理平台。该平台将利用容器虚拟化技术,封装应用及应用的运行环境,以更粗粒度的方式对应用实施集中统一的管理,实现应用持续部署能力。
云应用管理平台的目标是要实现开发、测试、发布一体化。而目前主流的容器技术仍倾向于采用Docker,因此将以Docker容器作为开发、测试和发布的单元,将与应用相关的所有组件和环境进行封装,避免应用在不同环境迁移时带来的依赖性问题,确保应用在各个环境达到高度一致的效果。
在开发阶段,镜像的使用可以使构建开发环境变得简单和统一,可以利用Dockerfile将一切可代码化的进行自动化运行,能将应用分割成大量彼此松散耦合的Docker容器,应用的不同组件在不同的容器中同步开发,互不影响,为实现持续集成和持续交付提供先天的便利。
在测试阶段,可以直接使用开发所构建的镜像进行测试,直接免除了测试环境的构建,消除因为环境不一致而带来的各种问题。在部署和运维阶段,与以往的代码级别部署不同,可以利用Docker进行容器级别的部署,把应用及其依赖环境打包成跨平台、轻量级、可移植的容器来进行部署。

3.3 基于Docker容器技术的云应用管理平台

采用Docker容器后,单台SCAP服务器上应用部署架构将会发生变化,如下图所示:

在单个容器内既包含应用,又包含了相应的运行环境,容器作为单个进程运行在系统中。在实施云应用系统前,最基础的工作是应确定单个Docker容器中可运行的应用数量,如单个Docker只配置单个应用。
容器在非运行态时是以镜像的方式保存,因此需要建立统一管理的镜像中心 registry,该镜像中心存储由开发环境中所构建的镜像文件,并可在多个环境中部署运行,如下图所示:

由于现有的SCAP平台上线工具主要是对应用进行上线与部署,因此可将上线工具与构建过程相结合,将测试环境的上线定位为镜像的构建,并将应用的更新及应用运行环境都将加入到镜像中。

3.3.1 镜像的管理

Docker不仅支持从互联网Docker Hub(公共镜像仓库)中获取已构建的镜像,也支持自建私有镜像仓库registry。registry中可包含操作系统、应用服务器、中间件、数据库、应用、共享库等一系列的镜像文件,在运行时,可拉取到本地服务保存并运行,以构建容器。
因此可以建立统一的镜像中心,开发人员可自由构建、上传并拉取镜像文件。其他环境都可以从该镜像中心中拉取Docker镜像文件,并直接部署运行,其上线对象将从源码、配置、脚本、数据的上线包转换成Docker镜像文件,实现快速自动化发布。

3.3.2 编排与部署

由于Docker本身需要配置网络,配置内存限制、带宽限制等资源使用限制,且其包含的应用在部署时也需要指定依赖关系,因此需要对各应用制定编排规则,部署时执行编排的规则,以使得Docker能正常运行。因此可利用Docker原生的Compose工具编写SCAP应用的部署脚本,并在部署镜像时使用该脚本。

3.3.3 Docker容器管理

采用Docker容器后,单个SCAP服务器上将有多个Docker进程,而整个SCAP集群的Docker数量将会进一步增多。为有效管理Docker容器,拟采用原生的Swarm集群抽象管理工具,对多个Docker实施管理,如下图所示:

通过Swarm可实现对各个Docker的远程控制,还可以对宿主机资源实现分配和管理,调用Compose工具将容器部署到目标宿主机上。

3.3.4 网络管理

若当前宿主机(即SCAP服务器)运行一个容器,并在容器中运行当前SUSE操作系统及其全部的应用,则容器的网络可采用host模式,即容器和宿主机共用一个网络命名空间,直接使用宿主机的IP地址和端口。若宿主机上运行多个容器,则每个容器需要有虚拟的独立的IP地址和端口,则可以自定义容器的网络连接,可采用桥接的方式为每个容器映射用宿主机的端口进行映射。

3.3.5 Docker监控

在SCAP云平台上可能会运行几十甚至上百个容器,为有效监控运行的容器的状态,并在资源不足时发出警报,需要对Docker容器集群进行监控。Docker自身提供了API以获取容器运行的日志、事件信息以及指标数据,基于此可以采用如下开源的解决方案,构建包含Docker容器的集中监控平台,以对Docker实施监控。
一种方案是可以采用ELK,利用Docker提供的API获取日志及指标数据,并对其进行监控。另一种方案是采用基于谷歌的cAdvisor + Heapster方案,cAdvisor是谷歌开源的Docker监控工具,但只能监控单台主机,而Heapster则在cAdvisor提供的信息上对集群进行监控,但仅支持Kunbernetes。由于前期智能运维研究工作中,对ELK有较多的研究,并且结合智能运维项目,建议采用ELK方案,以Docker的API构建对容器的监控。

3.4 统一配置管理系统

由于开发、测试和生产环境中仍然存在不同的配置,因此仍然需要建立统一的配置管理系统,在部署时对应用的镜像文件进行更新,以适应不同的环境需求。
对现有的云计算平台上配置进行了调查研究,发现配置可分为中间件配置(如数据库配置)、框架级配置(如SCAP框架配置)、应用配置等。软件配置的形态包括配置文件、数据库表、系统环境变量、参数项等。而大部分的配置均与环境无关,一经上线后就无需修改。因此统一配置管理系统所管理的对象可限定在与环境相关的配置上。

3.4.1基于ZooKeeper的软件配置管理系统

基于ZooKeeper的软件配置管理系统,其架构如下图所示:

配置统一存放在数据库中,配置修改既可通过辅助上线工具完成,也可以通过EAI前台操作界面在线修改。在ZooKeeper集群中保存配置的路径,如下图所示:

当Docker容器部署时,将从ZooKeeper集群中获取配置路径,并获取配置值并加入到容器的运行环境中。而对非容器的应用,当配置发生变更时,ZooKeeper通知对该配置感兴趣的agent,并由agent从数据库中读取最新的配置信息。在获取配置后,agent不仅在更新内存中的值,也会去更新实际存放路径的配置值,甚至可完成对应用配置的热更新。

4 应用场景

引入Docker容器技术后,对开发、测试、部署等多个环节产生较大的影响,本节将力求在尊重历史的背景下,结合现有的技术架构,阐述基于Docker容器的主要应用场景。

4.1 应用场景一:开发

在开发阶段,Docker镜像的使用使得开发环境可以精确模拟生产环境的特性。开发人员更可在SCAP开发环境中自由部署运行多个容器,在容器中运行并测试所开发的应用,而不受其他项目组的影响。项目提交至测试时,将以镜像方式提交,镜像中不仅包含应用,还包含应用可运行的环境,如WAS、Jboss服务器、IHS中间件等。
在开发中可以实施一次构建、多次应用的模式,在开发环境中构建Docker镜像,并在测试、生产等多个环境中部署并运行该镜像,实现了部署的准确性。

4.2 应用场景二:集成

SCAP平台应用的上线对象将从包含源码、配置、脚本的上线包转换成Docker镜像文件,因此上线可实现完全的自动化,其效率将从分钟级提升至秒级。不仅实现了快速的应用部署,还能实现服务的快速扩缩容,可以在新的SCAP服务器上快速部署并运行Docker镜像。
由于部署的方便快捷,因此在自动化测试的基础上,可采用持续集成与部署的模式,在开发与测试环境每日自动构建、部署、运行SCAP应用,实现自动化的持续部署能力。

4.3 应用场景三:运维

单个Docker容器中不仅部署应用,还将部署web服务器、应用服务器等支持应用运行的环境,Docker容器之间的资源隔离可以保证应用运行环境的异常不会传递。因此,异常的定位与处理将不会影响其他SCAP应用的可用性。
对容器集群实施有效监控,还可以将监控与智能运维相结合,根据容器与应用的历史运行信息,预测容器性能,实现容器资源的智能扩缩容。

5 总结

本文面向分布式云计算平台SCAP,阐述了一种基于Docker容器技术的云应用管理平台,并为其设计了一种统一配置管理系统,以解决各个环境部分配置不一致的问题。该云应用管理平台将管理对象的颗粒度从代码级、组件级放大成镜像级,将与应用相关的所有组件和环境进行封装、管理,不仅消除因为环境不一致而带来的开发和运维风险,还能形成持续集成、持续部署能力,提高开发和运维效率。

本文选自 《交易技术前沿》总第三十五期文章(2019年6月)
转自微信公众号:上交所技术服务
陈林博 何支军 颜挺进 焦振海
中国证券登记结算有限责任公司上海分公司技术开发部

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

3

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广