什么是 DevOps

DevOps 可以看作是一种覆盖了开发、测试、运维、部署等整个流程的一种方法,强调通过自动化的方式来管理软件的变更、集成。使用 DevOps 则方便在较短的时间内发布软件,提高软件修复、更新的效率。DevOps 还可以看作是敏捷开发的进一步升级,敏捷开发应对的是需求频繁变化、需要快速开发的场景,DevOps 在此基础上进一步要求操作、修改也要快速。
image.png
DevOps 的好处在于:

  • 除了编码开发的部分,之后的一系列构建、测试、部署等重复性操作都尽量自动化,这样在省时省力的情况下仍然保证整个流程的规范。
  • 持续集成,增加部署频率,能够提早发现错误,降低修改错误的成本。

整个 DevOps 的工作流可以如下图表示:
image.png

DevOps 工具

代码管理

主要是指 Git 这类工具,能够对代码进行版本管理,并且使用 git 工作流能够很方便进行协作开发。

CI 工具

持续集成工具,负责从代码仓库拉取项目代码并且构建项目,将结果传送到要部署的目标环境中。这个过程中,需要管理员将构建项目的各个步骤写成一个脚本,每当 CI 工具从代码仓库拉取到最新的项目代码后,就根据脚本构建项目。这类工具有 Jenkins、CircleCI 等,但现在 Github、GitLab 已经内置了 CI 工具,可以直接使用。

Docker

从 DevOps 的工作流中可以发现,CI/CD 工具并不是直接传送项目的成品(Artifact)给服务器,而是打包成一个镜像传送给服务器,为什么需要镜像呢?因为程序的运行往往需要一定的依赖环境,例如 Java 的成品 jar 包运行就需要有 JDK,Node.js 运行需要 Node.js 环境等,为了使每一个项目运行的过程可以重复,将项目及其依赖一起归档发送给服务器运行。这样,不仅构建项目方便,而且可以实现跨平台部署。

所以镜像其实就是项目和项目运行环境的归档。镜像与容器的关系就像是类与对象,容器是一个可运行的镜像实例。在这个过程中,Docker 就充当一个工具,用于构建、传送容器镜像,并且运行容器。
image.png

Kubernetes

之前的讨论,都是将应用程序部署在单台机器/节点上,如果需要将程序部署到多个节点上呢?比较直接的方法就是让 CI/CD 模块通过 SSH 连接到所有节点,然后将容器部署到每一个节点中。
image.png
但是这种方式存在问题,那就是当节点数目变动的时候,需要手动更改脚本,非常不灵活,不能够很好地收缩。所以,大佬们的方法是创建一个 HTTP 服务来跟踪节点个数的变化,并且对各个节点进行健康状态的检查,维护活跃的节点列表,据此来进行程序的部署。这就是容器编排(Pilot 的工作),Kubernetes 就是干这个的。
image.png

总结一下

DevOps 是应对软件开发到最终部署整个流程的一种方法,强调编码开发之后的流程尽量自动化地进行,省时省力,方便对项目进行改动、更新。

过程中主要用到这几个工具:一个是代码仓库,用于管理代码的版本;另一个是 CI/CD 工具用于拉取代码,构建项目,并与其依赖环境打包成镜像发送到服务器;然后服务器启动创建一个镜像的容器,并启动容器。在这之中,Docker 工具用于控制镜像、容器相关的操作。

对于部署到多个节点的情况,引入了容器编排来进行部署节点的选择。