APP下载

面向混合虚拟化环境的开发运维一体化服务设计

2022-02-25胡俊章兵陈郑平范海威吴炜李泽科

微型电脑应用 2022年2期
关键词:容器组件运维

胡俊, 章兵, 陈郑平, 范海威, 吴炜, 李泽科

(1. 南瑞集团公司(国网电力科学研究院), 江苏, 南京 211106;2. 国电南瑞科技股份有限公司, 江苏, 南京 211106; 3. 国网福建省电力有限公司, 福建, 福州 350000)

0 引言

调控云[1]包括基础设施层(IaaS)、平台服务层(PaaS)、应用服务层(SaaS)共3层, 对外提供计算资源、调控云模型和数据服务。基础设施层通过存储虚拟化、主机虚拟化、桌面虚拟化、网络虚拟化等,构建计算资源池、存储资源池和网络资源池。平台服务层集成了云存储、应用集成、数据处理、公共服务等多种组件,调控云将平台服务层细分为4个业务支撑平台:模型数据云平台、运行数据云平台、实时数据云平台和大数据平台[1]。

调控云平台服务层为应用服务层运行提供了强有力的支撑,但对开发场景和测试场景的支撑则相对薄弱。目前虚拟资源管理机制在服务的部署、升级、扩容、回退、下线等方面灵活性不足,影响应用的弹性伸缩和敏捷交付[2]。为此,采用虚拟机和容器的混合架构对平台进行升级,并引入容器和Kubernets[3]容器平台技术。这为解决开发测试环境一致性和弹性伸缩等问题提供了可行解决方案,但也带来了新的运行维护问题。

采用混合架构,调控云平台存在虚拟机和容器等不同形式的资源池,应用部署将面临更为复杂的运行环境管理,调试和测试难度都会增加。在IT界,通过实施DevOps(开发运维一体化)、建立自动化持续交付体系来提升软件部署效率和质量,保障软件快速可靠交付已成为大型分布式系统运维的普遍手段[4]。

因此,借鉴DevOps实践在软件交付和运维的成功经验,设计调控云开发运维一体化服务、扩展云平台服务层的开发运维支撑能力,是保障调控云稳定运行、发挥混合架构优势的关键之一。

1 需求分析

开发运维一体化服务不仅仅是一个应用部署自动化工具,还具备运行环境管理和系统监视功能。借助开发运维一体化服务,可以基于容器资源池快速构建运行环境、实现应用快速上线和实时监视。它的主要功能需求包括用户管理、基础数据管理、部署管理和系统状态监视。

1.1 用户管理

用户管理实现基于角色的用户权限模型。主要用户角色包括:① 管理员,负责平台运维,分配资源;② 应用开发人员,提交上线单;③ 应用负责人,管理项目资源,审核上线单;④ 测试人员,操作测试环境。

1.2 基础数据管理

基础数据分为运行环境数据和应用项目数据。运行环境数据主要包括虚拟机信息、容器集群信息和平台公共服务组件信息。应用项目信息主要包括项目源代码版本库地址、分支、提交号和标签等版本信息,以及项目的运行环境信息。

1.3 部署管理

部署管理主要包括平台组件部署、容器集群部署和应用部署。平台组件和容器集群是部署在虚拟机上,应用软件部署在虚拟机或容器集群上。部署管理支持二进制制品部署和基于源码库自动构建及部署;支持多项目并发部署,支持一键发布和一键快速回滚;用唯一ID标识每次部署,并记录部署过程相关信息,当出错时,可以快速定位和排查故障。

1.4 状态监视

定时检查虚拟机、容器集群、中间件和应用服务健康状况。每个容器集群只能配置一个定时巡检任务收集集群健康状况数据,并及时对异常或风险点进行处理。应用健康检查包括“应用存活检查”和“应用就绪检查”。

1.5 非功能性需求

非功能性需包括部署要求和安全性要求。

(1) 部署要求。作为调控云平台层服务在云端部署,提供Web界面,通过浏览访问。

