1.构建镜像

下载基础镜像,这里使用openvz的包,下载地址为:https://wiki.openvz.org/Download/template/precreated,下载centos7的镜像

下载镜像后导入到本地

docker import centos--x86_64.tar.gz openvz-centos7

从官方下载最新版的Jenkins的war包和适配的jdk,这里使用jdk8。构建Jenkins的dockerfile文件dockerfile-jenkins

[root@dataserver jenkins]#cat dockerfile-jenkins
FROM openvz-centos7
ADD jdk-8u241-linux-x64.tar.gz /home
ADD jenkins2..war /home/jenkins.war
ENV JAVA_HOME=/home/jdk1..0_241
ENV PATH=$PATH:/home/jdk1..0_241/bin
ENV JENKINS_HOME=/var/jenkins_home
WORKDIR /home
CMD java -jar jenkins.war --httpPort=

构建后推送到本地仓库

docker build -t 192.168.31.9:/jenkins-self:2.222 -f dockerfile-jenkins .
docker push 192.168.31.9:/jenkins-self:2.222

构建Jenkins-agent的dockerfile-agent

[root@dataserver jenkins]# cat dockerfile-agent
FROM openvz-centos7
ADD jdk-8u241-linux-x64.tar.gz /home
ADD agent.jar /home
ENV JAVA_HOME=/home/jdk1..0_241
ENV PATH=$PATH:/home/jdk1..0_241/bin
RUN yum -y install docker kubernetes-client kubernetes*
WORKDIR /home
CMD exec /home/jdk1..0_241/bin/java -Dorg.jenkinsci.remoting.engine.JnlpProtocol3.disabled=true -cp /home/agent.jar hudson.remoting.jnlp.Main -headless -url ${JENKINS_URL} -workDir ${JENKINS_AGENT_WORKDIR} ${JENKINS_SECRET} ${JENKINS_AGENT_NAME}

构建后推送到本地仓库

docker build -t 192.168.31.9:/jenkins-agent-self:v2.222.11 -f dockerfile-agent .
docker push 192.168.31.9:/jenkins-agent-self:v2.222.11

agent.jar可以从Jenkins中下载。manager Jenkins --> 节点管理 --> 新建节点 --> 输入test,选择固定节点 --> 远程工作目录输入 /home --> 启动方式选择通过web web启动代理后点击保存。
这里这个节点是不在线的,点击后提示如下:

点击下面界面显示的agent.jar后就可以下载对应的agent.jar包

2.部署Jenkins到k8s中

namespace.yaml

[root@env11 cicd]# cat namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: kube-ops

pvc.yaml这里使用nfs服务提供外置存储

[root@env11 cicd]# cat pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: opspv
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Delete
nfs:
server: 192.168.31.9
path: /data/nfsData/jenkins ---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: opspvc
namespace: kube-ops
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi

rbac.yaml

[root@env11 cicd]# cat rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins2
namespace: kube-ops --- kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: jenkins2
namespace: kube-ops
rules:
- apiGroups: ["extensions", "apps"]
resources: ["deployments"]
verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
- apiGroups: [""]
resources: ["services"]
verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get","list","watch"]
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"] ---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: jenkins2
namespace: kube-ops
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: jenkins2
subjects:
- kind: ServiceAccount
name: jenkins2
namespace: kube-ops

jenkins2.yaml

[root@env11 cicd]# cat jenkins2.yaml
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jenkins2
namespace: kube-ops
spec:
template:
metadata:
labels:
app: jenkins2
spec:
terminationGracePeriodSeconds:
serviceAccount: jenkins2
containers:
- name: jenkins
image: 192.168.31.9:/jenkins-self:v2.
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","java -jar jenkins.war --httpPort=8080"]
ports:
- containerPort:
name: web
protocol: TCP
- containerPort:
name: agent
protocol: TCP
resources:
limits:
cpu: 2000m
memory: 2Gi
requests:
cpu: 500m
memory: 512Mi
#livenessProbe:
# httpGet:
# path: /login
# port:
# initialDelaySeconds:
# timeoutSeconds:
# failureThreshold:
#readinessProbe:
# httpGet:
# path: /login
# port:
# initialDelaySeconds:
# timeoutSeconds:
# failureThreshold:
volumeMounts:
- name: jenkinshome
subPath: jenkinsenv
mountPath: /var/jenkins_home
env:
- name: LIMITS_MEMORY
valueFrom:
resourceFieldRef:
resource: limits.memory
divisor: 1Mi
- name: JAVA_OPTS
value: -Xmx$(LIMITS_MEMORY)m -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay= -Dhudson.slaves.NodeProvisioner.MARGIN= -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85 -Duser.timezone=Asia/Shanghai
securityContext:
fsGroup:
volumes:
- name: jenkinshome
persistentVolumeClaim:
claimName: opspvc ---
apiVersion: v1
kind: Service
metadata:
name: jenkins2
namespace: kube-ops
labels:
app: jenkins2
spec:
selector:
app: jenkins2
type: NodePort
ports:
- name: web
port:
targetPort: web
nodePort:
- name: agent
port:
targetPort: agent

部署完成后,就可以通过集群IP:3002后登陆Jenkins

3.需要安装插件:

Jenkins需要安装插件Kubernetes plugin插件才可以动态调用k8s的api接口完成pod的创建

4.配置Jenkins调用k8s配置

配置Jenkins代理为固定端口50000,因为service定义是对外暴露的端口是50000。

点击Jenkins的节点管理

点击节点管理

点击configure clouds,添加一个远端服务

配置Kubernetes地址为http://kubernetes.default:443,命名空间为kube-ops,和Jenkins是同一个命名空间,然后点击连接测试。因为Jenkins的pod在提交是配置了rbac授权,所以可以访问k8s。

