DevOps落地实践

hujianxiong 2020年03月17日 1,469次浏览

维基百科对 DevOps 的定义:

DevOps(开发 Development 与运维 Operations 的组合词)是一种文化、一场运动或实践,强调在自动化软件交付流程及基础设施变更过程中,软件开发人员与其他信息技术(IT)专业人员彼此之间的协作与沟通。它旨在建立一种文化与环境,使构建、测试、软件发布得以快速、频繁以及更加稳定地进行。

DevOps 最开始想要打破的就是开发和运维之间的对立和隔阂。

DevOps 是通过平台、流程和人的有机整合,以 协作、自动化、精益、度量、共享文化为指引,旨在建立一种可以快速交付价值并且具有持续改进能力的现代化 IT 组织。

DevOps 带给企业重要价值:

DevOps 的 4 个结果指标:

  1. 部署频率:指应用和服务向生产环境部署代码的频率。
  2. 变更前置时间:指代码从提交到成功运行在生产环境的时长。
  3. 服务恢复时间:指线上应用和服务出现故障到恢复运行的时长。
  4. 变更失败率:指应用和服务在生产环境部署失败或者部署后导致服务降级的比例。

DevOps 试图通过体系化的研发实践导入、软件架构的整体革新、组织管理理念的不断升级和企业文化的影响塑造,来帮助企业改善整个软件交付过程,在实现高吞吐量的同时保证服务的总体稳定性,从而真正实现又快又好的软件交付目标。

提到高效率和高质量是 DevOps 的核心价值,而工具和自动化就是提升效率最直接的手段,让一切都自动化可以说是 DevOps 的行为准则。

DevOps 文化中最为知名的4点:

  1. 建立免责的文化,并在错误中学习;
  2. 通过对外开放透明,建立信任,促进协作;
  3. 打造心理安全的氛围,鼓励创新;
  4. 开源为先的共享精神。

DevOps 的初衷就是打破开发和运维的隔阂,但究竟要如何打通呢?

在大多数公司,部署上线的工作都是由专职的运维团队来负责,开发团队只要将测试通过的软件包提供给运维团队就行了。所以,开发和运维的自然边界就在于软件包交付的环节,只有打通开发环节的软件集成验收的 CI 流水线和运维环节的应用部署 CD 流水线上线,才能真正实现开发运维的一体化。

DevOps早在2009年就提出来了,但是,为什么这两年才开始受到越来越多的企业重视和实践呢?

因为DevOps的发展是独木不成林的,现在有越来越多的技术支撑。微服务架构理念、容器技术、Kubernetes使得DevOps的实施变得更加容易,计算能力提升和云环境的发展使得快速开发的产品可以立刻获得更广泛的使用,所以越来越多的企业开始去实践DevOps的落地。

DevOps落地的几个阶段

DevOps的实践不是一步到位的,它是一个持续改进的过程。

建设 DevOps 平台核心理念

  • 标准化:一切皆有规则,一切皆有标准;Gitlab分支管理标准化,COMMIT标准化等,CMDB元数据标准化,Jenkins代码构建标标准化,流程标准化等等。
  • 自动化:干掉一切不必要的手工操作环节,能一键完成的,绝不操作两次;
  • 服务化:面向用户设计,而不是面向专家设计,让每个人都能在没有外界依赖的前提下,完成自己的工作;
  • 数据化:对数据进行收集、汇总、分析和展示,让客观数据呈现出来,让数据指导持续改进。

第一个阶段

从无到有,在这个阶段,企业的 DevOps 平台建设处于刚刚起步的状态,在整个交付过程中,还有大量的本地操作,手工操作和重复性的操作。

这一步可以引入开源工具来快速补齐现有的能力短板。所谓能力短板,其实就是当前交付工具链体系中缺失的部分,尤其是高频操作,或者是涉及多人协作的部分,比如,需求管理、持续集成等。

  • 需求管理工具 Jira;
  • 知识管理工具 Confluence;
  • 版本控制系统 GitLab;
  • 持续集成工具 Jenkins/Jenkins X/Drone;
  • 代码质量工具 SonarQube;
  • 构建工具 Maven/Gradle;
  • Maven私服 Nexus;
  • 制品管理 Artifactory/Harbor;
  • 配置管理工具 Ansible;
  • 配置中心 Apollo;
  • 测试工具 RF/Selenium/Appium/Jmeter/TestNG;
  • 安全合规工具 BlackDuck/Fortify;
  • 集群编排 Kubernetes;
  • 数据变更管理 flyway/inception/soar
  • 监控管理 Prometheus
  • 日志管理 E(L/F)K
  • ...

