本文中使用的kubernetes集群是1.8.0版本。具体安装配置步骤可查看这篇文章:Kubernetes1.8.3 集群环境搭建(CentOS)。
原始的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。
节点镜像的配置与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-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
---
此处配置简单明了,需要说明的地方是挂在卷
,此处挂载了四个目录,下面分别做出挂载原因:
/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
---
该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
kubectl apply -f jenkins-account.yaml
kubectl apply -f jenkins-deployment.yaml
kubectl apply -f jenkins-service.yaml
Jenkins
容器启动后,通过192.168.1.185:31888
即可访问Jenkins
。注意:此处访问的IP是取决于你kubernetes集群的节点IP,此处我的Jenkins容器运行在192.168.1.185,因此我使用该链接可访问。
然后会要求安装一些插件,可选择默认安装,也可自定义选择要安装的插件:
一顿操作之后,插件也安装完毕,则会跳转到首页, 此时Jenkins就可以真正使用了:
Kubernetes Cli Plugin
:该插件可直接在Jenkins中使用kubernetes命令行进行操作。
Kubernetes plugin
: 使用kubernetes则需要安装该插件
Kubernetes Continuous Deploy Plugin
:kubernetes部署插件,可根据需要使用
还有更多的插件可供大家选择,可点击 系统管理
->管理插件
进行管理和添加
也可登录该网站:https://plugins.jenkins.io/,查找需要的插件。
点击 系统管理
->系统设置
,往下拉可看到云
,点击新增一个云
来新增一个kubernetes云。
在该kubernetes云
下, 可新增Kubernetes Pod Template
,配置一个模板容器配置。这样在任务配置时可使用label获取该模板配置进行应用,简化了任务配置。
点击 系统管理
->系统设置
,下拉找到全局属性
,可根据需要配置Java环境变量、Maven环境变量
点击 系统管理
->全局工具配置
,此处可配置配置一些常用的工具配置,比如java、ant、maven、docker。在此处配置好之后,在配置任务时通过 ${配置的name}
即可获取到配置信息。此处配置Maven演示
此处配置了Maven
的全局工具配置,则在任务配置时,通过${m3}
即可获取到该配置。
Pipeline任务采用流式的处理方法,步骤清晰,非常适合进行任务配置。点击新建
创建一个Pipeline任务。
创建完成后,会进入任务配置界面,下拉找到Pipeline(中文版为:流水线),则可编写Pipeline,进行任务配置。
Pipeline写法可通过网上教程学习,操作十分简单~ 从图中左下角可以看到有一个流水线写法
,此项操作可通过配置的形式生成Pipeline代码。下面看一下。
点击任务配置页中Pipeline配置处左下角的流水线写法,则可通过配置生成Pipeline代码。
点击示例步骤
,可选择要生成的步骤,此处拿获取登录密码来举例,大家在执行任务时,经常会遇到需要远程ssh到某台机器操作、上传下载docker私有仓库镜像等操作,而这些操作都需要输入用户名密码,但是在任务配置代码中直接显示的写用户名密码又是不行的,这个时候就需要有个地方能够保存密码,我们通过配置的变量获取,这样就避免了账号密码的泄露。正好jenkins提供这个插件,在流水线写法中即可生成该操作代码:
点击username and password (separated)
这段脚本如何使用?
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 部署操作,都可以通过配置生成执行脚本。
编写完任务配置之后,点击保存跳转到任务操作页面,点击左侧立即构建
,即可执行任务
点击每一个stage步骤上的logs
,可查看当前运行的log信息。