您的位置:首页 > 其它

基于Kubernetes安装Jenkins并配置操作环境

2018-02-11 17:27 621 查看

一、 安装并配置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

初次访问

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云
下, 可新增
Kubernetes Pod Template
,配置一个模板容器配置。这样在任务配置时可使用label获取该模板配置进行应用,简化了任务配置。





全局配置

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



全局工具配置

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



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

创建Pipeline任务

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 部署操作,都可以通过配置生成执行脚本。

运行Pipeline任务

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



点击每一个stage步骤上的
logs
,可查看当前运行的log信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: