DevOps 是个很复杂的概念,几句话很难解释清楚。我们延用之前的惯例,如果要理解一个复杂的概念,就先去了解它出现的背景,以及发展的历史。
DevOps 核心本质是解决软件开发生命周期中的管理问题,我们先从一种名为“瀑布模型”的项目管理方法说起。
瀑布开发
1970 年,计算机科学家 Winston Royce 发表《Managing the development of large software systems》论文,首次描述了软件开发的分阶段流程,包括需求分析、设计、实现、测试和维护等阶段。
如图 1-27 所示,Royce 描述软件开发流程如瀑布流水一般,由一个阶段“流动”到下一个阶段,这种逐步递进的流程后来被称为“瀑布模型”(Waterfall Model)。
图 瀑布模型示例,一环接着一环,就像自然界瀑布流水一般。

瀑布模型基于工程学的理念将整个过程分成不同的阶段,提供了软件开发的基本框架,便于人员间的分工协作。同时,也可对不同阶段的质量和成本进行严格把控。
但这种模式存在一些缺陷,瀑布模型产生于硬件领域,它是从制造业的角度去看软件开发的,产品迭代的频率经常按月为单位进行,在需求变化不多的年代,瀑布模型拥有其价值。随着软件行业的快速爆发,针对市场的快速变化和响应成了新的目标。这种场景下,需求无法得到快速验证是最大的风险,有可能花费数月开发的产品早已不符合市场需求。
寻求一种新的模式满足对产品生命周期迭代更迅速的管理,变得尤为迫切。于是,敏捷开发登上舞台。
敏捷开发
2001 年,Martin Fowler,Jim Highsmith 等 17 位著名的软件开发专家齐聚在美国犹他州雪鸟滑雪圣地,举行了一次敏捷方法发起者和实践者的聚会。这次会议中,他们正式提出了 Agile Software Development(敏捷开发)这个概念,还有模有样地签署了《敏捷宣言》,如图 1-28 所示。

相比于传统的瀑布开发,敏捷开发是一种持续增量、不断迭代的开发模式。
开发者快速发布一个可运行但不完美的版本投入市场,在后续迭代中根据用户的反馈改进产品,从而逼近产品的最终形态。
迭代是敏捷开发理论的核心。坦白地说,迭代开发并不是新鲜的概念,但敏捷研发方法大大完善了迭代开发的理论,使之能够被广大的软件开发团队认可。具体的敏捷研发方法有极限编程、精益软件开发、Scrum 等,如图 1-29 所示。
敏捷开发框架 Scrum,通过持续迭代的方式交付软件

虽然敏捷开发提升了开发效率,但它的范围仅限于开发和测试环节,并没有覆盖到部署环节。显然,运维部门并没有收益。相反的,甚至可以说“敏捷”加重了运维的负担。运维追求的目标是稳定,频繁变更是破坏稳定的根源。
如图 所示的混乱之墙,就是我们常说的开发与运维之间的根因冲突。
图 开发与运维之间的混乱之墙

那么,如何要化解开发与运维的矛盾呢?现在,到了 DevOps 上场的时间。
DevOps
DevOps 运动始于 2007 年左右,当时技术社区对开发/运维分工协作的方式、以及由此引发的冲突感到担忧。随着越来越多问题的出现,大家逐渐认识到:为了保证产品研发的效率、软件交付的质量,开发和运维必须紧密配合。
2009 年,比利时根特市举办了首届 DevOpsDays 大会,这届会议出乎意料的成功,引起人们广泛的讨论。DevOps 理论就此诞生!
DevOps 的定义
DevOps(Development 和 Operations 的合成词)是一种重视“软件开发人员(Dev)”和“IT 运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。
通过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
2009 年,引入 DevOps 概念之时,基于“Development“和“Operations”合成一个新词“DevOps”,强调开发(指交付前的广义上的研发活动,包括设计、测试等)与运维融合,打破开发和运维之间的隔阂、加快软件研发效率、提高软件交付质量。
从存在的意义上说,DevOps 完善了敏捷开发存在的短板,实现了研发流程真正的闭环。如图 1-31 所示,开发和运维不再是“孤立”的团队,两者在软件的整个生命周期内相互协作,紧密配合。由此带来的效益,是软件的品质不仅高、交付的速度还快。
图:Devops 打破开发和运维的对立

