linux cpu占用率如何看
332
2022-10-30
基于 kubernetes 的动态 jenkins slave
**基于 Jenkins 的 CI/CD**
既然要创建一个deployment,那我们先给他创建一个namespace
kubectl create namespace kube-ops
然后我们创建一个deployment
我们这里使用一个名为 jenkins/jenkins:lts 的镜像,这是 jenkins 官方的 Docker 镜像,然后也有一些环境变量,当然我们也可以根据自己的需求来定制一个镜像,比如我们可以将一些插件打包在自定义的镜像当中,可以参考文档:/var/jenkins_home 目录挂载到了一个名为 opspvc 的 PVC 对象上面,所以我们同样还得提前创建一个对应的 PVC 对象
我们为了测试方便,使用了nfs做到持久化存储
然后我们创建这个pvc对象。
kubectl apply -f pvc.yaml
我们这里还需要使用到一个拥有相关权限的 serviceAccount:jenkins2,我们这里只是给 jenkins 赋予了一些必要的权限,当然如果你对 serviceAccount 的权限不是很熟悉的话,我们给这个 sa 绑定一个 cluster-admin 的集群角色权限也是可以的,当然这样具有一定的安全风险:(rbac.yaml)
kubectl apply -f rbac.yaml
为了方便我们测试,我们这里通过 NodePort(后面会使用traefik,nginx-ingress) 的形式来暴露 Jenkins 的 web 服务,固定为30005端口,另外还需要暴露一个 agent 的端口,这个端口主要是用于 Jenkins 的 master 和 slave 之间通信使用的。
一切准备的资源准备好过后,我们直接创建 Jenkins 服务:
kubectl apply -f jenkins2.yaml
我们首次创建的时候
可以看到该 Pod 处于 Running 状态,但是 READY 值确为0,然后我们用 describe 命令去查看下该 Pod 的详细信息:
可以看到上面的 Warning 信息,健康检查没有通过,具体原因是什么引起的呢?可以通过查看日志进一步了解:
很明显可以看到上面的错误信息,意思就是我们没有权限在 jenkins 的 home 目录下面创建文件,这是因为默认的镜像使用的是 jenkins 这个用户,而我们通过 PVC 挂载到 nfs 服务器的共享数据目录下面却是 root 用户的,所以没有权限访问该目录,要解决该问题,也很简单,我只需要在 nfs 共享数据目录下面把我们的目录权限重新分配下即可:
chown -R 1000 /data/k8s/jenkins2
然后我们重建
kubectl delete jenkins2.yamlkubectl apply -f jenkins2.yaml
你就可以看到这个pods的状态已经是正常的了。
我们就可以通过任意节点的 IP:30005 端口就可以访问 jenkins 服务了,可以根据提示信息进行安装配置即可:
到了这个页面,我们就可以去pod里面获取密码了,或者在日志里面查看密码
kubectl exec -it jenkins2-6bbb7d9f4c-v9cfd -n kube-ops bash
然后就看到了jenkins的主页面了
先不要着集使用
我们知道持续构建与发布是我们日常工作中必不可少的一个步骤,目前大多公司都采用 Jenkins 集群来搭建符合需求的 CI/CD 流程,然而传统的 Jenkins Slave 一主多从方式会存在一些痛点,比如:
主 Master 发生单点故障时,整个流程都不可用了每个 Slave 的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是比较费劲资源分配不均衡,有的 Slave 要运行的 job 出现排队等待,而有的 Slave 处于空闲状态资源有浪费,每台 Slave 可能是物理机或者虚拟机,当 Slave 处于空闲状态时,也不会完全释放掉资源。
正因为上面的这些种种痛点,我们渴望一种更高效更可靠的方式来完成这个 CI/CD 流程,而 Docker 虚拟化容器技术能很好的解决这个痛点,又特别是在 Kubernetes 集群环境下面能够更好来解决上面的问题,下图是基于 Kubernetes 搭建 Jenkins 集群的简单示意图:
那么我们使用这种方式带来了哪些好处呢?
服务高可用,当 Jenkins Master 出现故障时,Kubernetes 会自动创建一个新的 Jenkins Master 容器,并且将 Volume 分配给新创建的容器,保证数据不丢失,从而达到集群服务高可用。动态伸缩,合理使用资源,每次运行 Job 时,会自动创建一个 Jenkins Slave,Job 完成后,Slave 自动注销并删除容器,资源自动释放,而且 Kubernetes 会根据每个资源的使用情况,动态分配 Slave 到空闲的节点上创建,降低出现因某节点资源利用率高,还排队等待在该节点的情况。扩展性好,当 Kubernetes 集群的资源严重不足而导致 Job 排队等待时,可以很容易的添加一个 Kubernetes Node 到集群中,从而实现扩展。
配置接下来我们就需要来配置 Jenkins,让他能够动态的生成 Slave 的 Pod。
我们先进去到插件管理
因为我已经安装了,你们只需要在可选插件里面选择kubernetes安装就好了。
安装好了之后,我们到系统管理的系统配置,拖到最下方,选择kubernetes
另外需要注意,如果这里 Test Connection 失败的话,很有可能是权限问题,这里就需要把我们创建的 jenkins 的 serviceAccount 对应的 secret 添加到这里的 Credentials 里面。
然后我们配置 Pod Template,其实就是配置 Jenkins Slave 运行的 Pod 模板,命名空间我们同样是用 kube-ops,Labels 这里也非常重要,对于后面执行 Job 的时候需要用到该值,然后我们这里使用的是 cnych/jenkins:jnlp 这个镜像,这个镜像是在官方的 jnlp 镜像基础上定制的,加入了 kubectl 等一些实用的工具。
后面运行的命令和命令参数我们给他删掉。
另外需要注意我们这里需要在下面挂载两个主机目录,一个是/var/run/docker.sock,该文件是用于 Pod 中的容器能够共享宿主机的 Docker,这就是大家说的 docker in docker 的方式,Docker 二进制文件我们已经打包到上面的镜像中了,另外一个目录下/root/.kube目录,我们将这个目录挂载到容器的 /root/.kube 目录下面这是为了让我们能够在 Pod 的容器中能够使用 kubectl 工具来访问我们的 Kubernetes 集群,方便我们后面在 Slave Pod 部署 Kubernetes 应用。
到这里我们的 Kubernetes Plugin 插件就算配置完成了。
然后我们创建一个自由项目。
然后我们保存。
我们测试构建。
在构建的时候,我们去看jenkins的状态,会创建一个jnlp的pod。
构建任务完成后,我们再去看pod列表,已经没有这个jnlp的pod的。
到这里我们就完成了使用 Kubernetes 动态生成 Jenkins Slave 的方法。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~