Jenkins 集成k8s 运行Jenkins slave(Jenkins 弹性slave)

目录

    • 前言
    • Jenkins 基本配置
      • 设置JNLP访问协议
      • 安装kubernetes plugins
    • 创建Kubernetes Namespace与Service Account
      • 创建Namespace
      • 创建Service Account
    • 生成调度凭证
      • 生成Kubernetes的 server certificate key和Client P12 Certificate File
    • 在Jenkins上集成Kubernetes
      • 在Jenkins上配置Kubernetes Credential
      • 在Jenkins上配置Kubernetes Cloud
      • 在Jenkins上配置Kubernetes Pod Template
    • 创建声明式Pipeline,调用Jenkins Slave

前言

有用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),保存
Jenkins 集成k8s 运行Jenkins slave(Jenkins 弹性slave)_第1张图片

安装kubernetes plugins

打开Jenkins/Plugin Manager
搜索kubernetes并安装,结果如下:
在这里插入图片描述

创建Kubernetes Namespace与Service Account

创建Namespace

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

```
kubectl create namespace devops
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190924161701558.png)

创建Service Account

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

```
kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=devops:jenkins
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190924161912323.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
在这里插入图片描述
Jenkins 集成k8s 运行Jenkins slave(Jenkins 弹性slave)_第2张图片

# 复制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个命令参考下图做法:
Jenkins 集成k8s 运行Jenkins slave(Jenkins 弹性slave)_第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 集成k8s 运行Jenkins slave(Jenkins 弹性slave)_第4张图片

在Jenkins上集成Kubernetes

在Jenkins上配置Kubernetes Credential

将上面生成的cert.pfx复制出来备用
添加cert.pfx到Jenkins Global Credential
如下图:
Jenkins 集成k8s 运行Jenkins slave(Jenkins 弹性slave)_第5张图片

Jenkins 集成k8s 运行Jenkins slave(Jenkins 弹性slave)_第6张图片

在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 集成k8s 运行Jenkins slave(Jenkins 弹性slave)_第7张图片
Jenkins 集成k8s 运行Jenkins slave(Jenkins 弹性slave)_第8张图片

在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
如图:
Jenkins 集成k8s 运行Jenkins slave(Jenkins 弹性slave)_第9张图片
找到Volumes, 点击Add Volume,选择Host Path Volume
输入Host Path : /root/.m2
输入Mount Path: /root/.m2
Jenkins 集成k8s 运行Jenkins slave(Jenkins 弹性slave)_第10张图片

创建声明式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'	
    			}
    		}
    	}	
    }
  }
}

结果如下:
Jenkins 集成k8s 运行Jenkins slave(Jenkins 弹性slave)_第11张图片

你可能感兴趣的:(k8s,jenkins,devops)