痛点
由于公司的特殊性,对于代码管理和安全管理比较严格,代码和发版配置不能放到一起,本来打算使用gitlab CICD 方式自动化发布,基于上面因素,只能有两种选择,自己开发一套或者使用Jenkins,分离代码和发版配置。
经过一番考虑还是选择Jenkins Slave。

但是传统的 Jenkins Slave 一主多从方式会存在一些痛点,比如:

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

正因为上面的这些种种痛点,我们渴望一种更高效更可靠的方式来完成这个 CI/CD 流程,而 Docker 虚拟化容器技术能很好的解决这个痛点,又特别是在 Kubernetes 集群环境下面能够更好来解决上面的问题,下图是基于 Kubernetes 搭建 Jenkins 集群的简单示意图:
image.png
从图上可以看到 Jenkins Master 和 Jenkins Slave 以 Pod 形式运行在 Kubernetes 集群的 Node 上,Master 运行在其中一个节点,并且将其配置数据存储到一个 Volume 上去,Slave 运行在各个节点上,并且它不是一直处于运行状态,它会按照需求动态的创建并自动删除。

这种方式的工作流程大致为:当 Jenkins Master 接受到 Build 请求时,会根据配置的 Label 动态创建一个运行在 Pod 中的 Jenkins Slave 并注册到 Master 上,当运行完 Job 后,这个 Slave 会被注销并且这个 Pod 也会自动删除,恢复到最初状态。

那么我们使用这种方式带来了哪些好处呢?

  • 服务高可用,当 Jenkins Master 出现故障时,Kubernetes 会自动创建一个新的 Jenkins Master 容器,并且将 Volume 分配给新创建的容器,保证数据不丢失,从而达到集群服务高可用。
  • 动态伸缩,合理使用资源,每次运行 Job 时,会自动创建一个 Jenkins Slave,Job 完成后,Slave 自动注销并删除容器,资源自动释放,而且 Kubernetes 会根据每个资源的使用情况,动态分配 Slave 到空闲的节点上创建,降低出现因某节点资源利用率高,还排队等待在该节点的情况。
  • 扩展性好,当 Kubernetes 集群的资源严重不足而导致 Job 排队等待时,可以很容易的添加一个 Kubernetes Node 到集群中,从而实现扩展。


安装Jenkins

官网文档:https://www.jenkins.io/doc/book/installing/kubernetes/#install-jenkins-with-helm-v3

环境准备
需要一个正在运行的集群。

1、Create a namespace

  1. kubectl create namespace jenkins
  2. kubectl get namespaces

2、Install Jenkins with Helm v3

2.1、安装 Helm

如果没有helm工具,需要先参考https://helm.sh/docs/intro/install/ 进行安装
helm版本最好大于v3.2

  1. #github经常打不开,也可以使用下面脚本方式安装
  2. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
  3. chmod 700 get_helm.sh
  4. ./get_helm.sh

2.2、安装配置jenkins helm安装源

  1. helm repo add jenkinsci https://charts.jenkins.io
  2. helm repo update
  3. helm search repo jenkinsci

3、Create a persistent volume

3.1、创建一个名字叫jenkins-pv的pv

  1. wget https://dadong-files.oss-cn-beijing.aliyuncs.com/yamls/jenkins-volume.yaml

3.2、创建volume

  1. kubectl apply -f jenkins-volume.yaml
  2. kubectl get pv -n jenkins

官网这里选择使用的pv为宿主机上的目录,采用hostPath方式,由于我使用的是阿里云的资源,因此这里我没有操作,等后面修改value.yaml文件的使用指定使用阿里云资源,让集群替我创建一个磁盘。

4、创建账户 Create a service account

4.1、创建账户yaml文件

  1. wget https://dadong-files.oss-cn-beijing.aliyuncs.com/yamls/jenkins-sa.yaml

4.2、创建账户

  1. kubectl apply -f jenkins-sa.yaml

5、安装jenkins

5.1、下载value.yaml文件