天天看点

Jenkins 基于k8s应用

当前k8s平台已趋于普及,传统的主机部署jenkins面临以下问题:

主 master 发生单点故障时,整个流程都不可用了

每个 slave 的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是比较费劲

资源分配不均衡,有的 slave 要运行的 job 出现排队等待,而有的 slave 处于空闲状态

资源有浪费,每台 slave 可能是物理机或者虚拟机,当 slave 处于空闲状态时,也不会完全释放掉资源。

正因为上面的这些种种痛点,我们渴望一种更高效更可靠的方式来完成这个 ci/cd 流程,而 docker 虚拟化容器技术能很好的解决这个痛点,又特别是在 kubernetes 集群环境下面能够更好来解决上面的问题,下图是基于 kubernetes 搭建 jenkins 集群的简单示意图:

Jenkins 基于k8s应用

从图上可以看到 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的持久化存储pv、pvc

因为jenkins需要动态创建pod,需要操作k8s的api,因此需要创建授权

创建jenkins服务deployment

启动如果报如下错误(因为我们容器里是以jenkins用户启动,而我们nfs服务器上是root启动,所以没有权限):

然后给我们nfs服务器上的目录授权即可:

然后登录网站,我们直接在浏览器用这个端口访问:

Jenkins 基于k8s应用

密码可以通过如下命令获得:

安装插件kubernetes

Jenkins 基于k8s应用

填写kubernetes和jenkins的配置信息

系统管理-->节点管理-->configure clouds

Jenkins 基于k8s应用
Jenkins 基于k8s应用
Jenkins 基于k8s应用
Jenkins 基于k8s应用
Jenkins 基于k8s应用
Jenkins 基于k8s应用
Jenkins 基于k8s应用

参考:k8s部署gitlab

gitlb 项目需要放dockerfile、yaml文件

模板如下:

脚本如下:

脚本二:

继续阅读