目录

  • 前言
  • 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),保存

k8s docker jenkins区别 k8s和jenkins实战_maven

安装kubernetes plugins

打开Jenkins/Plugin Manager

搜索kubernetes并安装,结果如下:

k8s docker jenkins区别 k8s和jenkins实战_Jenkins_02

创建Kubernetes Namespace与Service Account

创建Namespace

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

```
kubectl create namespace devops
```
![在这里插入图片描述]()

创建Service Account

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

```
kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=devops:jenkins
```
![在这里插入图片描述]()

生成调度凭证

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

这个步骤主要是生成P12 Certificate File提供给jenkins Master去调用Kubenetes,具体步骤如下:

Kubernetes Master上,打开~/.kube/config文件,复制相对应的内容,运行以下命令分别生成生成ca.crt, client.crt, client.key

k8s docker jenkins区别 k8s和jenkins实战_Jenkins_03


k8s docker jenkins区别 k8s和jenkins实战_maven_04

# 复制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个命令参考下图做法:

k8s docker jenkins区别 k8s和jenkins实战_jenkins_05


再根据前面步骤生成的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

k8s docker jenkins区别 k8s和jenkins实战_Pod_06

在Jenkins上集成Kubernetes

在Jenkins上配置Kubernetes Credential

将上面生成的cert.pfx复制出来备用

添加cert.pfx到Jenkins Global Credential

如下图:

k8s docker jenkins区别 k8s和jenkins实战_devops_07

k8s docker jenkins区别 k8s和jenkins实战_maven_08

在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的目的。

k8s docker jenkins区别 k8s和jenkins实战_jenkins_09


k8s docker jenkins区别 k8s和jenkins实战_maven_10

在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

如图:

k8s docker jenkins区别 k8s和jenkins实战_Jenkins_11


找到Volumes, 点击Add Volume,选择Host Path Volume

输入Host Path : /root/.m2

输入Mount Path: /root/.m2

k8s docker jenkins区别 k8s和jenkins实战_Pod_12

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

结果如下:

k8s docker jenkins区别 k8s和jenkins实战_Pod_13