DevOps工具链到底包含哪些工具?

前言

不管是面试、参加技术交流会还是同事之间沟通,经常听到“DevOps工具链”这个词,当然了,我自己也说。那DevOps工具链到底包含哪些工具呢?这些工具是怎么被使用的呢?我尝试梳理一下这些信息。

谈到DevOps工具链,可能很多人会首先想到类似下面这张图(图片来源于这里):

DevOps工具链

我其实不喜欢这种图片,作者很多时候都是尽可能多地把有点关系的图标都塞进去,好使得图片看起来高大上,实际上并不能很好地解释清楚DevOps工具链。

我在这篇文章中会尝试根据自己的经验按照几个模块来梳理,并在每个模块中给出一些具体的工具案例。

DevOps工具链可以分为哪几个模块?

按照我的经验和过去的一些实践,DevOps工具链可以分为以下几个模块:

  • 代码管理(也可以叫做版本管理)
  • CICD
  • 配置管理
  • 容器化和容器编排
  • 监控与日志
  • 安全分析
  • 制品管理
  • 项目管理,协作与沟通
  • 自动化测试

一共有9个模块,每个模块可能包含多个工具。下面就按照每个模块逐一介绍。

代码管理

现在最流行的代码管理工具肯定就是git了,至于服务端,比较常见的有GitLab、Github、Gitee这三个,每个企业会出于不同的因素选择不同的平台。

不过,不管选择哪个平台,目前大部分企业都会选择私有部署,而不是使用SaaS服务,大家还是会担心代码安全问题。

当然,也有一些非常大的企业会选择按照自己需求自开发一个git服务端,比如华为就是自己开发的。

还有一个比较小众的选择。现在主流的公有云厂商基本上也都提供了基于git协议的代码管理功能,各家都不一样。如果没有非常特别的原因,我是非常 不推荐这种选择的,因为代码管理平台在很大程度上会影响DevOps工具链中其它工具的选择。云厂商的代码管理功能都是封闭式的,会限制其他工具的选择范围,而且很可能会有适配问题。

CICD

CICD是指持续集成和持续部署(持续发布)。

最著名的工具可能就是Jenkins了,功能强大,插件非常多,可以满足绝大部分需求,如果你不知道应该使用哪个CICD工具的话,可以试试它。

如果你的代码管理工具使用的是Github的话,尤其是Github企业版的话,那么Github Action对你来说可能是一个更好的CICD工具,它跟Github原生集成,配置简单。

如果你们公司/团队主要应用都是基于k8s部署的话,那么argoCD可能更适合你。argoCD可以说是专为k8s设计的一个CD工具,遵循gitops理念。

配置管理

配置管理工具主要用于统一管理和配置服务器和应用程序设置,常见的有Ansible, Chef, Puppet, SaltStack

现在其实还有一个工具我觉得也应该算在配置管理里面,那就是Terraform。
准确地说,Terraform是一个IaC(基础设施即代码)工具,但是可以将其视为公有云时代的配置管理工具。

配置管理类的工具,往往不仅仅DevOps团队在使用,产品团队(项目团队)也经常会使用。因为服务器这些资源有的时候是由项目团队直接管理的,也有可能是一个专门的运维团队在管理,每家公司可能都不太一样。

容器化和容器编排

这部分估计大家都没什么太大的争议,docker和k8s是最流行的了。

docker不用说太多,但是k8s里面其实还有很多细节。比如k8s里面的权限管控、网络隔离、日志记录、监控等等都有专门的工具,一个比较好的DevOps团队,这些都应该要提供的。

监控与日志

监控与日志的部分会有点复杂。因为这里会存在一个界限的问题。

在我看来,作为DevOps团队,要提供基础的监控和日志。

具体来说,监控应该要包含CPU、内存等计算资源,网络,服务器状态,pod状态这些,可以不包含SLO、SLI等更高层级的内容,因为这些应该是SRE来做。(但是实际上很多时候是既要做DevOps也要做SRE…)

日志应该要包含解析好的应用日志和系统日志。不过解析一般应该有项目团队自己做,毕竟他们对自己的日志更熟悉。

安全分析

在DevOps工具链中,根据安全性检查的不同阶段和目标,安全分析可以进一步细分为以下几类:

代码静态分析(SAST)

  • 用途: 在不运行程序的情况下分析源代码或二进制代码以发现潜在的安全漏洞。
  • 示例工具:
    • SonarQube: 不仅可以检测代码质量问题,也能识别安全漏洞和代码异味(code smell)。
    • Checkmarx: 提供全面的SAST解决方案,支持多种编程语言和框架。

依赖性扫描(SCA)

  • 用途: 检查项目依赖的库和框架是否有已知的安全漏洞。
  • 示例工具:
    • Snyk: 专注于发现和修复依赖库中的安全漏洞。
    • WhiteSource: 提供广泛的语言和框架支持,自动检测并修复开源安全漏洞。

容器安全与扫描

  • 用途: 在容器化环境中确保容器镜像的安全,包括镜像扫描和运行时保护。
  • 示例工具:
    • Aqua Security: 提供容器安全平台,包括镜像扫描、运行时防护等功能。
    • ClairTrivy: 开源项目,专注于容器镜像的漏洞扫描。

代码风格和规范检查

  • 用途: 确保代码遵循一定的编码标准和风格,有助于减少安全风险。这类工具一般只是一个插件或者命令行工具,没有server端,不需要集中维护。
  • 示例工具:
    • ESLint: JavaScript的一个插件化的静态代码分析工具,可以用来检查常见的代码问题和风格问题。
    • Pylint: Python编程语言的一个静态代码分析工具,用于查找编码错误,实施编码标准和推荐编码风格。

制品管理

  • 用途: 管理、存储、分发软件包的工具。这些软件包可能是第三方软件库、框架或你自己开发的程序。
  • 示例工具:
    • JFrog Artifactory: 支持多种软件包仓库类型的通用制品库,如Maven, Docker, npm等,这是一个商业产品。
    • Harbor: 一个开源的企业级Docker镜像仓库,支持镜像的存储、扫描和签名。
    • Sonatype Nexus: 提供支持多种技术的制品存储和分发,如Maven, npm, Docker等。

项目管理,协作与沟通

其实有犹豫要不要把这部分放在DevOps工具链中,因为一般理解上,这应该公司里IT部门提供的,但是这类工具的选择有时候会对DevOps流程有很大的影响,进而影响开发效率,所以还是算在DevOps工具链中吧。

这类工具现在很多,国产的有钉钉、飞书这些,还有老牌的Jira,Confluence wiki等

自动化测试

自动化测试作为DevOps中不可少的一环,应该被纳入DevOps工具链范围,但是,这一部分工作基本上不需要DevOps团队做,应为测试工作一般都是由项目团队或者专门的测试团队做的。

比较好的DevOps团队会在CICD的workflow中加上一些检测和控制,比如,如果某一次CICD过程中,没有做测试,就不允许走到CD环节。

结尾

以上就是我关于DevOps工具链的简单梳理,在实际使用中,每一个工具的选型其实都要考虑很多因素,比如跟现有流程的是不是契合、项目团队对于这个工具的接受程度、安全策略是否合规等等。