Skip to content

1. Jenkins slave简述

Jenkins基于"kubernetes plugin"与k8s集成,可以使Jenkins slave以pod的形式在k8s集群内部动态构建、运行、销毁等。

通过 jenkinsci/kubernetes-plugin 了解到,Jenkins master既可以运行在k8s集群内,也可运行在k8s集群外,但是Jenkins slave的整个生命周期都是在k8s集群内,并且通过JNLP与Jenkins master连接。

Jenkins 具有以下特点:

  • 开源:Jenkins 是一个开源软件,可以免费使用。
  • 易用:Jenkins 提供了丰富的插件和模板,可以快速地搭建自动化构建和部署流程。
  • 可扩展:Jenkins 支持插件扩展,可以满足不同项目的需求。
  • 支持多种编程语言:Jenkins 支持多种编程语言,如 Java、Python、Ruby 等。
  • 支持多种构建工具:Jenkins 支持多种构建工具,如 Maven、Gradle、Ansible 等。
  • 支持多种部署方式:Jenkins 支持多种部署方式,如 SCM 仓库、Git 仓库、SVN 仓库等。
  • 支持多种测试工具:Jenkins 支持多种测试工具,如 Selenium、JUnit、SonarQube 等。

在生产环境中我们往往会在物理机或者虚拟机上部署jenkins,但是这种部署方式会有一些痛点,如下:

  • 主 Master 发生单点故障时,整个流程都不可用了
  • 每个 Slave 的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是比较费劲
  • 资源分配不均衡,有的 Slave 要运行的 job 出现排队等待,而有的 Slave 处于空闲状态
  • 资源有浪费,每台 Slave 可能是物理机或者虚拟机,当 Slave 处于空闲状态时,也不会完全释放掉资源。
  • 扩展性差:在物理机或虚拟机上部署 Jenkins,当 Jenkins 需要扩展时,需要购买更多的服务器或虚拟机,扩展性较差。

1.1 基于K8s动态Slave模式

优点:

  • 基于云原生现有K8s集群来解决问题,充分的利用现有资源,无需再申请新虚机;
  • Slave可在构建任务来之时动态创建,工作结束后自动销毁,释放资源;
  • 可通过K8s原生来管理Jenkins的调度策略,防止Slave调度分配不均匀;
  • 通过云原生控制器来管理Jenkins配置,后期比较利于维护、扩展;
  • Jenkins 小概率意外宕机场景,通过K8s的机制可以自愈;

缺点:

  • 增加了系统复杂度;
  • 有一定技术壁垒;
  • 实现需要时间;

1.2 Master-Slave原理

img

从上图中可以看出,Jenkins Master和Jenkins Slave以Pod的形式运行在Kubernetes集群的节点上。Master运行在其中的一个节点上,并将其配置数据存储到一个Volume中,而Slave运行在各个节点上,并且它并不总是处于运行状态,它会根据需求动态地创建并自动删除。

这种方法的工作流程大致如下:当Jenkins Master收到一个构建请求时,它会根据配置的Label动态地创建一个运行在Pod中的Jenkins Slave并将其注册到Master上。在运行完Job之后,这个Slave会被注销,Pod也会自动删除,恢复到原始状态。

设计优势

  • 动态伸缩

    合理的使用资源,每次运行 Job 时,会自动创建一个 Jenkins Slave,Job 完成后, Slave 自动注销并删除容器,资源自动释放,而且 Kubernetes 会根据每个资源的使用情况,动态分配 Slave 到空闲的节点上创建,降低出现因某节点资源利用率高, 还排队等待在该节点的情况。

  • 服务高可用

    当 Jenkins Master 出现故障时,Kubernetes 会自动创建一个新的 Jenkins Master 容器,并且将 Volume 分配给新创建的容器,保证数据不丢失,从而达到集群服务高可用。

  • 扩展性好

    当 Kubernetes 集群的资源严重不足而导致 Job 排队等待时,可以很容易的添加一 个 Kubernetes Node 到集群中,从而实现扩展。