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执行构建任务,可以很好地解决性能问题。

kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

这个创建是按需的,只要构建完成slave 的pod就会自动销毁

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

1  安装kubernetes插件

点击 Manage Jenkins -> Manage Plugins -> Available -> Kubernetes勾选安装即可。

 

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 

2 Jenkins配置k8s信息

安装完毕后,点击 Manage Jenkins —> Configure System —> (拖到最下方)Add a new cloud —> 选择 Kubernetes,然后填写 Kubernetes 和 Jenkins 配置信息。

kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 

注意 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(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 

 

 

由于新版本的 Kubernetes 插件变化较多,如果你使用的 Jenkins 版本在 2.176.x 版本以上,注意将上面的镜像替换成cnych/jenkins:jnlp6,否则使用会报错,配置如下图所示:

 

 

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 

 

另外需要注意我们这里需要在下面挂载两个主机目录,一个是/var/run/docker.sock,该文件是用于 Pod 中的容器能够共享宿主机的 Docker,这就是大家说的 docker in docker 的方式,Docker 二进制文件我们已经打包到上面的镜像中了,另外一个目录下/root/.kube目录,我们将这个目录挂载到容器的/root/.kube目录下面这是为了让我们能够在 Pod 的容器中能够使用 kubectl 工具来访问我们的 Kubernetes 集群,方便我们后面在 Slave Pod 部署 Kubernetes 应用。

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 

另外还有几个参数需要注意,如下图中的Time in minutes to retain slave when idle,这个参数表示的意思是当处于空闲状态的时候保留 Slave Pod 多长时间,这个参数最好我们保存默认就行了,如果你设置过大的话,Job 任务执行完成后,对应的 Slave Pod 就不会立即被销毁删除。

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 

 

如果出现了权限问题,因为 Jenkins Slave Pod 中没有配置权限,所以需要配置上 ServiceAccount,在 Slave Pod 配置的地方点击下面的高级,添加上对应的 ServiceAccount 即可:

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 

 

如果出现配置完成后发现启动 Jenkins Slave Pod 的时候,出现 Slave Pod 连接不上,然后尝试100次连接之后销毁 Pod,然后会再创建一个 Slave Pod 继续尝试连接,无限循环,类似于下面的信息

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 

到这里我们的 Kubernetes Plugin 插件就算配置完成了。

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 

 

4  自由风格测试

Kubernetes 插件的配置工作完成了,接下来我们就来添加一个 Job 任务,看是否能够在 Slave Pod 中执行,任务执行完成后看 Pod 是否会被销毁。

在 Jenkins 首页点击create new jobs,创建一个测试的任务,输入任务名称,然后我们选择 Freestyle project 类型的任务:

kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 

注意在下面的 Label Expression 这里要填入wx-jnlp,就是前面我们配置的 Slave Pod 中的 Label,这两个地方必须保持一致

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 

 

然后往下拉,在 Build 区域选择Execute shell

 

echo "测试 Kubernetes 动态生成 jenkins slave"
echo "==============docker in docker==========="
docker info

echo "=============kubectl============="
kubectl get pods

 

最后点击保存

 

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 

 

现在我们直接在页面点击立即构建 触发构建即可,然后观察 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。任务执行完成后我们可以看到任务信息

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建slave代理

 

 kubernetes(33):持续集成(2)-jenkins在k8s中动态创建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

 

相关文章: