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

一、 安装并配置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。此处开放并配置了808050000端口,这两个端口在Deployment
中也应该开放。此处配置的宿主机开放端口分别为:3188850000

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信息。

发布了112 篇原创文章 · 获赞 94 · 访问量 51万+

猜你喜欢

转载自blog.csdn.net/A632189007/article/details/79311795