(2) 安全性要求。支持以HTTP协议调用容器集群接口和对外提供服务。

2 系统设计

2.1 总体设计

开发运维一体化服务由后端服务和前端界面2部分组成,如图1所示。

图1 体系结构图

后端服务分为控制层、执行层和基础环境。控制层由数据管理、用户管理、部署管理和任务管理组成,主要功能是接收来自前端界面的调用,分发给执行层处理。执行层包括容器集群部署、平台组件部署、应用软件部署和系统状态监视4个模块,实现开发运维一体化的基本功能。

采用前后端分离的设计原则,前端界面与后端服务通过Restful协议通信,并采用WebSocket实现前后端的双向实时通信,满足远程操作和实时信息展示等需求。采用模块化设计可以支持扩展。

2.2 任务管理模块设计

任务管理由任务触发、任务配置、状态查询、消息队列、任务执行单元、数据库和实时库组成,如图2所示。任务触发支持异步任务和定时任务2种类型,异步任务由前端业务逻辑触发,定时任务由定时器产生。消息队列接收任务触发产生的消息(即任务),将其存入队列;任务执行单元实时监控消息队列,获取队列中调度的任务并执行。数据库用于存储任务定义和任务执行结果。

图2 任务管理

2.3 部署管理模块设计

部署管理由前端Web界面,后端的控制模块、构建模块分发模块等组成,如图3所示。构建模块通过git-ssh方式创建仓库本地副本,运行项目构建脚本生成可发布的软件包。分发模块支持二进制包和容器镜像2种部署方式。针对以二进制方式部署场景,使用scp向服务器分发,然后再通过ssh解包部署和启动运行;针对容器方式部署场景,编译后打包成容器镜像,推送到容器镜像仓库,通过容器或kuernetes的接口部署运行。控制模块调用构建模块和分发模块执行具体操作,可支持人工触发和基于代码提交自动触发。

图3 部署管理

2.4 状态监视模块设计

状态监视包括应用服务状态监视、平台组件状态监视和主机资源状态监视,如图4所示。应用服务状态监视和平台组件状态监视,采用Google的4个黄金指标方法收集延迟、流量、错误和饱和度指标数据,在服务层级监视终端用户体验、服务中断、业务影响等问题。主机状态监视包括物理机和虚拟机,采用USE(Utilization、 Saturation和Error)方法,从操作系统层面收集CPU、内存、 网络 I/ O、磁盘 I/ O等相关指标数据,监视任何资源在某种程度上的饱和都可能导致系统性能下降问题。

图4 状态监视

状态监视在结构上分为监视服务和指标采集代理2部分,如图5所示。监视服务由前端Web界面,后端数据收集、数据处理、数据接口和时序数据库组成。指标采集代理部署在目标系统上,数据收集通过指标采集代理获得指标数据。

状态监视关注的是近期和实时数据,为保证时效,在本地采用时间序列库保存指标数据,默认保留2周。指标数据经过处理后通过Web界面展示,也可生成告警。数据接口对外提供Restful服务,同时支持主动向信息运维综合监管系统报送健康数据。数据收集、数据处理、对外数据报送等作为任务由任务管理模块调度运行。

图5 状态监视结构图

3 关键技术分析与实现

3.1 前端界面

3.1.1 前后端分离

相比传统的Web架构,前后端分离把MVC架构[5-6]中的业务逻辑处理单独分离出来由后端处理。前端负责视图和控制层,后端只负责业务逻辑,进行业务处理和数据处理等,如图6所示。前后端通过AJAX和Json进行交付,需要双向实时通信的场景则使用WebSocket,比如Web SSH。

图6 前后端分离

3.1.2 前端框架

前端技术选型主要使用Vue.js[6]、Element[7]和Axios[8]框架,如图7所示。Vue.js是一个前端用户界面框架,适合于构建复杂单页应用程序。Element是一套基于 Vue 2.0 的桌面端组件库,有助于网站快速开发。Axios是一个基于Promise的HTTP请求客户端。

