介绍

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对接的更多相关文章

  1. Jenkins安装部署及使用

    Jenkins安装部署环境如下 PS:中文官网,东西比较全.(居然有中文官网了,真好!)以下为本人自己的使用过程,仅供参考! 一.准备阶段 1.组件及版本: Jenkins版本:2.164.3 操作系 ...

  2. Jenkins安装部署项目

    Jenkins安装部署项目 配置JDK git maven 部署到服务器 一.新建任务 二.配置jenkins 三.添加构建信息 四.应用.保存 五.踩坑填坑记录 5.1没有jar包的情况 5.2无法 ...

  3. Jenkins安装部署使用图文详解(非常详细)

    前言 最近公司需要弄一套自动化运维部署,于是抽空学习了一下,用了两天左右完成Jenkins的安装部署和各种项目的配置化,于是整理一下进行分享. 介绍 Jenkins是一个独立的开源软件项目,是基于Ja ...

  4. Jenkins——安装部署

    1.部署Jdk 由于jenkins需要jdk环境,所以先部署jdk,解压并设置环境变量就行: # tar zxf jdk-8u45-linux-x64.tar.gz # mv jdk-8u45-lin ...

  5. 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 ...

  6. 【持续集成】jenkins安装部署从git获取代码

    一:持续集成的概念: 1.1:总体的概括 持续集成Continuous Integration 持续交付Continuous Delivery 持续部署Continuous Deployment 1. ...

  7. Jenkins安装部署与使用

    一.Jenkins平台安装部署 Jenkins官网免费获取Jenkins软件,官网地址为:http://mirrors.jenkins-ci.org/下载稳定的Jenkins版本.由于Jenkins是 ...

  8. springboot docker jenkins 自动化部署并上传镜像

    springboot + docker + jenkins自动化部署项目,jenkins.mysql.redis都是docker运行的,并且没有使用虚拟机,就在阿里云服务器(centos7)运行 1. ...

  9. 持续集成工具之Jenkins安装部署

    一.DevOps理念 所谓DevOps是指development和Operations的组合,中文意思就是开发和运维的简写.devops理念主要是针对企业中的研发人员.运维人员和测试人员的工作理念,是 ...

  10. 教你搞懂Jenkins安装部署!

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用 ...

随机推荐

  1. 纯前端导出word手写复杂表格,并还原成word。百分百还原表格。一文搞定前端表格导出为word

    本次的需求是手写一个养老院老人生活能力评定表,并且要能够录入信息,最终导出 表格因为有七页所以代码很多,可以不用看表格模板的详细代码. 先贴上最终效果图 填写完导出之后 基本上实现了样式的百分百还原导 ...

  2. COF框架集成mongodb驱动

    今天打算在我的COF框架中集成mongodb驱动,这实在是简单的工作,因为基本上只是对pymongo的封装 数据库的集成大同小异,要考虑的点无非是以下几点: 1.命名 2.连接创建 3.连接池管理 4 ...

  3. Mac SpringBoot项目 Gradle 7.3 转 Maven 手把手教学,包学会~

    导读 最近我手上有个使用Gradle构建的项目,国内使用Gradle的人相对较少.而且我也觉得Gradle的依赖管理方式有些复杂,让我感到有些困惑.因此,我想将项目转换为Maven构建方式.Maven ...

  4. Go语言中JSON的反序列化规则

    Unmarshal 解析 func Unmarshal(data []byte, v any) error Unmarshal 解析 JSON 编码的数据,并将结果存储在 v 指向的值中.如果 v 为 ...

  5. zxy 简单 dp 大讲堂

    讲课讲得非常清楚啊,我绝赞膜拜.节奏可以,思路清晰,解法自然,为讲师点赞. 第一个题是 loj3282 / joisc2020 - Treatment Project.原问题由 \(\left(S, ...

  6. Arduino 板的说明

    Arduino 板的说明 在本章中,我们将了解 Arduino 板上的不同组件.将学习 Arduino UNO 板,因为它是 Arduino 板系列中最受欢迎的.此外,它是开始使用电子和编码的最佳板. ...

  7. 教育法学第九章单元测试MOOC

    第九章单元测试 返回 本次得分为:100.00/100.00, 本次测试的提交时间为:2020-09-06, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(5分) 作为教师最基本的 ...

  8. python-显示张量(tensorflow)的具体的值

    ------------恢复内容开始------------ # 方法1 a = tf. random.normal ([4,4],mean=0.1,stddev=1) with tf.Session ...

  9. 20. 从零用Rust编写正反向代理,四层反向代理stream(tcp与udp)实现

    wmproxy wmproxy是由Rust编写,已实现http/https代理,socks5代理, 反向代理,静态文件服务器,内网穿透,配置热更新等, 后续将实现websocket代理等,同时会将实现 ...

  10. JVM Stack and Frame

    Overview Sharing a single thread within the district: PC Register/JVM Stack/Native Method Stack.All ...