k8s 部署jenkins

本篇主要讲解一下 jenkins 在 k8s 下面是如何部署的,主要对jenkins_home、maven 的一些挂载 和 docker 程序的挂载 ,使其让 pod中的 jenkins 支持 maven docker 等功能,并且当pod删除时不丢失 jenkins_home

1.根据官网 安装 简易版Jenkins

在Jenkins的官网的 安装教程部分其实就有 k8s的安装教程

jenkins 设置多个k8s jenkins整合k8s_springboot

我们选择使用 YAML文件的方式安装 也可以选择 Helm 安装

jenkins 设置多个k8s jenkins整合k8s_maven_02


在其中可以找到官方给的 yaml 案例文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      containers:
      - name: jenkins
        image: jenkins/jenkins:lts-jdk11
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: jenkins-home
          mountPath: /var/jenkins_home
      volumes:
      - name: jenkins-home
        emptyDir: { }

安装一下

kubectl create -f jenkins-init.yaml

jenkins 设置多个k8s jenkins整合k8s_jenkins 设置多个k8s_03

官网提供的service 模板 https://raw.githubusercontent.com/jenkins-infra/jenkins.io/master/content/doc/tutorials/kubernetes/installing-jenkins-on-kubernetes/jenkins-service.yaml

配置一个Service

apiVersion: v1
kind: Service
metadata:
  name: jenkins-init-service
spec:
  type: NodePort
  ports:
  - port: 7096 #端口修改成这个
    targetPort: 8080
      selector:
    app: jenkins-init

访问 http://192.168.56.21:30128/,端口可以查看

jenkins 设置多个k8s jenkins整合k8s_spring_04

访问后就如下,

jenkins 设置多个k8s jenkins整合k8s_maven_05

可以查看对应的日志 里面会有初始化密码

kubectl logs -f jenkins-init-7f7c5cbd74-p9q2d
*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

ab274da4bb784dcebf43b7d868fe8947

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

至此,简易版的jenkins 就安装好了,但是存在一些问题,比如pod如果丢了,那么你的jenkins的 所有配置都会消失,因为上面没有进行挂在 jenkins_home 目录还有docker没有进行挂在还有 maven 没有进行配置,等等 存在很多问题 , 下面我来讲解一下 如何解决这些问题

2.构建jenkins + maven的镜像

由于一般项目构建 都需要 maven 进行构建,那么如果按照上面的配置是没有maven的环境的,下面就来通过Dockerfile 构建一个 带 maven环境的 jenkins镜像

FROM jenkins/jenkins:lts-jdk11

ADD ./apache-maven-3.8.5-bin.tar.gz /usr/local/ #把 maven包给add 进去
ENV  MAVEN_HOME=/usr/local/apache-maven-3.8.5
ENV  PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH

USER root

RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
USER jenkins

jenkins 设置多个k8s jenkins整合k8s_java_06

打成镜像后 ,可以上传到 harbor上面

harbor.demo.com:5667/custome-images/jenkins-maven   v1                   6c4d10ef7b35

3.k8s 部署 jenkins 并且配置 maven+docker环境

有了上面的 jenkins+maven 镜像,下面我们来使用 k8s 构建一个 具有 maven 和 docker 环境的 jenkins,并且保证在Pod丢失后 不会丢失jenkins的工作目录

3.1 修改配置文件
  1. 修改镜像为 jenkins+maven镜像
  2. 指定jenkins 以ROOT用户启动容器
  3. 挂载 jenkins_home 目录到宿主机 /mnt/jenkins_home/
  4. 挂载宿主机的 docker 进程 到 jenkins /run/docker.sock
  5. 挂载maven的settings.xml 到/usr/local/apache-maven-3.8.5/conf/settings.xml (settings.xml已经修改为阿里云镜像地址)
  6. 挂载 /etc/docker/daemon.json 保证能够访问harbor 以及和阿里云的仓库地址
  7. 配置Service
  8. 配置Ingress
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      nodeSelector:
        app: jenkins
      imagePullSecrets:
        - name: loginharbor
      containers:
        - name: jenkins
          image: harbor.demo.com:5667/custome-images/jenkins-maven:v1
          securityContext:
            runAsUser: 0                      #设置以ROOT用户运行容器
            privileged: true
          ports:
            - containerPort: 8080
          volumeMounts:
            - name: jenkins-home
              mountPath: /var/jenkins_home
            - name: docker
              mountPath: /run/docker.sock
            - name: docker-home
              mountPath: /usr/bin/docker
            - name: mvn-setting
              mountPath: /usr/local/apache-maven-3.8.5/conf/settings.xml
              subPath: settings.xml
            - name: repository
              mountPath: /root/.m2/repository
            - name: daemon
              mountPath: /etc/docker/daemon.json
              subPath: daemon.json
      volumes:
        - name: jenkins-home
          hostPath:
            path: /mnt/jenkins_home/
        - name: docker
          hostPath:
            path: /run/docker.sock
            type: ""
        - name: docker-home
          hostPath:
            path: /usr/bin/docker
            type: ""
        - name: mvn-setting
          configMap:
            name: settings.xml
            items:
            - key: settings.xml
              path: settings.xml
        - name: repository
          hostPath:
            path: /mnt/repository
            type: ""
        - name: daemon
          hostPath:
            path: /etc/docker/
            type: ""

---
apiVersion: v1
kind: Service
metadata:
  name: jenkins
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
  selector:
    app: jenkins


---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jenkins-ingress
  labels:
    name: jenkins-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: jenkins.demo.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: jenkins
            port:
              number: 8080

jenkins 设置多个k8s jenkins整合k8s_springboot_07

jenkins 设置多个k8s jenkins整合k8s_maven_08

jenkins 设置多个k8s jenkins整合k8s_maven_09

jenkins 设置多个k8s jenkins整合k8s_jenkins 设置多个k8s_10

总结

至此 使用 k8s 部署 jenkins 就完成了,主要是对于 maven (包括:maven 容器中安装,maven的 settings.xml,maven的repository ) docker (包括:docker.sock, usr/bin/docker 等docker的挂载 )等的集成,以及 jenkins_home ,至此jenkins 的基本环境就准备好了,后续可以实现简单的 CICD 了。