图7 前端架构

使用axios实现rest调用非常简单,但是它没有封装,当项目变大时,会导致代码冗余,难以维护。本项目对其进行二次封装,各个组件能复用请求,让代码变得容易维护。

3.2 后端服务

3.2.1 Web服务框架

开发 Web服务,引入一个框架是必要的,选择合适的框架可以达到事半功倍的效果。 Go语言凭借简洁的语法和优雅的并发,在开源中间件产品开发中被广泛应用,比如Kubernets 等。Beego 是一个Go语言的Web应用快速开发框架,支持 Restful,提供了高度解耦的cache、config、context、httplibs、logs、orm、session和toolbox独立模块。因此本项目采用了Beego作为后端Web服务框架。

基于Beego框架,本项目快速实现了用户管理、角色管理、菜单管理、字典管理、系统配置等通用后台功能。并在此基础上对自动化部署工具Ansible进行封装,配合前端界面,将其指令界面化,达到操作直观、简单易用的效果。

3.2.2 分布式任务和锁

利用消息队列实现任务调度是分布式系统的常用设计模式。OpenStack云平台就是使用了消息队列来协调服务之间的操作和状态信息[7-8]。本文采用消息队列来实现任务管理。定时任务被封装为一条消息,发往消息队列,工作节点监听消息队列执行任务。为了防止定时任务触发单点故障,运行多个触发器,并通过分布式锁防止重复触发。

分布式锁有3个基本属性:互斥、无死锁和容错。主流分布式锁有基于ZooKeeper、Redis 或Etcd的实现方案。调控云平台中已使用Redis和Etcd集群,本文在redis和Etcd方案进行比较和选型。Redis方案在某些场景下解决并发问题存在不安全的因素[9]。Etcd具备分布式一致性、租约机制、前缀机制和监听机制等特性,能实现可靠的分布式锁,因此本文采用Etcd方案。

3.3 系统监控框架

Prometheus[10]是一个开源的完整监控解决方案, 2016年5月继Kubernetes之后成为第二个正式加入CNCF基金会的项目,于 2017年底发布了2.0版本,能够感知Kubernetes容器编排系统部署动态创建的应用服务是它的优势。

Prometheus通过HTTP协议周期性收集被监控组件的指标数据,只要组件提供相应接口就可以接入,这种接口称为 Exporter。一般常用组件都有可用的Exporter,比如 Nginx、MySQL和Linux 系统信息(包括CPU、内存、网络、磁盘等)。Prometheus可扩展性友好,可以开发Exporter来支撑新组件。

图8 前后端分离

本项目采用Prometheus框架,并从配置文件下发、查询API封装和定制Exporter等方面进行二次开发。采用Gitlab版本化存储Prometheus配置信息,通过下发配置来管理监控目标,通过API读出监控数据统一展示。此外,定制开发Exporter获取调控云达梦数据库的指标,如图8所示。

4 总结

随着调控云平台采用虚拟机和容器混合部署,以及微服务的应用,软硬件架构变得复杂,同时服务数量增加,服务上线周期缩短,运维压力随之增大。本文提出一个面向调控云平台的开发运维一体化服务解决方案,并对关键技术和实现路径进行了详细分析。开发运维一体化服务能有效提高平台自身及应用微服务的运行维护自动化水平,保证系统的安全、稳定和高效运行。

猜你喜欢

容器组件运维
高速公路智能运维平台
无人机智能巡检在光伏电站组件诊断中的应用
Kistler全新的Kitimer2.0系统组件:使安全气囊和安全带测试更加可靠和高效
一种嵌入式软件组件更新方法的研究与实现
难以置信的事情
通用(OA)办公自动化系统的组件运用
智能+时代的新运维
——2019(第十届)IT 运维大会特别报道
配电线路的运维管理探讨
液体对容器底及容器对桌面的压力和压强
取米