kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理
jenkins在k8s中动态创建slave代理
https://mp.weixin.qq.com/s/C82DsWV9oK23lfOJiunkhA
https://help.aliyun.com/document_detail/106712.html?spm=a2c4g.11186623.6.813.626e4330lQtSFi
接下来需要来配置 Jenkins,让他能够动态的生成 Slave 的 Pod。
Slave主要是解决单点负载的问题,分布式的master-slve架构,master主要负责负载地调度,slave执行构建任务,可以很好地解决性能问题。
这个创建是按需的,只要构建完成slave 的pod就会自动销毁
1 安装kubernetes插件
点击 Manage Jenkins -> Manage Plugins -> Available -> Kubernetes勾选安装即可。
2 Jenkins配置k8s信息
安装完毕后,点击 Manage Jenkins —> Configure System —> (拖到最下方)Add a new cloud —> 选择 Kubernetes,然后填写 Kubernetes 和 Jenkins 配置信息。
注意 namespace,我们这里填 kube-ops,然后点击Test Connection,如果出现 Connection test successful 的提示信息证明 Jenkins 已经可以和 Kubernetes 系统正常通信了,然后下方的 Jenkins URL 地址:http://jenkins2.kube-ops.svc.cluster.local:8080,这里的格式为:服务名.namespace.svc.cluster.local:8080,根据上面创建的jenkins 的服务名填写
另外需要注意,如果这里 Test Connection 失败的话,很有可能是权限问题,这里就需要把我们创建的 jenkins 的 serviceAccount 对应的 secret 添加到这里的 Credentials 里面。
3 配置 Pod Template
其实就是配置 Jenkins Slave 运行的 Pod 模板,命名空间我们同样是用 kube-ops,Labels 这里也非常重要,对于后面执行 Job 的时候需要用到该值,然后我们这里使用的是 cnych/jenkins:jnlp 这个镜像,这个镜像是在官方的 jnlp 镜像基础上定制的,加入了 kubectl 等一些实用的工具。
使用jenkins-slave-jnlp作为Docker镜像。jenkins-slave-jnlp用于构建节点jnlp连接master。
由于新版本的 Kubernetes 插件变化较多,如果你使用的 Jenkins 版本在 2.176.x 版本以上,注意将上面的镜像替换成cnych/jenkins:jnlp6
,否则使用会报错,配置如下图所示:
另外需要注意我们这里需要在下面挂载两个主机目录,一个是/var/run/docker.sock
,该文件是用于 Pod 中的容器能够共享宿主机的 Docker,这就是大家说的 docker in docker 的方式,Docker 二进制文件我们已经打包到上面的镜像中了,另外一个目录下/root/.kube
目录,我们将这个目录挂载到容器的/root/.kube
目录下面这是为了让我们能够在 Pod 的容器中能够使用 kubectl 工具来访问我们的 Kubernetes 集群,方便我们后面在 Slave Pod 部署 Kubernetes 应用。
另外还有几个参数需要注意,如下图中的Time in minutes to retain slave when idle,这个参数表示的意思是当处于空闲状态的时候保留 Slave Pod 多长时间,这个参数最好我们保存默认就行了,如果你设置过大的话,Job 任务执行完成后,对应的 Slave Pod 就不会立即被销毁删除。
如果出现了权限问题,因为 Jenkins Slave Pod 中没有配置权限,所以需要配置上 ServiceAccount,在 Slave Pod 配置的地方点击下面的高级,添加上对应的 ServiceAccount 即可:
如果出现配置完成后发现启动 Jenkins Slave Pod 的时候,出现 Slave Pod 连接不上,然后尝试100次连接之后销毁 Pod,然后会再创建一个 Slave Pod 继续尝试连接,无限循环,类似于下面的信息
到这里我们的 Kubernetes Plugin 插件就算配置完成了。
4 自由风格测试
Kubernetes 插件的配置工作完成了,接下来我们就来添加一个 Job 任务,看是否能够在 Slave Pod 中执行,任务执行完成后看 Pod 是否会被销毁。
在 Jenkins 首页点击create new jobs,创建一个测试的任务,输入任务名称,然后我们选择 Freestyle project 类型的任务:
注意在下面的 Label Expression 这里要填入wx-jnlp,就是前面我们配置的 Slave Pod 中的 Label,这两个地方必须保持一致
然后往下拉,在 Build 区域选择Execute shell
echo "测试 Kubernetes 动态生成 jenkins slave" echo "==============docker in docker===========" docker info echo "=============kubectl=============" kubectl get pods
最后点击保存
现在我们直接在页面点击立即构建 触发构建即可,然后观察 Kubernetes 集群中 Pod 的变化
gnlp6这个镜像很大,需要下载很长时间,我都是docker提前下载的,否则很容易测试失败
kubectl get pods NAME READY STATUS RESTARTS AGE jenkins2-8b7f7bdb7-h9kzt 1/1 Running 0 22m jnlp-s2kfk 1/1 Running 0 19s
我们可以看到在我们点击立刻构建的时候可以看到一个新的 Pod:jnlp-s2kfk 被创建了,这就是我们的 Jenkins Slave。任务执行完成后我们可以看到任务信息
到这里证明我们的任务已经构建完成,然后这个时候我们再去集群查看我们的 Pod 列表,发现 kube-ops 这个 namespace 下面已经没有之前的 Slave 这个 Pod 了。
执行完成,pod自动销毁。
[root@k8s-master ~]# kubectl -n kube-ops get pod NAME READY STATUS RESTARTS AGE jenkins2-8b7f7bdb7-h9kzt 1/1 Running 0 84m
到这里我们就完成了使用 Kubernetes 动态生成 Jenkins Slave