詹金斯的部署和管道工作验证测试

  

这篇文章给大家分享的是有关jenkins的部署和pipeline job 验证测试。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

一、背景介绍

目前很多企业应用都已经容器化,版本发布比较多,构建的次数也比较多,相对于之前单台 jenkins 有了很大的挑战
,传统的 Jenkins Slave 一主多从方式会存在一些痛点:

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

jenkins集群架构图

jenkins的部署和pipeline job 验证测试

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

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

这种方式带来的好处有很多:

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

二、部署 jenkins

我们把 master 节点部署到 k8s 集群中,大家可以参照 官方 github 文档进行配置,我这里进行了一点简化,我这里使用的是 nfs 来存储 jenkins 的数据,用于进行持久存储。

kubectl apply -f https://raw.githubusercontent.com/wangzan18/jenkins-agent-k8s-cicd/master/master/jenkins.yaml

说明一下:这里 Service 我们暴漏了端口 8080 和 50000,8080 为访问 Jenkins Server 页面端口,50000 为创建的 Jenkins Slave 与 Master 建立连接进行通信的默认端口,如果不暴露的话,Slave 无法跟 Master 建立连接。这里使用 NodePort 方式暴漏端口,并未指定其端口号,由 Kubernetes 系统默认分配,当然也可以指定不重复的端口号(范围在 30000~32767)。

2.1、配置 kubernetes plugin

Jenkins 的配置过程我这里不再掩饰,我们直接配置 kubernetes plugin。
管理员账户登录 Jenkins Master 页面,点击 “系统管理” —> “管理插件”→“可选插件”→“Kubernetes插件”勾选安装即可。

詹金斯的部署和管道工作验证测试

安装完毕后,点击”系统管理”→“系统设置”→“新增一个云”→选择“Kubernetes”,然后填写Kubernetes和詹金斯配置信息。

詹金斯的部署和管道工作验证测试

说明一下:

    <李> <>强名称处默认为Kubernetes,也可以修改为其他名称,如果这里修改了,下边在执行工作时指定podTemplate()参数云为其对应名称,否则会找不到,云默认值取:Kubernetes。 <李> <强> Kubernetes URL处我填写了https://kubernetes这里我填写了Kubernetes服务对应的DNS记录,通过该DNS记录可以解析成该服务的集群IP,注意:也可以填https://kubernetes.default.svc.cluster.local写完整DNS记录,因为它要符合<代码>,lt; svc_name& gt;。amp;肝移植;namespace_name& gt; .svc.cluster。当地>

    詹金斯的部署和管道工作验证测试