介绍

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. 在CentOS 8上安装Xrdp远程桌面服务

    如何在CentOS 8上安装Xrdp远程桌面服务 写在前面 Xrdp是Microsoft远程桌面协议(RDP)的开源实现,可让您以图形方式控制远程系统.使用RDP,您可以登录到远程计算机并创建真实的桌 ...

  2. 「sdoi2019 - D2T2」移动金币

    对 @command_block 没有 implementation 做法的细化.理论来说可以通过,但因为我实现得较劣无法通过.:( 把金币中的空隙看作石子,就是一个阶梯 Nim 的模型(有总共 \( ...

  3. Git——Git 常用命令

    文章目录 仓库 配置 增加/删除文件 代码提交 分支 标签 查看信息 远程同步 撤销 其他 仓库 # 在当前目录新建一个Git代码库 $ git init # 新建一个目录,将其初始化为Git代码库 ...

  4. 要知其然还要知其所以然printChar

    虽然过渡与的追求细节不是好事, 但是现实社会逼迫我们不得不兼顾周全. 所以什么都是最好不仅要知其然还要知其所以然! public class printChar { public static voi ...

  5. WEBGpu最佳实践之BindGroup

    介绍 在WebGPU中,资源通过GPUBindGroup结构传递给着色器,与支持它的布局定义(GPUBindGroupLayout和GPUPipelineLayout)以及着色器中绑定组的声明一起.这 ...

  6. nginx中一个请求匹配到多个location时的优先级问题,马失前蹄了

    背景 为什么讲这么小的一个问题呢?因为今天在进行系统上线的时候遇到了这个问题. 这次的上线动作还是比较大的,由于组织架构拆分,某个接入层服务需要在两个部门各自独立部署,以避免频繁的跨部门沟通,提升该接 ...

  7. 组合的输出 题解(lgP1157)

    一看就是 dfs 然而窝并不会做 调了一个多小时才调出来.漏洞连篇.(第一次写的基本没有对的地方QAQ 题解见注释. #include<bits/stdc++.h> using names ...

  8. QT(6)-QStandardItemModel

    @ 目录 1 说明 2 函数 2.1 构造函数 2.2 追加列\行 2.3 清除.删除并返回指定行或列 2.4 查找 2.5 设置水平\垂直表头项目 2.6 获得模型索引 2.7 插入 2.8 根项目 ...

  9. YCSB对MongoDB数据库性能测试

    一.安装部署 1.1前置条件 Install Java and Maven Go to http://www.oracle.com/technetwork/java/javase/downloads/ ...

  10. 基于iptables防火墙堵漏

    之前在网上流传个段子:发现自己电脑被入侵,最有效的办法是即拔掉网线~ 虽然只是个段子却说明一旦机器发现漏洞被入侵,阻断入侵刻不容缓,无论对个人电脑和业务服务器都是如此. 商业服务器虽然有各种防护措施, ...