jenkins安装部署、主从架构、slave镜像、K8S对接
介绍
CI/CD工具,自动化持续集成和持续部署,用于构建各种自动化任务。
官方提供了docker镜像https://hub.docker.com/r/jenkins/jenkins
使用Deployments部署镜像,然后通过暴露jenkins的8080端口(web端口)和50000端口(slave 通信端口),另外容器启动后所有数据都是存储在容器内的/var/jenkins_home目录,所以要将该目录做持久卷,确保数据持久化。
使用K8S安装部署
部署yaml文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
spec:
replicas: 1
selector:
matchLabels:
name: jenkins
template:
metadata:
name: jenkins
labels:
name: jenkins
spec:
nodeName: k8s-node2
serviceAccountName: jenkins** # 指定服务账号**
containers:
- name: jenkins
image: jenkins/jenkins:2.414.1-lts
ports:
- containerPort: 8080
- containerPort: 50000
volumeMounts: **# 持久化jenkins的数据。**
- name: jenkins-home
mountPath: /var/jenkins_home
securityContext:
fsGroup: 1000
volumes:
- name: jenkins-home
persistentVolumeClaim:
claimName: jenkins2
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins2
spec:
storageClassName: "managed-nfs-storage"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
---
apiVersion: v1
kind: Service
metadata:
name: jenkins **# 创建一个NodePort类型的service,并设定将jenkins的8080端口暴露到节点的30008端口**
spec:
selector:
name: jenkins
type: NodePort
ports:
- name: http
port: 80
targetPort: 8080
protocol: TCP
nodePort: 30008
- name: agent
port: 50000 # 50000端口是jenkins slave的通信端口,不需要暴露。
protocol: TCP
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins # 创建一个名为jenkins的服务账号
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: jenkins # 创建一个名为jenkins的Role,并且该Role在default命名空间
rules:
- apiGroups: [""]
resources: ["pods","events"]
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","events"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: jenkins # 创建一个名为jenkins的RoleBinding,并且该RoleBinding在default命名空间
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role # 引用指定Role进行绑定,这里时绑定名为jenkins的role
name: jenkins
subjects:
- kind: ServiceAccount # 绑定的主体类型,这里是服务账号
name: jenkins # 服务账号的名字是jenkins
初始化jenkins:
安装后使用kubectl log jenkins-podxxxx
来查看jenkins安装的初始密码,或者根据提示进入到它的持久化目录中找到相应的文件获取初始密码。
然后设定你自己的用户名和密码。
第二步:跳过所有插件的安装,因为都是国外源,先跳过,修改后再安装插件
第三步:修改源
cd /var/lib/jenkins/updates
[root@localhost updates]# sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
sed -i 's#https://updates.jenkins.io/download#https://mirrors.cloud.tencent.com/jenkins#g' default.json
[root@localhost updates]# sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
重启jenkins
直接在地址栏后面加入restart即可,或者在安装插件的时候勾选安装后重启jenkins
http://10.0.1.141:30008/restart
第四步:登录然后进入配置中心将更新地址换一下(这个改了可能会装插件失败。不该了。。)
Manager jenkins > manage plugins > advanced > upgrade url重新填写 URL :
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
安装常用插件:
git # 拉代码
git parameter # 用于生成git拉取参数的插件
pipeline # 自动化流水线
pipeline stage view # 自动化流水线执行过程中每个步骤的log可视化视图插件
kubernetes # 与k8s对接,用于生成jenkins slave的pod。减轻构建自动化任务的压力
config file provider # 存储配置文件的插件
extended choice parameter # 扩展选择框的一个插件
其他插件:
chinses 语言包(这个我一般不装..)
Folders
Build Timeout
Workspace Cleanup
github branch source
email extensionmailer
ssh build agents
jenkins主从架构-与k8s对接
和大部分主从架构一样,都是为了缓解master节点的压力,提高性能。
当触发jenkins任务时,jenkins会调用k8s-api,创建多个slave的pod,并使用slave来构建和执行任务。
配置与k8s对接
1、在dashboard中找到Manage Nodes and Clouds。(管理节点和云)
2、再点击Configure Clouds
3、选中kubernetes,然后再点detail,这样可以设置更多属性
4、将kubernetes的地址填写为:https://kubernetes.default(因为容器内部可以通过svc的dns方式访问,再svc章节学过了)
5、将jenkins的地址填写为:http://jenkins.default(道理同上,但是注意你部署的jenkins的svc是否叫jenkins,以自己的为准)
上面说的svc的dns地址通过get svc也可以看到,可以发现k8s默认有一个叫kubenetes的svc,就是用来给集群内部的其他POD访问k8s-api的。
[root@k8s-master jenkins]# k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
**jenkins** NodePort 10.97.253.10 <none> 80:30008/TCP,50000:31587/TCP 10h
**kubernetes ** ClusterIP 10.96.0.1 <none> 443/TCP 11h
自定义slave镜像
jenkins默认是有slave镜像,但是一般是不够用的,有些工具什么的也没有,不同业务系统开发语言也不一样(如、go、java、python等,使用的环境也不一致)
所以我们一般会自定义一个slave镜像,根据不同的平台构建不同的版本,
如:jenkins-slave-java:1.8、jenkins-slave-go:xxxx 、
当然也可以全部语言的环境都放到一个镜像中,但是体积太大,浪费,没必要。。。
构建slave镜像要考虑的东西:
- jenkins是帮我们自动化部署,我们手动部署时候需要的任何工具如:maven、jdk环境、kubectl等待都是需要出现再slave镜像中的,不然它怎么帮你去执行?
示例:构建java环境的slave镜像
/usr/share/jenkins/slave.jar 这个slave.jar要从jenkins中下载:http://192.168.2.6:30008/jnlpJars/slave.jar 或者 http://192.168.2.6:30008/jnlpJars/agent.jar (你懂的,不需用slave这种名词...)
jenkins-slave从github上下载(没错也变成agent了,不叫slave...):https://github.com/jenkinsci/docker-inbound-agent/blob/master/jenkins-agent
Dockerfile编写:
FROM centos:7
RUN yum install -y java-1.8.0-openjdk maven curl git libtool-ltdl-devel unzip && \
yum clean all && \
rm -rf /var/cache/yum/* && \
mkdir -p /usr/share/jenkins
COPY slave.jar /usr/share/jenkins/slave.jar # jenkins的agent端程序,接受master下发的任务。
COPY jenkins-slave /usr/bin/jenkins-slave # 这个文件就是用来执行slave.jar这个agent程序的
COPY settings.xml /etc/maven/settings.xml # 这里配置的maven的镜像加速
RUN chmod +x /usr/bin/jenkins-slave # 授权可执行权限
COPY kubectl /usr/bin/ # 赋值kubectl是因为后面要用kubectl来创建给你构建的app创建deploy\svc等资源
RUN chmod +x /usr/bin/kubectl # 授权可执行权限
ENTRYPOINT ["jenkins-slave"] # ENTRYPOINT 和CMD差不多,具体可以看汇DOCKERFILE的章节
新版本dockerfile
FROM centos:7
RUN yum install -y java-1.8.0-openjdk maven curl git libtool-ltdl-devel unzip && \
yum clean all && \
rm -rf /var/cache/yum/* && \
mkdir -p /usr/share/jenkins
COPY agent.jar /usr/share/jenkins/agent.jar # jenkins的agent端程序,接受master下发的任务。
COPY jenkins-agent/usr/bin/jenkins-agent # 这个文件就是用来执行slave.jar这个agent程序的
COPY settings.xml /etc/maven/settings.xml # 这里配置的maven的镜像加速
RUN chmod +x /usr/bin/jenkins-agent # 授权可执行权限
COPY kubectl /usr/bin/ # 赋值kubectl是因为后面要用kubectl来创建给你构建的app创建deploy\svc等资源
RUN chmod +x /usr/bin/kubectl # 授权可执行权限
ENTRYPOINT ["jenkins-agent"] # ENTRYPOINT 和CMD差不多,具体可以看汇DOCKERFILE的章节
### ubuntu版本 ,python环境(这个slave环境就是下次你调用时帮你执行pipeline的环境了。所以需要什么都可以提前设置好)
FROM ubuntu
COPY agent.jar /usr/share/jenkins/agent.jar # jenkins的agent端程序,接受master下发的任务。
COPY jenkins-agent.sh /usr/bin/jenkins-agent # 这个文件就是用来执行slave.jar这个agent程序的
COPY kubectl /usr/bin/ # 复制kubectl,因为要用kubectl来创建给你构建的app创建deploy\svc等资源
RUN apt update && \
apt install -y git openjdk-8-jdk && \
chmod +x /usr/bin/kubectl && \
chmod +x /usr/bin/jenkins-agent # 授权可执行权限
ENTRYPOINT ["jenkins-agent"] # ENTRYPOINT 和CMD差不多,具体可以看汇DOCKERFILE的章节
构建镜像并推送到harbor仓库:
[root@k8s-master jenkins]# ll
总用量 46128
-rw-r--r-- 1 root root 436 11月 16 09:30 Dockerfile
-rw-r--r-- 1 root root 1980 11月 16 09:30 jenkins-slave
-rw-r--r-- 1 root root 46437056 11月 16 09:30 kubectl
-rw-r--r-- 1 root root 10409 11月 16 09:30 settings.xml
-rw-r--r-- 1 root root 770802 11月 16 09:30 slave.jar
# 构建镜像
[root@k8s-master jenkins]# docker build -t 10.0.1.140/library/jenkins-slave-jdk:1.8 .
nerdctl -n k8s.io build -t
# 推送镜像
[root@k8s-master jenkins]# docker push 10.0.1.140/library/jenkins-slave-jdk:1.8
测试自定义slave镜像部署是否正常
新建一个项目
输入项目名称,选中pipeline,点击ok按钮。
点击pipeline,然后添加代码
代码如下:
// Uses Declarative syntax to run commands inside a container.
pipeline {
agent {
kubernetes {
label "jenkins-slave"
yaml """
apiVersion: v1
kind: Pod
spec:
containers:
- name: jnlp
image: "10.0.1.140/library/jenkins-slave-jdk:1.8" # 引用刚刚构建的slave镜像,
command:
"""
}
}
stages {
stage('Main') { # 定义一个阶段,阶段名称为Main
steps { # 定义阶段Main中的第一个步骤steps,steps中就是编写各种命令。
sh 'hostname' # 简单的输出一下主机名
}
}
}
}
docker pull 192.168.2.6/library/jenkins-slave@sha256:e9f63cf7551b8970645fa61aaa0c9819152f45bb02e5dc4ba8114acb3f5b0564
然后回到项目首页,点击build now即可,然后观察log,查看是否成功。
jenkins安装部署、主从架构、slave镜像、K8S对接的更多相关文章
- Jenkins安装部署及使用
Jenkins安装部署环境如下 PS:中文官网,东西比较全.(居然有中文官网了,真好!)以下为本人自己的使用过程,仅供参考! 一.准备阶段 1.组件及版本: Jenkins版本:2.164.3 操作系 ...
- Jenkins安装部署项目
Jenkins安装部署项目 配置JDK git maven 部署到服务器 一.新建任务 二.配置jenkins 三.添加构建信息 四.应用.保存 五.踩坑填坑记录 5.1没有jar包的情况 5.2无法 ...
- Jenkins安装部署使用图文详解(非常详细)
前言 最近公司需要弄一套自动化运维部署,于是抽空学习了一下,用了两天左右完成Jenkins的安装部署和各种项目的配置化,于是整理一下进行分享. 介绍 Jenkins是一个独立的开源软件项目,是基于Ja ...
- Jenkins——安装部署
1.部署Jdk 由于jenkins需要jdk环境,所以先部署jdk,解压并设置环境变量就行: # tar zxf jdk-8u45-linux-x64.tar.gz # mv jdk-8u45-lin ...
- Jenkins安装部署(一)
环境准备 CentOS Linux release 7.4 1.IP:192.168.43.129 2.路径:/mnt 3.jdk版本:jdk1.8.0 4.tomcat版本:tomcat-8.5 5 ...
- 【持续集成】jenkins安装部署从git获取代码
一:持续集成的概念: 1.1:总体的概括 持续集成Continuous Integration 持续交付Continuous Delivery 持续部署Continuous Deployment 1. ...
- Jenkins安装部署与使用
一.Jenkins平台安装部署 Jenkins官网免费获取Jenkins软件,官网地址为:http://mirrors.jenkins-ci.org/下载稳定的Jenkins版本.由于Jenkins是 ...
- springboot docker jenkins 自动化部署并上传镜像
springboot + docker + jenkins自动化部署项目,jenkins.mysql.redis都是docker运行的,并且没有使用虚拟机,就在阿里云服务器(centos7)运行 1. ...
- 持续集成工具之Jenkins安装部署
一.DevOps理念 所谓DevOps是指development和Operations的组合,中文意思就是开发和运维的简写.devops理念主要是针对企业中的研发人员.运维人员和测试人员的工作理念,是 ...
- 教你搞懂Jenkins安装部署!
前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用 ...
随机推荐
- window操作系统安装多个版本nodejs版本-控制工具nvm
参考: https://blog.csdn.net/m0_38134431/article/details/118388297 https://juejin.cn/post/7044890876631 ...
- Solution -「BZOJ 3771」Triple
Description Link. 给你一个序列,你每次可以取 \(1\sim3\) 个数然后计算和,问你对于每一种和,方案数是多少. Solution 设一个 OGF \(A(x)=\sum_{i= ...
- daemonset应用创建了,但是没有pod被调度起来
环境: k8s版本1.25.2 一个master 两个node节点 集群节点全部允许调度(无污点),且资源充足. 操作系统版本: Ubuntu22.01 排查思路: 查看kubelet 日志,和c ...
- C++ 对拍详解 和解读
对拍是什么# 对拍,是一个比较实用的工具.它能够非常方便地对于两个程序的输出文件进行比较,可以帮助我们实现一些自动化的比较输出结果的问题. 众所周知,几乎每一道编程题目,都会有某种正解能拿到满分: ...
- Python并发编程——paramiko远程控制的模块、病毒攻击原理、dll注入、
文章目录 paramiko模块 作业 攻击原理解析 一.什么是dll 二.为何要有dll 什么是dll注入: 什么时候需要dll注入 dll注入的方法 使用SetWindowsHookEx函数对应用程 ...
- Java-网络编程(TCP-UDP)
Java-网络编程(TCP-UDP) 网络基础 网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的.中间最主要 ...
- 这款 7k Star 的国产监控系统,真不错!
我们都知道天下没有"永不宕机"的系统,但每次线上出问题都要拉出一个程序员"祭天".所以一款靠谱.好用的监控工具就显得十分重要,它可以在生产环境出故障的第一时间发 ...
- Python - 读取CSV文件发现有重复数据,如何清洗以及保存为CSV文件,这里有完整的过程!!!! 片尾有彩蛋
语言:Python 功能: 1.清洗CSV文件中重复数据. 2.保存为CSV文件 大体流程: 1.首先观察CSV文件中的数据布局格式如何? 2.通过csv包读取数据.并根据规则使用continue,来 ...
- Linux下的网络输入输出流量的带宽控制(2015-11-23更新)
Linux下的网络输入输出流量的带宽控制 整理者:赤子玄心 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回 ...
- 22. 从零用Rust编写正反向代理,一个数据包的神奇HTTP历险记!
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...