k8s 部署jenkins
本篇主要讲解一下 jenkins 在 k8s 下面是如何部署的,主要对jenkins_home、maven 的一些挂载 和 docker 程序的挂载 ,使其让 pod中的 jenkins 支持 maven docker 等功能,并且当pod删除时不丢失 jenkins_home
1.根据官网 安装 简易版Jenkins
在Jenkins的官网的 安装教程部分其实就有 k8s的安装教程
我们选择使用 YAML文件的方式安装 也可以选择 Helm 安装
、
在其中可以找到官方给的 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
官网提供的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/,端口可以查看
访问后就如下,
可以查看对应的日志 里面会有初始化密码
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
打成镜像后 ,可以上传到 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 修改配置文件
- 修改镜像为 jenkins+maven镜像
- 指定jenkins 以ROOT用户启动容器
- 挂载 jenkins_home 目录到宿主机 /mnt/jenkins_home/
- 挂载宿主机的 docker 进程 到 jenkins /run/docker.sock
- 挂载maven的settings.xml 到/usr/local/apache-maven-3.8.5/conf/settings.xml (settings.xml已经修改为阿里云镜像地址)
- 挂载 /etc/docker/daemon.json 保证能够访问harbor 以及和阿里云的仓库地址
- 配置Service
- 配置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
总结
至此 使用 k8s 部署 jenkins 就完成了,主要是对于 maven (包括:maven 容器中安装,maven的 settings.xml,maven的repository ) docker (包括:docker.sock, usr/bin/docker 等docker的挂载 )等的集成,以及 jenkins_home ,至此jenkins 的基本环境就准备好了,后续可以实现简单的 CICD 了。
欢迎大家访问 个人博客 Johnny小屋