• 我们是如何实现DevOps的


    一、DevOps的理解

    DevOps的概念理解

    DevOps 的概念在软件开发行业中逐渐流行起来。越来越多的团队希望实现产品的敏捷开发,DevOps 使一切成为可能。有了 DevOps ,团队可以定期发布代码、自动化部署、并将持续集成 / 持续交付作为发布过程的一部分。
    一句话概括就是提高生产力,快速交付!

    二、引入DevOps的背景

    2.1 福禄技术栈介绍

    • 后端开发框架:基于C#的.netCore和Java的SpringCloud,少部分项目采用python和go开发

    • 前端开发框架:vue、react

    • 服务部署:前端站点基于ECS的nginx部署 ,后端服务统一部署在kubernetes上

    • 代码仓库:gitlab

    • 项目环境:目前有6套,开发、测试、压测、集成、PRE和生产

    2.2 后端服务的CICD现状

    20200608102906
                                                                                                     福禄后端CICD流程

    CICD 流程说明

    每一次的代码push,根据创建的分支,根据在gitlab的CICD文件gitlab.yml定义构建步骤,触发runner,从单元测试、通过dockerfile进行编译和生成镜像版本、将新镜像部署到K8S生成pod,然后触发接口自动化测试任务的执行

    好像缺了点什么?

    • 初次部署应用到kubernetes怎么做的?

    • 服务的configmap在哪里维护的?

    • 每个服务的gitlab.yml文件都不一样,如何维护的?

    • 应用的域名解析怎么做?

    目前有6套环境进行管理,其中开发、测试、集成、压测都是测试人员维护,预发布和生产运维人员维护;这也就要求每一个测试人员都必须对整个cicd流程和配置绝对掌握;所以当新人入职,需要掌握整个流程才能进入项目测试中,这是一个学习成本;

    预发布和生产的kubernetes只有运维能够操作,当有新的服务需要上线上述环境,或者configmap有变动,或者有时候排查问题需要查看容器日志,我们只能通过运维的工单系统描述作业操作,中间文字描述可能存在理解差异,沟通成本和时间成本很大;

    有的新应用我们去设置cicd的相关文件,比如dockerfile,我们发现应用的代码目录结构各种各样,这样往往就没法套用一个模板快速配置完成

    2.3 前端站点的CICD现状

    20200608103000

    前端CICD流程说明

    开发人员push代码到gitlab,测试人员通过jenkins拉取最新的代码到jenkins本地,然后通过jenkins与服务器之间的传输管道,将要部署的文件更新到目标服务器,并触发UI自动化的job

    完整的过程来看,也缺点内容

    • 一个新的站点部署,nginx需要做一些配置初始化工作,比如域名、路径的配置
    • 前端的配置文件是如何管理的

    跟后端应用一样,前端的PRE和生产环境也是运维处理,所以当一个新的应用上线我们也需要发工单,描述具体操作,然后运维执行工单;配置文件一般不会变更,所以我们在jenkins推送更新文件到目标服务器的时候,将配置文件做了过滤处理。后续需要变更通过工单执行

    2.3 痛点你看到了吗

    2.3.1 安全管控缺位
    • 代码安全:CICD的起点在gitlab里面,所以大家都有gitlab的账号,代码安全管控缺位
    • 线上安全:线上项目部署也是通过gitlab的cicd直接触发,审批流程缺失
    2.3.2 管理成本
    • 维护账号多:gitlab账号、jenkins账号、kubernetes账号(本地和阿里云),每一个人员都需要上述账号,运维管理麻烦,大家每个平台维护自己的账号也麻烦
    • 工单沟通:工单编写、沟通过程花费时间较多
    • 代码规范:项目组多,微服务也多,代码框架各自发挥,无论是流程维护还是问题排查都增加了难度

    三、研发管理平台(RDMS)应运而生

    3.1 如何理解这个平台

    工具链到平台的转变

    当前的cicd是对工具链进行了打通,但需要大家登录各个工具平台操作,我们希望对工具集进行功能整合,打造一个系统平台,并且将CICD的技术细节进行屏蔽,开发人员能够专心进行业务需求的开发,测试人员能够专注到需求测试任务中,而运维人员能够解放繁重的工单内容,投入到服务高可用的建设上!

    3.2 业务功能设计

    20200608103031
                                                                                                                                      福禄研发管理平台功能结构图

    3.2.1 功能说明
    • 项目管理:项目的创建和维护,默认提供了.netcore的api和控制台,java的api和前端站点的应用初始化代码框架,开发人员开发新的应用直接根据应用类型选择对应的模板就可以在git默认创建代码仓库和初始化框架代码,并自动生成应用的http和https的域名
    • 构建记录:获取gitlab的pipeline,展示所有分支的构建记录信息,可以一键跳转到git仓库
    • 部署管理:部署构建的镜像到指定的环境,提供实时部署和定时部署功能
    • 容器管理:提供容器的查看功能,可以看到容器的存活状态和容器实时日志
    • 配置字段权限申请:针对PRE和生产环境查看配置,需要先走钉钉审批申请流程
    • 配置信息:进行配置的维护,包括新增、编辑、删除,PRE和生产环境操作需要钉钉流程审批
    • 操作日志:针对应用的操作日志记录
    • 用户设置:在使用rdms前,需要先将用户git仓库的token设置在rdms上,这样用户在rdms操作与gitlab相关的业务才能正常使用
    3.2.2 RDMS几个核心页面的展示

    首页-创建应用
    20200608103107

    构建记录
    20200608103152

    部署管理
    20200608103224

    容器管理
    20200608103254

    3.3 技术架构

    20200608103316

    对接系统的说明

    • 通行证:RDMS的目标用户是研发中心人员,这些人员在通行证中都有默认的账户信息,与通行证打通,可以直接登录使用
    • GitlabAPI:目前RDMS的CI还是采用的gitlab的ci支撑,包括新应用在rdms的创建到git仓库的代码初始化等,都需要调用gitlab的api接口
    • 钉钉flow:安全管控的原因,PRE和生产的任何操作都会触发钉钉审批流,所属项目的项目经理审批通过后才会获取到数据或者执行操作指令
    • 福禄开放平台:提供了网关相关的功能和菜单、角色等维护功能,公司所有后端服务都需要入驻开放平台
    • 蜂巢:公司的调度作业平台,rdms的定时部署功能依赖该服务的支撑
    • 运维工单系统:rdms的CD流程没有直接与kubernets进行交互,而是通过运维的工单系统包装了运维底层的shell脚本层,然后提供给rdms相关的api接口,也是基于安全控制的考虑
    • shell脚本层:shell脚本层会调用kubernetes的api进行kubernetes的相关操作(部署、配置更新、容器重启、日志查看等);调用阿里云的dns解析接口,对应用的域名自动解析;调用oss的接口,进行前端站点文件目录的维护

    3.4 后端应用的devops实现详解

    20200608103348

    举个栗子进行介绍

    根据模板,创建一个应用
    20200608103503

    根据名称默认生成域名
    20200608103531

    初始化代码仓库,默认生成develop分支
    20200608103601
    20200608103707
    在rdms第一次部署到对应环境(开发、测试、生产等)时,会默认读取appsettings.Development.json的文件,并写入kubernets的configmap

    构建完成,进行部署
    20200608103749

    在kubernets生成pod
    20200608103815

    通过域名访问接口文档
    20200608103903

    3.5 前端站点的devops实现详解

    20200608103933

    同样的,举个栗子介绍

    首页-创建前端站点
    20200608104011

    根据名称生成域名
    20200608104037

    初始化代码仓库,默认生成develop分支
    20200608104106

    配置文件,默认生成几套环境的配置文件,站点的配置维护就是维护这几个文件
    20200608104128
    部署应用20200608104148

    kubernetes的nginx容器内可以看到部署的文件,实际就是挂载的oss到该pod上
    20200608104203

    四、展望

    目前RDMS投产一个月左右,我们希望能将devops理念在这个系统上进行持续的优化和实践,包括研发中心小伙伴也很踊跃参与共建,提出了很多好的方向和建议

    • 完善devops链条功能:通过字面来看有dev、ops两部分,我们后期需要加入test的比重,比如在CI部分,引入静态代码扫描、单测覆盖率;在CD部分集成我们的自动化测、性能测试
    • 工具平台:RDMS的初衷是整合,针对研发中心经常使用的工具或者有相关工具化的需求,我们可以整合到rdms或者在RDMS上进行开发

  • 相关阅读:
    常见的消息队列中间件介绍
    关系型数据库和非关系型数据库区别、oracle与mysql的区别
    SQL Server 和 Oracle 以及 MySQL 数据库
    Redis,Memcache,MongoDb的特点与区别
    详解布隆过滤器的原理,使用场景和注意事项
    Redis缓存穿透、缓存击穿以及缓存雪崩
    RPC、HTTP、RESTful
    集群,分布式,微服务概念和区别理解
    电脑双屏变单屏后,界面显示问题
    JDK 15已发布,你所要知道的都在这里!
  • 原文地址:https://www.cnblogs.com/fulu/p/13070621.html
Copyright © 2020-2023  润新知