Jenkins 集成k8s 运行Jenkins slave(Jenkins 弹性slave)
阅读原文时间:2021年04月23日阅读:1

目录

前言

有用Jenkins的同学,都很清楚,针对真实生产,我们一般不会只有一个Jenkins运行服务器上,基本都会选择在另外一个或多个服务器上安装Jenkins的slave。
这文章讲的就是利用k8s去动态增减slave节点,运行一个job就创建一个pod作为jenkins slave,当job做完,就删除pod,这样就可以释放资源,大大减少成本。

Jenkins 基本配置

设置JNLP访问协议

打开Jenkins/Configure Global Security,
找到Agents,如下图,设置Port 为 Random,Agent protocols选Inbound TCP Agent Protocol/4 (TLS encryption),保存

安装kubernetes plugins

打开Jenkins/Plugin Manager
搜索kubernetes并安装,结果如下:

创建Kubernetes Namespace与Service Account

创建Namespace

在Kubenates的上创建devops命名空间,用于Jenkins使用

```
kubectl create namespace devops
```
![](https://article.cdnof.com/2104/a44b3981-ca78-41c7-8b05-d4568d39d043.png)

创建Service Account

在Kubernetes上为Jenkins构建创建有Cluster Admin权限的Service Account jenkins:

```
kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=devops:jenkins
```
![](https://article.cdnof.com/2104/19292c2d-3c17-4f5f-a7ab-faee45156006.png)

生成调度凭证

生成Kubernetes的 server certificate key和Client P12 Certificate File

这个步骤主要是生成P12 Certificate File提供给jenkins Master去调用Kubenetes,具体步骤如下:
Kubernetes Master上,打开~/.kube/config文件,复制相对应的内容,运行以下命令分别生成生成ca.crt, client.crt, client.key

# 复制certificate-authority-data的内容,运行以下命令生成client.crt
echo "<certificate-authority-data>" | base64 -d > ca.crt
# 复制client-certificate-data的内容,运行以下命令生成client.crt
echo "<client-certificate-data>" | base64 -d > client.crt

# 复制client-key-data的内容,运行以下命令生成client.key
echo "<client-key-data>" | 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

在Jenkins上集成Kubernetes

在Jenkins上配置Kubernetes Credential

将上面生成的cert.pfx复制出来备用
添加cert.pfx到Jenkins Global Credential
如下图:

在Jenkins上配置Kubernetes Cloud

打开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的目的。

在Jenkins上配置Kubernetes Pod Template

继续第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

创建声明式Pipeline,调用Jenkins Slave

创建一个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'   
                }
            }
        }   
    }
  }
}

结果如下: