一、 安装并配置Kubernetes集群

本文中使用的kubernetes集群是1.8.0版本。具体安装配置步骤可查看这篇文章:​​Kubernetes1.8.3 集群环境搭建(CentOS)​​。

二、安装Jenkins

生成自定义Jenkins master镜像

原始的Jenkins master镜像并不符合我们当前需求,所以在原始镜像的基础上做了一些改变,这一步并不是必须的,主要是看具体需求。

原始镜像:jenkins/jenkins:2.89.3    该镜像从dockerhub上可直接下载

保存到本地仓库:192.168.1.184:5000/jenkins/jenkins:2.89.3-maven

Dockerfile:

FROM 192.168.1.184:5000/jenkins/jenkins:2.89.3
ENV MAVEN_VERSION 3.0.5
ENV JAVA_HOME /usr/java/jdk1.8.0_121
ENV MAVEN_HOME /opt/maven/apache-maven-${MAVEN_VERSION}
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# build java
COPY ./jdk1.8.0_121 ${JAVA_HOME}
COPY ./libltdl.so.7 /usr/lib/libltdl.so.7

# build maven
COPY apache-maven-${MAVEN_VERSION}-bin.tar.gz /tmp/maven/apache-maven-${MAVEN_VERSION}-bin.tar.gz
COPY settings.xml /tmp/maven/settings.xml
USER root:root
RUN mkdir -p /opt/maven/repository \
&& cd /opt/maven \
&& tar -zxvf /tmp/maven/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
&& cp /tmp/maven/settings.xml ${MAVEN_HOME}/conf/settings.xml \
&& rm -rf /tmp/maven

ENV PATH ${JAVA_HOME}/bin:${MAVEN_HOME}/bin:${PATH}

该Dockerfile所做的工作为: 
1. 重新安装Java环境并配置环境变量; 
2. 安装Maven并配置环境变量; 
3. 配置Maven仓库位置,以便启动时挂载宿主机仓库为容器中Maven仓库; 
4. 设置启动用户为root。

生成自定义Jenkins slave镜像

节点镜像的配置与master基本一致,也是根据自己需要进行自定义话,也可以直接使用原始的slave镜像。

原始镜像:jenkinsci/jnlp-slave:latest    该镜像从dockerhub上可直接下载

保存到本地仓库镜像:192.168.1.184:5000/jenkins/jnlp-slave:oracle-jdk-maven

Dockerfile:

FROM jenkinsci/jnlp-slave:latest
ENV MAVEN_VERSION 3.0.5
ENV JAVA_HOME /usr/java/jdk1.8.0_121
ENV MAVEN_HOME /opt/maven/apache-maven-${MAVEN_VERSION}
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# build java
COPY ./jdk1.8.0_121 ${JAVA_HOME}
COPY ./libltdl.so.7 /usr/lib/libltdl.so.7

# build maven
COPY apache-maven-${MAVEN_VERSION}-bin.tar.gz /tmp/maven/apache-maven-${MAVEN_VERSION}-bin.tar.gz
COPY settings.xml /tmp/maven/settings.xml
USER root:root
RUN mkdir -p /opt/maven/repository \
&& cd /opt/maven \
&& tar -zxvf /tmp/maven/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
&& cp /tmp/maven/settings.xml ${MAVEN_HOME}/conf/settings.xml \
&& rm -rf /tmp/maven \
&& apt-get -yq update \
&& apt-get -yq --no-install-recommends --no-install-suggests install sshpass \
&& apt-get clean -y

ENV PATH ${MAVEN_HOME}/bin:${PATH}

该Dockerfile操作与Jenkins master的Dockerfile基本一致。不过该镜像中缺少​​libltdl.so.7​​文件,需要从宿主机中拷贝进去,该文件在slave节点容器中使用docker时会用到,因此十分重要。

Jenkins启动YAML配置文件

Jenkins 权限配置

此处直接将​​jenkins-admin​​集成了​​cluster-admin​​权限,可根据自己具体需要进行权限的设置。

apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: jenkins
name: jenkins-admin
namespace: jenkins