第二阶段

经过了第一个阶段,企业交付链路上的工具基本都已经齐全了。

在这个阶段可以以对开源工具进行一次封装,在开源工具上面实现需要的业务逻辑和交互界面建设企业内部自己的流水线平台为主。

比如基于Jenkins 封装一套自己的构建验证测试打包平台,可以利用Jenkins API,插件,Gitlab webhook ,maven, docker ,harbar,自动化测试来实现。

当构建平台完成以后可以结合Kubernetes API来构建一个部署平台。

这个时候需要开始有计划的去标准化元数据,比如应用名称、模块名称、安全 ID 等等这些数据可以串起整个平台的数据结构。

然后落地CMDB:

  • 基础设施层面:IDC 机房、机柜、机架、网络设备、服务器等;
  • 应用层面:应用元信息、代码信息、部署信息、脚本信息、日志信息等。

CMDB 是运维的基石,是整个 DevOps 工程实践的基础,如果仅仅基于 CMDB 的资源信息作自动化,最多只能做出自动化的硬件资源采集、自动化装机、网络 - 硬件拓扑关系生成等资源层面的工具,这些工具只会在运维层面产生价值,离业务还很远,所以谈不上给业务带来价值。

但是基于应用这一层去做,就可以做很多事情,比如持续集成和发布、持续交付、弹性扩缩容、稳定性平台、成本控制等等。

比如可以针对任意一个需求,能够快速识别出它所关联的代码、版本、测试案例、上线记录、缺陷信息、用户反馈信息和上线监控数据,能够对于任意一个应用,可以识别出它所依赖的环境,中间件,上下游存在调用关系的系统、服务和数据。

演进监控系统

  • 监控自动化
    • 监控系统可用、好用
  • 监控立体化
    • 监控覆盖面更全,采集到各维度更全面、更完整的数据
  • 监控平台化
    • 监控系统与其他运维自动化系统打通和联动
  • 监控产品化
    • 监控产品更贴近人的使用习惯,用户体验更好
  • 监控智能化
    • 让监控系统拥有更强的智能

第三个阶段:

当以上两个阶段完成以后,Devops平台建设有了一定的积累,但由于平台太多,工具太多,做一件事情可能需要切换不同的平台,而且有的工具比较复杂想要实现一个功能,需要对相关人员进行专业培训,他们才能做对。

所以整合各个平台,将各个平台的相关功能抽取出来进行二次开发或者封装,将其整合到Devops平台中,化繁为简,统一界面,简化操作,有效度量。

这个时候Devops平台的建设不在仅仅是提供工具,而是提供一套解决方案
,不是解决一个问题,而是解决交付过程中方方面面的问题。

比如中间件的管理,比如kafka topic的申请与创建,生命周期的管理,缓存等等。

同时实现数据库变更自动化,实现数据库备份恢复,以及验证备份的可用性的自动化,故障演练,全链路压测等。

还有故障自愈,就是做好服务降级和兜底策略。

  • 服务降级是指,在流量高峰的时候,将非主路径上的功能进行临时下线,保证业务的可用性。典型的做法就是通过功能开关的方式来手动或自动地屏蔽一些功能。

  • 兜底策略是指,当极端情况发生时,比如服务不响应、网络连接中断,或者调用服务出现异常的时候,也不会出现崩溃。常见的做法就是缓存和兜底页面,以及前端比较流行的骨架屏等。

引入混沌工程,尽可能在这些故障和缺陷发生之前,通过一系列的实验,在真实环境中验证系统在故障发生时的表现。根据实验的结果来识别风险问题,并且有针对性地进行系统改造和安全加固,从而提升对于整个系统可用性。