不过,话虽如此,要实现这一点却不容易,因为这并非只是一次升级,而是需要在原有的文化和流程上大刀阔斧的改革:
- 首先是推行协作文化,研发和运维之间不再是对立的关系,应该是互相协作、深度交流并且彼此体谅的状态。
- 开发流程方面,以往研发和运维各搞各的模式也需要改变:
- 运维需要在项目开发的初始阶段提前介入,了解开发所使用的系统架构和技术路线,并制定好相关的运维方案。
- 开发人员也需要参与到后期的系统部署和日常维护中,并提供优化建议。不仅仅是把代码甩给运维了事。
DevOps 的成功实践离不开工具上的支持,这其中包括最重要的自动化 CI/CD 流水线,通过自动化的方式打通软件从构建、测试到部署发布的整个流程。还有实时监控、事件管理、配置管理、协作平台等一系列工具/系统的配合,如图 所示。
图 DevOps 技术体系以及各阶段工具概览

云原生架构的演进
架构演进的目的一定是解决某一类问题,我们就从“解决问题”的角度出发,如图 1-33 所示,讨论传统架构向云原生架构的演进之路。
- 为了解决单体架构“复杂度问题”,使用微服务架构。
- 为了解决微服务间“通讯异常问题”,使用治理框架 + 监控。
- 为了解决微服务架构下大量应用“部署问题”,使用容器。
- 为了解决容器的“编排和调度问题”,使用 Kubernetes。
- 为了解决微服务框架的“侵入性问题”,使用服务网格。
- 为了让服务网格有“更好的底层支撑”,将服务网格运行在 Kubernetes 上。
图 传统架构与云原生架构对比

从研发应用的角度看,研发的复杂度降低了。在“强大底层系统”支撑的情况下,应用监控、通信治理、编排调度相关的逻辑从应用中剥离,并下沉到底层系统,已经符合云原生架构。但站在整个系统的角度看,复杂度并没有减少和消失,要实现“强大底层系统”付出的成本(人力成本、资源成本、技术试错成本)是非常昂贵的。为了降低成本,选择上云托管,将底层系统的复杂度交给云基础设施,让云提供保姆式服务,最终演变为无基础架构设计。
最后,通过 YAML 文件以声明式的方式,描述底层的基础设施以及各类中间件资源,即应用要什么,云给我什么,企业最终走向开放、标准的“云”技术体系。
云原生架构技术栈
云原生架构是优雅的、灵活的、弹性的…,但不能否认这些优势的背后是它的学习曲线相当陡峭。
如果你有志投入云原生领域,希望构建一个高可用(高研发效率、低资源成本,且兼具稳定可靠)的云原生架构,对能力要求已提升到史无前例的程度。总结来说,除了掌握基础的 Docker 和 Kubernetes 知识外,熟知图 1-34 所示的几个领域也是必备要求。
图 云原生代表技术栈

- 容器运行时:Docker、Containerd、CRI-O、Kata Containers。
- 镜像和仓库:Harbor、Dragonfly、Nydus。
- 应用封装:Kustomize、Helm、Operator、OAM。
- 持续集成:Gitlab、Tekton。
- 持续部署:ArgoCD、FluxCD。
- 容器编排:Kubernetes。
- 服务网格: Istio、Envoy、Linkerd。
- 网关:Ingress-Nginx、Kong、Traefik。
- 日志:Grafana Loki、Elastic Stack、ClickHouse。
- 监控/观测:Prometheus、Grafana、OpenTelemetry。
- 机器学习/离在线业务混合部署:Volcano、Koordinator…。
通过介绍,相信你已经深刻理解,什么是云原生?
云原生不是简单使用云计算平台运行现有的应用程序,也不是某个开源项目或者某种技术,而是一套指导软件和基础设施架构设计的思想。基于这套思想构建出来的应用,能够天然地与“云”融合,充分发挥“云”的能力和价值。相应的,云原生生态中的开源项目 Kubernetes、Docker、Istio 等,就是这种思想落地的技术手段。
最后,笔者还要补充的是,并不是因为云计算/容器技术的发展才出现云原生的概念,而是软件规模变得越来越大、越来越复杂的同时,对软件的可靠性、迭代效率、资源成本的要求也越来越高,这才有了云原生技术出现的契机和发展。
从根本上讲,驱动技术发展的动力有很多种,但能让技术大行其道的动力,都是来源于业务发展的需要。