---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: jenkins-admin
labels:
k8s-app: jenkins
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: jenkins
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io

---

Jenkins Deployment配置

此处配置简单明了,需要说明的地方是​​挂在卷​​,此处挂载了四个目录,下面分别做出挂载原因:​​/var/jenkins_home​​(容器) –> ​​/ceph/jenkins_home​​(宿主机) 

我们需要将容器中的Jenkins源目录挂载导本地宿主机,因为该目录下保存了Jenkins产生的所有配置、我们的自定义配置、任务配置及详情等等信息,所以需要持久化导宿主机,以便重新启动Jenkins容器的时候能够找到相应数据,防止数据丢失。此处我们使用的​​ceph​​,保证整个kubernetes集群所有机器能够共享同一个目录。​​/opt/maven/repository​​(容器) –> ​​/ceph/maven/repository​​(宿主机) 

这一对挂载目录是Maven仓库的挂载目录,不管是Jenkins master容器或者是Jenkins slave目录都需要挂载该目录,以便容器中maven能够在下载编译代码时能够从该仓库中找到相应Jar包,同时也保证了数据的持久化。​​/usr/bin/docker​​(容器) –> ​​/usr/bin/docker​​(宿主机) 

​/var/run/docker.sock​​(容器) –> ​​/var/run/docker.sock​​(宿主机) 

这两对挂载目录作用是能够在容器中操作宿主机docker,具体的用途是在slave容器中编辑maven代码并生成jar之后,需要生成该代码服务的docker镜像并上传至本地私有仓库。因此需要操作宿主机docker以便完成这一系列操作。

apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: jenkins
namespace: jenkins
labels:
k8s-app: jenkins
spec:
replicas: 1
selector:
matchLabels:
k8s-app: jenkins
template:
metadata:
labels:
k8s-app: jenkins
spec:
containers:
- name: jenkins
image: 192.168.1.184:5000/jenkins/jenkins:2.89.3-maven
imagePullPolicy: IfNotPresent
volumeMounts:
- name: jenkins-home
mountPath: /var/jenkins_home
- name: maven-repository
mountPath: /opt/maven/repository
- name: docker
mountPath: /usr/bin/docker
- name: docker-sock
mountPath: /var/run/docker.sock
ports:
- containerPort: 8080
- containerPort: 50000
volumes:
- name: jenkins-home
hostPath:
path: /ceph/jenkins_home
- name: maven-repository
hostPath:
path: /ceph/maven/repository
- name: docker
hostPath:
path: /usr/bin/docker
- name: docker-sock
hostPath:
path: /var/run/docker.sock
serviceAccountName: jenkins-admin
---

Jenkins Service配置

该Service配置作用是能够让用户访问到Jenkins。此处开放并配置了​​8080​​、​​50000​​端口,这两个端口在​​Deployment​​ 

中也应该开放。此处配置的宿主机开放端口分别为:​​31888​​、​​50000​

kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: jenkins
name: jenkins
namespace: jenkins
annotations:
prometheus.io/scrape: 'true'
spec:
ports:
- name: jenkins
port: 8080
nodePort: 31888
targetPort: 8080
- name: jenkins-agent
port: 50000
nodePort: 50000
targetPort: 50000
type: NodePort
selector:
k8s-app: jenkins

启动Jenkins镜像容器

kubectl apply -f jenkins-account.yaml
kubectl apply -f jenkins-deployment.yaml
kubectl apply -f jenkins-service.yaml

jenkins k8s_docker

三、访问并操作Jenkins

初次访问

​Jenkins​​容器启动后,通过​​192.168.1.185:31888​​即可访问​​Jenkins​​。注意:此处访问的IP是取决于你kubernetes集群的节点IP,此处我的Jenkins容器运行在192.168.1.185,因此我使用该链接可访问。首次访问,需要设置登录用户名密码: 

jenkins k8s_Jenkins_02

然后会要求安装一些插件,可选择默认安装,也可自定义选择要安装的插件: 

jenkins k8s_maven_03

一顿操作之后,插件也安装完毕,则会跳转到首页, 此时Jenkins就可以真正使用了: 

