有用Jenkins的同学,都很清楚,针对真实生产,我们一般不会只有一个Jenkins运行服务器上,基本都会选择在另外一个或多个服务器上安装Jenkins的slave。
这文章讲的就是利用k8s去动态增减slave节点,运行一个job就创建一个pod作为jenkins slave,当job做完,就删除pod,这样就可以释放资源,大大减少成本。
打开Jenkins/Configure Global Security,
找到Agents,如下图,设置Port 为 Random,Agent protocols选Inbound TCP Agent Protocol/4 (TLS encryption),保存
打开Jenkins/Plugin Manager
搜索kubernetes并安装,结果如下:
在Kubenates的上创建devops命名空间,用于Jenkins使用
```
kubectl create namespace devops
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190924161701558.png)
在Kubernetes上为Jenkins构建创建有Cluster Admin权限的Service Account jenkins:
```
kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=devops:jenkins
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190924161912323.png)
这个步骤主要是生成P12 Certificate File提供给jenkins Master去调用Kubenetes,具体步骤如下:
Kubernetes Master上,打开~/.kube/config文件,复制相对应的内容,运行以下命令分别生成生成ca.crt, client.crt, client.key
# 复制certificate-authority-data的内容,运行以下命令生成client.crt
echo "" | base64 -d > ca.crt
# 复制client-certificate-data的内容,运行以下命令生成client.crt
echo "" | base64 -d > client.crt
# 复制client-key-data的内容,运行以下命令生成client.key
echo "" | base64 -d > client.key
以上3个命令参考下图做法:
再根据前面步骤生成的ca.crt, client.crt和client.key来生成PKCS12格式的cert.pfx
以下命令运行时,需要输入4位以上的密码
openssl pkcs12 -export -out cert.pfx -inkey client.key -in client.crt -certfile ca.crt
将上面生成的cert.pfx复制出来备用
添加cert.pfx到Jenkins Global Credential
如下图:
打开Manage Jenkins/Configure System, 找到Cloud ,点击Add a new cloud,选择Kubernetes
输入Name,比如kubernetes
复制上面步骤生成的ca.crt文件内容到Kubernetes server certificate key
输入上面创建的Kubernetes Namespace,devops
选择刚刚配好的Credential
点击“Test Connection"按钮测试Jenkins是否可以成功连接Kubernetes。
Pod Retention选择Never,这样每次Jenkins构建结束后(无论成功和失败)都会销毁Pod,达到动态创建和运行Jenkins Build Agent的目的。
继续第7部后续,点击 Add Pod Template
输入Name, 如:Jenkins_slave_practice
输入Namespace,devops
输入Labels, 如: Jenkins_slave_practice
点击Add Container
添加第一个Container
输入Name:jnlp
输入Docker image:jenkins/jnlp-slave:3.27-1-alpine
输入Working directory:/home/jenkins
继续添加第二个Container
输入Name:maven
输入Docker image:maven:3.6-jdk-8-alpine
输入Working directory:/home/jenkins
输入Command to run: /bin/sh -c
输入Arguments to pass to the command:cat
如图:
找到Volumes, 点击Add Volume,选择Host Path Volume
输入Host Path : /root/.m2
输入Mount Path: /root/.m2
创建一个Jenkins Pipeline来测试Jenkins是否可以动态地在Kubernetes上创建和运行Build Agent。
使用了Maven的Pipeline实例:
pipeline {
agent {
node {
label 'Jenkins_slave_practice'
}
}
stages {
stage('Init') {
steps{
script{
println "welcome to Nick learn"
}
}
}
stage('maven') {
steps{
script{
container('maven') {
sh 'mvn -v'
}
}
}
}
}
}