Introduction

DevOps 与 SRE 实战

DevOps 与 SRE 实战涵盖了笔者对于大型软件系统开发与运维工程中的偏交付、运维向的知识沉淀。DevOps 的出现,运维的身份职责发生了转变,它不再是专门跑任务脚本或者与机器打交道的人,而是变成了 OpenStack 或者 Kubernetes 的专家,通过搭建/管理相关的分布式集群,为研发提供可靠的应用运行环境。DevOps 更重要的方面还是改变了应用交付的流程,从传统的搭火车模式走向持续交付,应用的架构和形态改变了,其方法论也随之而改变。DevOps 和持续交付也被认为是云原生应用的要素。至于 AIOps 是 DevOps 在实践 AI 过程中的一些应用,称不上是范式的改变,AI 在运维领域还远远取代不了人的作用。

mindmap

分布式架构解决了互联网应用吞吐量的瓶颈;越来越成熟的分布式中间件也屏蔽了分布式系统的复杂度,提升了开发工程师的工作效率;自动化运维工具则提升了运维工程师的工作效率。但是,由于目标不同,在固有的将开发和运维划分为不同部门的组织结构中,部门之间的配合并不总是很默契的。开发部门的驱动力通常是频繁交付新特性,而运维部门则更关注服务的可靠性。两者目标的不匹配使得部门之间产生了鸿沟,从而降低了业务交付的速度与价值。

直到 DevOps 方法论出现,开发与运维之间的鸿沟才得以渐渐消失;通常,影响一个项目的三个因素分别是速度(时间)、可靠性和成本。开发需要有按时交付的速度,而运营需要有可靠性。DevOps 可以保证以低成本的方式实现速度和可靠性,帮助开发工程师和运维工程师在实现各自目标的前提下,向最终用户交付价值最大化、质量最高的成果的一系列基本原则。DevOps 在软件开发和交付流程中强调“在产品管理、软件开发以及运维之间进行沟通与协作”。DevOps 是一种使持续交付成为可能的理念,关注于所有人共同协作以改进开发效率方面的衡量(比如生产力),同时增加稳定性并降低平均故障修复时间。

DevOps 是一种公司文化的变迁,它代表了开发、运维和测试等环节之间的协作,因此多种工具可以组成一个完整的 DevOps 工具链。Chef 的创始人 Adam Jacob 将 DevOps 定义为一种文化和专业的运动。

DevOps 会涉及到各种模式,包括:持续改进、组织文化、学习曲线、持续交付、持续学习、持续协作和自动化:

  • 价值流,它指一个组织针对客户的需求所执行的各项交付活动的顺序。也就是指你如何把一个想法最终变现的过程。

  • 交付时间,它指价值流从开始到结束,全程转化的耗时。一般情况下,交付时间是指呈现到客户眼前所花费的时间。

  • 周期时间,它始于按照需求所开展的工作,终于准备好交付项目的时候。

  • 交付时间的掌控能力,意味着我们对 DevOps 的运用水平。

  • 部署交付时间,反映了我们在自动化方面的水平。

由此可见,组织应遵循 DevOps 的模式和实践方式,以减少交付的时间。他们完全可以从中选取诸如:放大反馈或加强持续学习文化等一个或多个适合自身的 DevOps 方法。GitOps 被认为是下一代的 DevOps,让运维工作变得与写代码的方式一样,将 Git 仓库作为运维工作的“the single source of truth”,这对于多云、混合云和多集群部署是非常有价值的。Git 所具备的版本管理能力让运维工作变得更加可溯与可控。总的说来,易用性解决的是软件开发效率、工程质量和人力成本问题。

自动化运维

近几年随着大数据技术的爆发、系统规模和复杂度的提升以及行业开始对 ServiceMesh、FaaS 等云原生技术体系的探索,自动化运维与管控在业界及公司内的重要性越发凸显。直观来看,服务器的数量迅速地从几十台、上百台增加到成千上万台。企业内部服务器数量的大幅增长,使得服务器出现故障的频次也大幅增加,手工运维时代的瓶颈随之到来。运维工程师越来越难以远程登录每一台服务器去搭建环境、部署应用、清理磁盘、查看服务器状态以及排查系统错误,此时急需自动化运维体系与开发技术体系配合。

从工具的角度来看,自动化运维工具主要包括两大类:监控自动化工具以及流程自动化工具:

  • 监控自动化工具可以对服务器的 CPU、内存、磁盘 IO、网络 IO 等重要配置进行主动探测监控,一旦指标超过或接近阈值则自动通过邮件、短信等方式通知相关责任人。使用 Nagios、Zabbix 等系统监控工具可以有效实现这一点。

  • 流程自动化工具主要对服务器进行维护,同时实现应用上线部署等日常操作的自动化和标准化。Puppet、Chef、Ansible、SaltStack 等自动化运维管理工具的出现,快速地将运维工作推向自动化,让一名运维工程师可以很容易地维护成千上万台服务器。

从解决问题的角度来看,自动化运维又可以分为三个发展阶段:

  • 操作自动化:采用集成的脚本或 Web 类工具来解决同一类问题。

  • 场景自动化:基于自动化系统平台,能够结合当前系统上下文和外部环境并基于事先定义好的条件来做一系列的变更或分析需求。

  • 数据驱动智能化:在场景自动化的基础上,结合严格定义的系统指标或业务指标(Metrics),具备系统关键指标的实时采集、分析、计算能力,再基于特定的算法模型主动识别确定性问题并驱动问题的告警/预警、路由和解决执行。

Kubernetes 细化的应用程序的分解粒度,同时将服务发现、配置管理、负载均衡和健康检查等作为基础设施的功能,简化了应用程序的开发。而 Kubernetes 这种声明式配置尤其适合 CI/CD 流程,况且现在还有如 Helm、Draft、Spinnaker、Skaffold 等开源工具可以帮助我们发布 Kuberentes 应用。

有了基于 Kubernetes 的 CI/CD 流程后,又诞生了 GitOps 和 SecOps(Security Operation)。