张 琦
(上海浦东发展银行股份有限公司信息科技部 上海 200001)
目前行业内面向云计算CaaS(容器即服务)层的容器技术逐渐成熟,已经得到了较多金融机构的认可,并取得了较多成功案例。诸如各大保险、证券、股份制银行信用卡中心等金融机构也已完成将CaaS管理平台应用于微信银行等关键系统中,满足高并发场景(如限时抢购、权益秒杀等)的业务需求,并实现了较好的收益。
基于Docker的CaaS管理平台最大优势是用户可根据需要实现动态的扩容缩容,减少对资源预测的依赖,实现业务系统快速、弹性伸缩,提升资源使用效率,满足业务突发高峰时系统的处理能力要求。
为解决我行当前网上银行、企业客户信息整合系统(ECIF)、信用卡等应用系统在持续集成、持续交付,以及资源弹性伸缩需求方面所存在的诸多问题,并满足其支付系统的高事务处理能力(如10 000 TPS)的业务需求,在其开发测试环境和生产环境构建一套基于Docker的CaaS管理平台,在实现应用系统快速迭代和敏捷交付的同时,也提高运维的效率和降低运维成本。
本文以Docker容器技术为核心,围绕构建我行CaaS平台所涉及的技术和架构进行论述,所论及的范围包括容器、云计算、网络、微服务、存储、安全等方面,为后续的CaaS平台建设提供理论参考。
本文中所涉及的相关术语解释说明如表1所示。
表1 术语说明
CaaS平台的定位是:在生产环境中承担支撑容器化业务应用的发布和运行的云平台角色,并建设与之搭配的容器资源池,支持行内业务的部署发布、运维管理和弹性扩展,并能够和行内相关系统对接。在开发测试环境中,该CaaS平台是对现有开发测试云的能力补充,增加了容器资源池并扩展了其对DevOps的支持。
2.1.1 开发测试环境CaaS平台
开发测试环境CaaS平台架构如图1所示。
图1 开发测试环境CaaS平台架构
在开发测试环境中,CaaS平台使用“开发测试环境集中监控系统”和“开发测试环境应用集中监控系统”来分别实现平台宿主机的监控和应用状态监控。
CaaS平台的一些预制容器编排模版,比如DevOps、微服务组件模版,未来可以作为“开发测试环境云计算管理平台”之上可被申请的服务,通过对接CaaS平台的API接口,实现服务的自助申请和自动获取。
CaaS平台能压缩待投产应用镜像,并上传至“投产版本管理平台”,以供生产环境获取对应应用版本。
2.1.2 生产环境CaaS平台
生产环境CaaS平台架构如图2所示。
图2 生产环境CaaS平台架构
CaaS平台中的“平台管理”组件提供容器管理平台能力,在容器集群管理的基础上构建了应用管理、租户权限、镜像管理等功能。
CaaS平台的“容器监控”组件能够自动获取平台上容器的运行状态数据,以及提供应用状态的查询和展示能力,并能够在运行状态数据的基础上进行异常状态告警。
CaaS平台的“容器资源池”组件把主机资源汇总起来形成面向容器化应用的资源池,并参与应用容器的调度。
CaaS 平台及平台之上的应用均使用硬件负载均衡提供流量分发。同时CaaS平台会实时跟踪容器部署状态,并更新硬件负载均衡设备的分发配置。
CaaS 平台的用户授权认证需要接入行内的“统一身份和访问管理系统”进行统一用户认证和授权。
CaaS 平台的应用状态异常信息需要能够对接到行内的“集中监控系统系统”系统,并在“集中监控系统系统”之上进行统一告警管理。
CaaS 平台及平台之上的应用的日志均被“应用集中监控系统”收集汇总,并进行应用业务状态的监控。
CaaS 平台及平台之上的应用的日志均被“总分行交易质量分析系统”收集汇总,并进行分析。
CaaS平台能从“投产版本管理平台”获取应用镜像压缩包,并自动转化为镜像并导入CaaS平台镜像仓库,简化容器化应用在生产环境的发布过程。
CaaS平台在生产环境和开发测试云均保持相同的功能架构,如图3所示。
图3 CaaS平台应用功能架构
CaaS平台的功能架构由管理平台组件、插件模块、监控组件和容器资源池组成。管理平台为Docker容器平台核心组件,提供了面向应用平台管理的能力。插件模块通过管理平台的插件管理组件管理的一系列插件提供。监控组件包括监控数据的收集和管理,以及基于策略的告警管理。容器资源池则通过容器集群调度软件把各个容器引擎所在主机的能力组织为集群整体运行能力,通过容器资源池对外提供容器运行环境。
2.2.1 管理平台组件
1) 容器管理 提供完善的容器管理能力,包括:
• 展示容器信息,包括容器名称、容器所属应用、容器所在主机以及容器镜像等信息。
• 展示容器运行状态,包括运行中、已停止、已创建等。
• 展示容器日志、资源、进程等运行时数据。
• 进行容器管理操作,比如启动、停止等基本操作。
• 进行容器的部署和配置。
2) 主机管理 提供平台集群的主机管理能力,包括:
• 接入主机的流程管理。
• 集群的状态展示,包括资源使用情况和状态。
• 展示主机的运行状态以及其上运行的应用容器的情况。
• 和主机相关的存储和网络管理。
• 进行主机管理操作,比如打标签、更改运行状态等。
3) 镜像仓库 Docker镜像是一个只读的模板。例如:一个镜像可以包含一个完整的SUSE Linux操作系统环境,里面仅安装了Apache或用户需要的其他应用程序。
镜像可以用来创建 Docker容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他用户那里下载一个已经做好的镜像来使用。平台提供完善的镜像管理能力:
• 支持通过镜像空间来分组显示,并能够设置访问权限。
• 支持通过应用代码或者上传应用包构建镜像。
• 支持前面的镜像管理,包括版本、描述、访问权限、自动构建等。
4) 企业安全 通过认证授权、网络控制、密码管理、资源隔离等多个方面提供平台的安全性:
• 支持多租户模式,并且具有用户、团队与租户三层权限控制,可以实现租户应用的隔离和资源配额管理。
• 通过密钥管理访问开放 API 和持续发布的权限。
• 支持自定义密码安全策略,提供密码强度、密码有效时间和最大尝试次数的设置。
• 使用加密网络信道进行平台访问和节点间通信。
• 支持对接企业统一认证系统,如LDAP。
5) 应用管理 平台是以容器为交付标准件的企业级应用云平台。平台中的应用都是容器化的应用,由一个服务或多个服务构成。容器化应用运行在一个轻量的、安全的、可移植的隔离环境中,因此可以与其他有不同依赖和环境需求应用共同运行在同一个主机环境中,而无需担心互相冲突。平台的应用管理能力包括:
• 应用的发布管理,包括应用部署、版本更新、灰度发布等。
• 应用的配置管理,包括应用的资源限制、配置、负载均衡等。
• 应用的运维支撑,包括应用日志的归集和展示、监控等。
• 应用的网络管理,包括应用的网络模式、IP管理等。
6) 模版管理 应用模版通过预先定义的应用编排实现了应用服务的快速部署。除平台本身预制的应用模版外,用户也可以创建自定义的应用模版,并设置应用模版的访问权限。应用模版的能力包括:
• 应用模版的管理,包括模版的定义、分类、信息管理和维护。
• 应用模版的权限控制,支持指定模版对不同租户的访问权限。
• 应用模版的参数管理,支持定义模版参数并接入应用创建流程。
• 应用模版的导入,支持批量导入模版描述文件。
2.2.2 插件模块
1) 插件机制 CaaS平台插件功能是通过将与其他应用系统的接口封装成容器,即每一个插件都是一个功能完整且独立的 Docker 镜像。可通过微服务技术将扩展功能模块化,通过对应接口将“应用模块”注册到CaaS平台中。
插件需要实现一个Restful接口,和对应的管理平台UI界面。就可以作为“模块”安装到CaaS平台中,平台通过Restful接口,实现了插件的服务注册、服务调用,并提供了API Gateway,支持权限认证。插件可以通过任何编程语言开发,如Java、Python、PHP。插件还具备网络访问能力,可以通过插件对接外部系统。插件可以存储少量元信息在控制器中,如果需要大量的数据持久化,可以自行配置需要的数据库服务。
由于插件也是一个容器,所以管理操作都是通过操作容器进行。业务逻辑封装在插件内,管理平台控制器通过Restful接口进行调用。CaaS平台还需保证插件的高可用,一旦插件容器停止,CaaS平台会自动重启该插件。如果插件所在的服务器宕机,CaaS则会将插件迁移到合适的新服务器上去。
在CaaS平台中的每个模块均是通过 HTML 中 IFrame 的方式嵌入控制器页面中,并通过 HTTP 协议与服务端进行交互。每个模块都是一个独立的 Docker 镜像,并通过一定的接口向 CaaS中预先定义的几个扩展点中增加功能项,其架构如图4所示。
图4 插件机制架构
2) 插件管理 CaaS平台支持通过插件机制扩展平台功能,在不涉及修改平台代码的前提下,通过插件提供一致的平台操作体验,包括:
• 插件的列表和展示。
• 插件的安装、部署和管理,并能够体现插件的运行状态。
3) 自动扩展插件 CaaS平台的自动扩展插件能够根据策略动态调整应用容器实例数,包括:
• 自定义实例扩展策略。
• 自动监控应用容器的运行状态。
• 当状态符合扩展策略时自动触发实例伸缩。
4) 投产管理插件 投产管理插件通过对接“投产版本管理平台”,让开发测试环境的CaaS平台与生产环境的CaaS平台进行数据交换,实现测试环境的投产数据包能够自动的导入生产环境,并通过自动化的环境配置更新,降低人为修改配置的出错风险。其架构设计如图5所示。
图5 投产管理插件架构
• 平台能够导出指定的应用模版以及涉及到的镜像为投产数据包。
• 投产数据包通过“投产版本管理平台”接口上传到指定位置。
• 平台能够通过“投产版本管理平台”接口从指定位置导入投产数据包。
• 在导入模版和镜像的过程中自动更新相关的镜像信息。
5) 服务目录插件 平台的服务目录插件能够根据“云计算管理平台”的接口规范把CaaS平台的应用模版部署能力以服务的方式暴露出来,实现CaaS平台功能在“云计算管理平台”上的展示、申请和管理。架构设计如图6所示。
图6 服务目录插件架构
• 服务目录插件实现符合“开发测试环境云计算管理平台”规范的API,把CaaS平台功能暴露为“开发测试环境云计算管理平台”之上的服务。
• 插件通过调用CaaS平台API对服务进行展示、申请和管理。
6) 统一认证插件 UIAS是统一认证和访问管理系统,平台的授权认证需要统一通过它来实现。UIAS提供了基于SOAP和ESB的访问方式,支持实时和批量同步用户授权信息。UIAS对接模块主要包括两部分能力:
• 实现CaaS平台认证拦截器,把认证请求重定向到UIAS认证,并能够通过UIAS认证结果指导平台的认证行为。
• 能够从UIAS上同步用户的组织结构和权限,并能够映射UIAS的授权模型到平台的授权模型,从而通过UIAS进行统一权限管理。
• UIAS 权限信息同步采用实时和批量两种方式,定期通过批量方式获取权限,同时基于通知机制实时更新。
统一认证插件架构设计如图7所示。
图7 统一认证插件架构
7) 状态报告插件 CaaS平台提供一定周期内的关于应用运行状态的报告,帮助应用管理员更好地根据应用的状态数据对应用的运行环境和配置进行合理调优,实现数据驱动的业务运营。
CaaS平台通过运行报告模块,周期性收集应用容器的运行状态数据,包括CPU、内存、网络等方面,并基于这些数据生成应用运行状态报告,并通过邮件发送给指定的邮箱。
8) 告警对接插件 CaaS平台支持设置告警策略,通过实时监控应用容器的运行状况,当发现应用状态符合设置的告警条件时会触发告警,告警通知会接入现有的集中监控系统系统(OVO或Zabbix),进行统一的告警管理。
2.2.3 负载均衡
CaaS平台将采用LVS技术来实现平台的负载均衡,LVS(Linux Virtual Server),即Linux虚拟服务器,主要用于服务器集群的负载均衡,可以实现高性能,高可用的服务器集群技术。可将许多低性能的服务器组合在一起形成一个超级服务器。其配置较简单,且有多种负载均衡的方法。此外,其运行稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果,可扩展性也非常好。
LVS是四层负载均衡,即建立在OSI模型的第四层(传输层)之上,即LVS支持TCP/UDP的负载均衡。因为LVS是四层负载均衡,所以LVS相对于其他高层负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,其效率非常高。
LVS的转发主要通过修改IP地址(NAT模式,分为源地址修改SNAT和目标地址修改DNAT)、修改目标MAC(DR模式)来实现。其架构设计如图8所示。
图8 LVS架构设计
• 部署两个LVS服务并通过Keepalived 实现高可用。
• LVS 分发请求至CaaS平台的HAProxy 服务。
• CaaS平台的HAProxy服务能够根据容器的部署架构自动更新分发配置。
2.2.4 监控组件
监控组件提供集群、主机和容器运行状态数据的收集、分析和展示,并通过对接集中监控系统(OVO、Zabbix)提供告警支持。架构设计如图9所示。
图9 监控组件架构
1) 监控管理 提供CaaS平台上集群、主机和容器运行状态的数据收集、汇总分析以及信息展示,包括:
• 实时收集集群、主机和应用容器的运行状态信息。
• 能够提供可定制的监控数据仪表盘。
• 能够支持通过查询语言查询状态数据。
2) 告警管理 提供基于容器监控数据的告警能力,包括:
• 支持自定义灵活的告警策略,允许多个告警策略同时生效。
• 根据容器运行数据自动检测告警策略匹配程度。
• 当符合告警策略的情况发生时能根据预先设置好的规则发布告警。
• 通过API对接现有的集中监控系统。
2.2.5 容器资源池
1) 容器调度 通过Docker Swarmkit和Kubernetes集群管理技术对集群中的Docker主机资源进行统一管理和容器调度,包括:
• 集群中主机的接入管理、节点角色控制以及集群状态管理。
• 灵活的容器调度策略,充分利用集群资源。
• 容器的资源限额管理和控制。
• 能够在容器调度的同时匹配相关的网络和存储资源。
2) 容器引擎 使用Docker引擎提供单机环境下对容器的管理和操作,包括:
• 容器的启动、停止、日志、监控等操作支持。
• 对主机的存储、网络等资源进行编排。
• 通过容器技术对进程进行隔离空间运行,并设置资源限制。
2.3.1 DevOps 持续发布流程
开发项目组可通过CaaS管理平台,使用图形化界面进行应用编排。应用编排内容包括容器与容器之间的组成关系、容器的弹性伸缩配置、与外部资源的交互关系等,如图10所示。
图10 CaaS平台应用编排示意
DevOps持续发布流程如图11所示。
图11 DevOps持续发布流程
• 项目组向代码仓库(SVN/GIT)提交代码,持续集成服务器根据代码更新,通过Jenkins构建应用程序。
• 项目组在CaaS平台新建DevOps流程(一般为多个),配置相关参数,配置参数应包括:代码仓库接口、持续集成服务器接口、镜像命名规范、DevOps触发条件(手动/自动),使平台对接持续集成服务器。
• 项目组向代码仓库更新代码后,根据约定的DevOps触发条件,由CaaS平台对接持续集成服务器,根据持续集成服务器工程构建新版本镜像,通过镜像仓库对新版本镜像进行管理,从而完成持容器的续集成和部署。
• 整体应用测试完成后,项目组通过投产版本交付管理平台,将容器镜像、参数配置等信息交付生产环境。
• 生产环境应用管理员从投产版本管理系统中把指定应用包转换成容器镜像,并根据应用的版本号设置容器镜像的版本标签。
• 生产环境应用管理员把容器镜像上传到CaaS平台的镜像仓库中。
• 生产环境应用管理员登录CaaS平台,并根据应用发布要求从相应的镜像发布应用。
2.3.2 自动弹性伸缩
自动弹性伸缩,即CaaS平台能够根据应用管理员设置的应用弹性伸缩策略自动调整应用容器实例数,业务流程说明如下:
• 应用管理员在CaaS平台创建指定应用的弹性伸缩策略。
• CaaS平台实时监控指定应用的运行状态,并检查是否匹配弹性伸缩策略。
• 当指定应用的运行状态符合预定义的弹性伸缩策略时,CaaS平台自动根据策略调整应用的容器实例数。
• CaaS平台会自动根据应用容器的部署架构调整对应负载均衡的分发配置。
2.3.3 应用水平扩展
应用水平扩展,即应用管理员能够人工调整指定应用容器实例数,业务流程说明如下:
• 应用管理员通过某种方式,比如查看应用状态日报告,需要调整指定应用的容器实例数。
• 应用管理员在CaaS平台上修改指定应用的容器实例数。
• CaaS平台根据设置,动态调整运营实例数。
• CaaS平台会自动根据应用容器的部署架构调整对应负载均衡的分发配置。
2.3.4 扩充集群节点
扩容集群节点,即CaaS平台管理员需要向CaaS平台的容器资源池增加主机节点,业务流程说明如下:
• CaaS平台管理员在目标主机上安装和容器资源池相同版本的Docker引擎。
• 登录CaaS平台,获得带密钥的平台接入主机命令。
• 在目标主机上运行该命令,完成主机接入。
CaaS平台需要相关应用系统(如网上银行、企业客户信息整合系统(ECIF)、信用卡等)配合完成容器化改造。此外对 “集中监控系统”和“开发测试环境云计算管理平台”也有相应的改造要求。
2.4.1 业务系统容器化封装
应用的封装是把应用运行所需的环境和应用一起打包成为一个镜像,该镜像可在任意主机上无差别的运行,无需考虑应用运行所依赖的环境问题。业务应用系统容器化封装的过程是将传统应用转变为可运行在容器平台上的Docker镜像的过程,主要包括三部分内容:
(1) 准备基础镜像:应用镜像需要从某个基础镜像的基础上衍生出来,基础镜像里面可以包括一些普遍适用的软件包或者系统,比如Java运行时环境或者Tomcat Web服务器。
(2) 准备 Dockerfile:是一个描述文件,描述了镜像打包的完整过程,比如基础镜像,在基础镜像上运行的命令等。
(3) 根据应用包和Dockerfile构建镜像,并上传CaaS平台镜像仓库。
2.4.2 业务系统的日志
由于业务应用运行在CaaS平台后,部署架构是动态的,而且通常情况下会通过多个容器实例共同支撑业务负载,因此传统的应用日志管理方式并不能很好地适应CaaS平台的场景。CaaS平台上线后,业务应用会采用以下方式进行日志管理:
• 将主机中一个固定的目录作为容器卷挂入业务容器。
• 业务应用会在卷根目录建立下述格式的日志文件夹:“应用名”/“容器ID”/“日志文件名”。
2.4.3 开发测试环境应用集中监控系统
考虑未来开发测试环境中运行的应用对应用日志的监控需求,后续“集中监控系统”需要在开发测试环境中部署,并与开发测试云中的CaaS平台对接。
2.4.4 开发测试环境云计算管理平台
CaaS平台的一些预制容器编排模版,比如DevOps、微服务组件模版,可以作为“开发测试环境云计算管理平台”之上可被申请的服务,实现CaaS平台服务的自助申请和自动获取。因此,“开发测试环境云计算管理平台”的服务目录需要能够补充CaaS平台服务,并通过集成CaaS平台API实现服务自动供给。
该CaaS平台所涉及的开发框架及工具如下:
• 开发语言:Golang、Ruby、NodeJS、Python、HTML5、Shell等。
• 编译工具:Makefile、Gulp。
• 前端框架:AngularJS。
• 后端框架:Python、Flask。
• 源代码管理工具:Git、SVN。
• 研发项目管理及缺陷管理工具:Jira。
• 容器引擎:Docker。
• 容器集群(资源池)管理、编排工具:Swarm、Kubernetes。
• 自动化测试框架:Pyunit、Karma、Selenium。
在容器编排工具的选择上,现在业内比较成熟的技术方案是Docker Swarm、Google Kubernetes和Mesos三者。三者具有各自优、劣势,具体比较如表2所示。
表2 主流容器编排工具优、劣势比较
综上所述,该CaaS平台可使用Swarm作为容器资源池的集群管理工具,而Kubernetes工具则可用于容器的调度。
3.2.1 开发测试环境
开发测试环境CaaS平台物理架构如图12所示。
图12 开发测试环境CaaS平台物理架构
图12中“集中监控系统(Zabbix)”为现有系统,“开发测试云计算管理平台”和“应用监控系统”为需配合改造系统,其余为新建系统:
1) CaaS平台由应用服务器、数据库服务器、镜像仓库、控制节点、负载均衡设备组成。容器资源池应满足开发、测试、投产验证的环境需求。
2) 平台通过直连业务网段“统一认证系统”实现用户身份认证,并使用“集中监控系统”对平台及资源池宿主机状态进行监控,容器及容器的应用日志均由应用监控系统进行监控。
3) 开发测试环境CaaS平台通过与“开发测试环境云计算管理平台”集成实现 CaaS服务申请,并与持续集成服务器完成一键开发-测试-部署功能。
4) 应用开发完成后,通过“投产版本交付平台”交付,交付内容包括:容器镜像、应用模板、参数配置等信息。
3.2.2 生产环境
生产环境CaaS平台物理架构如图13所示。
图13 生产环境CaaS平台物理架构
1) CaaS平台由应用服务器、数据库服务器、镜像仓库、控制节点、负载均衡设备组成,平台部署于生产管理网段,并分别在业务网、信用卡DMZ、网银APP网段各部署一个容器资源池。
2) 平台通过ESB与统一认证系统进行交互,实现用户身份认证,并使用OVO对平台及资源池宿主机状态进行监控,应用状态、日志及容器状态、日志均由应用监控系统进行监控。系统日志由日志管理平台进行收集。
3) 生产环境使用备份平台对容器镜像进行备份,数据库通过导出到本地的方式使用备份平台进行备份。
4) CaaS平台整体作为应用,与配置管理平台进行对接,实现配置管理。
CaaS平台所涉及的系统软件包括操作系统、数据库、中间件及其他通用工具软件(如规则引擎、工作流等),包括产品和版本号,具体如表3所示。
表3 CaaS平台所涉及系统软件
续表3
开发测试环境与生产环境所部属的软件除所使用许可数量不同外,其版本相一致。另外,为节约资源成本,开发测试环境的监控软件均采用开源的Zabbix。
CaaS平台应用服务器、计算节点通过硬件实现负载均衡,数据库、镜像服务器通过主备机实现高可用。
开发测试环境使用Zabbix服务器对计算节点宿主机进行监控,应用状态、日志及容器状态,以及容器的应用日志均由应用监控系统进行监控。
生产环境中使用OVO对CASS平台进行监控,平台通过ESB与统一认证系统进行交互,实现用户身份认证,并使用OVO对平台及资源池宿主机状态进行监控,应用状态、日志及容器状态以及容器的应用日志均由应用监控系统进行监控,系统日志由日志管理平台进行收集。
该CaaS平台架构中引入并集成了多种第三方开源技术,由于开源技术具有迭代速度快、缺乏原公司支持等特点,因此针对容器化平台中使用的第三方开源技术需要考虑技术支持问题。一方面是衡量项目组对于这些引入技术的掌握程度,另一方面还要考虑是否需要引入第三方技术支持公司对相应技术进行有效支持和维护。
引入容器化平台可以使得应用具有持续集成特性,即应用在开发过程中,开发测试人员可以在测试环境中尽量模拟真实软件架构,以便尽早发现潜在的问题,提高开发测试的效率。另外,平台的自动部署功能将实现秒级自动完成系统的部署,提高系统部署及升级的效率,还支持平台容器的组件以及非容器组件的统一部署。这些新特性的引入,将改变原有的开发、测试及部署的流程,因此对于新流程的规范管理和协调将是容器化平台建设的又一重点任务。