jenkins k8s_maven_04

需要安装的插件

​Kubernetes Cli Plugin​​:该插件可直接在Jenkins中使用kubernetes命令行进行操作。​​Kubernetes plugin​​: 使用kubernetes则需要安装该插件​​Kubernetes Continuous Deploy Plugin​​:kubernetes部署插件,可根据需要使用还有更多的插件可供大家选择,可点击 ​​系统管理​​->​​管理插件​​进行管理和添加 

jenkins k8s_docker_05

也可登录该网站:​​https://plugins.jenkins.io/​​,查找需要的插件。

kubernetes云配置

点击 ​​系统管理​​->​​系统设置​​,往下拉可看到​​云​​,点击​​新增一个云​​来新增一个kubernetes云。 

jenkins k8s_docker_06

在该​​kubernetes云​​下, 可新增​​Kubernetes Pod Template​​,配置一个模板容器配置。这样在任务配置时可使用label获取该模板配置进行应用,简化了任务配置。 

jenkins k8s_maven_07


jenkins k8s_maven_08

全局配置

点击 ​​系统管理​​->​​系统设置​​,下拉找到​​全局属性​​,可根据需要配置Java环境变量、Maven环境变量 

jenkins k8s_docker_09

全局工具配置

点击 ​​系统管理​​->​​全局工具配置​​,此处可配置配置一些常用的工具配置,比如java、ant、maven、docker。在此处配置好之后,在配置任务时通过 ​​${配置的name}​​即可获取到配置信息。此处配置Maven演示 

jenkins k8s_docker_10

此处配置了​​Maven​​的全局工具配置,则在任务配置时,通过​​${m3}​​即可获取到该配置。

创建Pipeline任务

Pipeline任务采用流式的处理方法,步骤清晰,非常适合进行任务配置。点击​​新建​​ 创建一个Pipeline任务。 

jenkins k8s_maven_11

创建完成后,会进入任务配置界面,下拉找到Pipeline(中文版为:流水线),则可编写Pipeline,进行任务配置。 

jenkins k8s_maven_12

Pipeline写法可通过网上教程学习,操作十分简单~ 从图中左下角可以看到有一个​​流水线写法​​,此项操作可通过配置的形式生成Pipeline代码。下面看一下。

流水线写法

点击任务配置页中Pipeline配置处左下角的流水线写法,则可通过配置生成Pipeline代码。 

jenkins k8s_docker_13

点击​​示例步骤​​,可选择要生成的步骤,此处拿获取登录密码来举例,大家在执行任务时,经常会遇到需要远程ssh到某台机器操作、上传下载docker私有仓库镜像等操作,而这些操作都需要输入用户名密码,但是在任务配置代码中直接显示的写用户名密码又是不行的,这个时候就需要有个地方能够保存密码,我们通过配置的变量获取,这样就避免了账号密码的泄露。正好jenkins提供这个插件,在流水线写法中即可生成该操作代码: 

jenkins k8s_maven_14

点击​​username and password (separated)​​ 

jenkins k8s_maven_15

根据上图中的配置,点击​​生成流水线脚本​​,即可生成代码: 

jenkins k8s_Jenkins_16

这段脚本如何使用?

withCredentials([usernamePassword(credentialsId: 'b47d0952-12e6-4499-a46e-355fd793d447', 
passwordVariable: 'ssh_password', usernameVariable: 'ssh_username')]) {
sh "sshpass -p ${ssh_password} scp xxx.txt ${ssh_username}@192.168.1.184:/tmp/"
}

从上面的代码就可以看出,只要将要执行的代码放到​​withCredentials​​大括号中,即可通过变量名获取到用户名、密码进行操作。

Pipeline流水线写法还有很多好用的插件可用,比如kubernetes ctl命令行使用,kubernetes 部署操作,都可以通过配置生成执行脚本。

运行Pipeline任务

编写完任务配置之后,点击保存跳转到任务操作页面,点击左侧​​立即构建​​,即可执行任务 

jenkins k8s_docker_17

点击每一个stage步骤上的​​logs​​,可查看当前运行的log信息。