配置Jenkins地址为http://jenkins2.kube-ops.svc.cluster.local:8080,如果上面的service配置的名字为jenkins,这里就配置为jenkins而不是jenkins2。

配置pod模版,名字配置为jenkins-slave-001,命名空间为kube-ops,标签列表为haimaxy-jnlp,这个标签列表很重要,后面需要用到。容器列表配置jnlp,镜像就是自己构建的192.168.31.9:5000/jenkins-agent-self:v2.222.11,工作目录写/home/jenkins

下面的运行的命令和参数都不要写,否则会覆盖掉镜像中定义的启动命令。

这里把/var/run/docker.sock和/home/jenkins/.kube挂载到容器中,这样可以使用docker和kubectl命令。注意kubectl必须在每个节点都可以执行。

5.测试

添加一个项目来测试。

这里选择节点标签就是前面的定义的haimaxy-jnlp。

写入shell命令。

添加完成后开始构建

构建过程,就是在k8s中创建了一个pod来运行。

查看构建日志

此时在k8s中查看命名空间kube-ops下有自动创建的pod。

执行完成后查看日志,发现同样获取了命名空间下的pod信息。

2.Jenkins结合k8s完成Jenkins slave功能的更多相关文章

  1. 基于Kubernetes/K8S构建Jenkins持续集成平台(上)-2

    基于Kubernetes/K8S构建Jenkins持续集成平台(上)-2 Kubernetes实现Master-Slave分布式构建方案 传统Jenkins的Master-Slave方案的缺陷 Mas ...

  2. devops-4:Jenkins基于k8s cloud和docker cloud动态增减节点

    Jenkins管理动态节点 上文介绍Jenkins增加静态agent的步骤,除了静态增加外,还有动态管理的功能,两者最大的差异在于动态可以在有job运行时,临时加入一个agent到jenkins ma ...

  3. jenkins持续集成工作原理、功能、部署方式等介绍

    超详细的jenkins持续集成工作原理.功能.部署方式等介绍 原创 波波说运维 2019-08-29 00:01:00 概述 今天简单整理了一下jenkins的一些概念性内容,归纳如下: 1.概念 j ...

  4. 9.2 k8s结合Jenkins与gitlab实现代码升级与回滚

    1.部署Jenkins 1.1 安装jdk # apt 安装jdk11 apt install openjdk-11-jdk # 查看 root@jenkins:~# java -version op ...

  5. 基于Kubernetes/K8S构建Jenkins持续集成平台(上)-1

    基于Kubernetes/K8S构建Jenkins持续集成平台(上)-1 Jenkins的Master-Slave分布式构建 什么是Master-Slave分布式构建 Jenkins的Master-S ...

  6. 基于Kubernetes/K8S构建Jenkins持续集成平台(下)

    基于Kubernetes/K8S构建Jenkins持续集成平台(下) Jenkins-Master-Slave架构图回顾: 安装和配置NFS NFS简介 NFS(Network File System ...

  7. 第四十四章 微服务CICD(6)- gitlab + jenkins + docker + k8s

    总体流程: 在开发机开发代码后提交到gitlab 之后通过webhook插件触发jenkins进行构建,jenkins将代码打成docker镜像,push到docker-registry 之后将在k8 ...

  8. gitlab + jenkins + docker + k8s

    总体流程: 在开发机开发代码后提交到gitlab 之后通过webhook插件触发jenkins进行构建,jenkins将代码打成docker镜像,push到docker-registry 之后将在k8 ...

  9. 阿里云-容器服务之集群服务 k8s(Jenkins+gitlab+k8s的devops)- 01

    由于docker官方停止更新Swarm,另外swarm在使用期间出现了很多bug,所以阿里云也在2019年7月发布公告:于2019年12月31日起停止技术支持,请您尽快迁移至容器服务Kubernete ...

随机推荐

  1. css布局 -双飞翼布局&圣杯布局

    一,双飞翼布局 左右两边固定,中间可以随着浏览器放大和缩小 <!DOCTYPE html> <html lang="en"> <head> &l ...

  2. mp4流化

    MP4需要流化 不然会频繁seek 对于http形式的播放而言 苦不堪言 ffmpeg -i g:/media/err.mp4 -movflags +faststart -codec copy g:/ ...

  3. 中国移动携手华为百度展示5G应用,实现8K视频传输

    在今日举行的 2019 年百度云智峰会上,中国移动携手华为和百度,首次展示基于 SA 架构的 5G Vertical LAN (行业局域网)技术,承载 8K 实时会议系统,助力企业云办公.该技术可为合 ...

  4. 【LeetCode】课程表

    [问题]现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程.例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量 ...

  5. 【LeetCode】最长回文子串-中心扩展法

    [问题]给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 : 输入: "babad" 输出: "bab" 注意: ...

  6. Sublime Text基本配置

    官网最新版本号 3059 破解链接: http://bbs.pediy.com/showthread.php?t=182774 可以看那个人放出来的百度网盘,去他的百度网盘里面可以看到最新的破解文件. ...

  7. Windows桌面图标不见了,可能是结束了explorer.exe进程导致

    Windows桌面图标不见了,怎么办?那么可能是你关掉了explorer.exe的进程. 解决办法: ① Ctrl+shift+delete打开任务管理器,查看进程是否有explorer.exe ② ...

  8. springboot-jar-web

    预览 与springboot-jar的区别是: 1.pom.xml 将 <dependency> <groupId>org.springframework.boot</g ...

  9. js动态删除行错误

    Uncaught TypeError: Failed to execute 'removeChild' on 'Node': parameter 1 is not of type 'Node'. js ...

  10. HDU 5311:Hidden String

    Hidden String  Accepts: 437  Submissions: 2174  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit ...