DevOps系列文章 - K8S构建Jenkins持续集成平台

news2025/1/30 15:52:34
k8s安装直接跳过,用Kubeadm安装也比较简单

安装和配置 NFS

NFS简介

NFS(Network File System),它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以

共享彼此的文件。我们可以利用NFS共享Jenkins运行的配置文件、Maven的仓库依赖文件等

NFS安装直接跳过。

[root@k8s-master ~]# cat /etc/exports
/opt/nfs/jenkins *(rw,no_root_squash)
/opt/nfs/maven *(rw,no_root_squash)
[root@k8s-master ~]#
[root@k8s-master ~]# showmount -e 192.168.1.114
Export list for 192.168.1.114:
/opt/nfs/maven *
/opt/nfs/jenkins *
[root@k8s-master ~]#

Kubernetes安装Jenkins-Master

创建NFS client provisioner

nfs-client-provisioner 是一个Kubernetes的简易NFS的外部provisioner,本身不提供NFS,需要现有

的NFS服务器提供存储。

1)上传nfs-client-provisioner构建文件

[root@k8s-master ~]# cd /wgr/
[root@k8s-master wgr]# ll
total 0
drwxr-xr-x 5 root root 67 Jun 2 13:20 jenkins
[root@k8s-master wgr]# cd jenkins/
[root@k8s-master jenkins]# ll
total 0
drwxr-xr-x 2 root root 94 Jun 2 12:41 jenkins-master
drwxr-xr-x 2 root root 81 Jun 2 13:20 jenkins-slave
drwxr-xr-x 2 root root 64 Jun 2 12:19 nfs-client
[root@k8s-master jenkins]# cd nfs-client/
[root@k8s-master nfs-client]# ll
total 12
-rw-r--r-- 1 root root 225 Jun 2 12:19 class.yaml
-rw-r--r-- 1 root root 983 Jun 2 12:19 deployment.yaml
-rw-r--r-- 1 root root 1526 Jun 2 12:19 rbac.yaml
[root@k8s-master nfs-client]# 

执行

kubectl create -f .

安装Jenkins-Master

1)上传Jenkins-Master构建文件

2)创建kube-ops的namespace

因为我们把Jenkins-Master的pod放到kube-ops下

kubectl create namespace kube-ops

  1. 构建Jenkins-Master的pod资源

kubectl create -f .

4)查看pod是否创建成功  

查看分配的端口

Jenkins与Kubernetes整合

安装Kubernetes插件

系统管理->插件管理->可选插件

实现Jenkins与Kubernetes整合

系统管理->系统配置->云->新建云->Kubernetes

kubernetes地址采用了kube的服务器发现: https://kubernetes.default.svc.cluster.local

namespace填kube-ops,然后点击Test Connection,如果出现 Connection test successful 的提

示信息证明 Jenkins 已经可以和 Kubernetes 系统正常通信

Jenkins URL 地址: http://jenkins.kube-ops.svc.cluster.local:8080

构建Jenkins-Slave自定义镜像

Jenkins-Master在构建Job的时候,Kubernetes会创建Jenkins-Slave的Pod来完成Job的构建。我们选择

运行Jenkins-Slave的镜像为官方推荐镜像:jenkins/jnlp-slave:latest,但是这个镜像里面并没有Maven

环境,为了方便使用,我们需要自定义一个新的镜像:

准备材料:

Dockerfile如下:

FROM jenkins/jnlp-slave:latest
MAINTAINER itcast
# 切换到 root 账户进行操作
USER root
# 安装 maven
COPY apache-maven-3.6.2-bin.tar.gz .
RUN tar -zxf apache-maven-3.6.2-bin.tar.gz && \
 mv apache-maven-3.6.2 /usr/local && \
 rm -f apache-maven-3.6.2-bin.tar.gz && \
 ln -s /usr/local/apache-maven-3.6.2/bin/mvn /usr/bin/mvn && \
ln -s /usr/local/apache-maven-3.6.2 /usr/local/apache-maven && \
 mkdir -p /usr/local/apache-maven/repo
COPY settings.xml /usr/local/apache-maven/conf/settings.xml
USER jenkins

构建出一个新镜像: jenkins-slave-maven:latest

然把镜像上传到Harbor的公共库library中

生成凭证

[root@k8s-master maven]# kubectl create secret docker-registry registry-auth-secret --docker-server=192.168.1.120:8001 --docker-username=admin --docker-password=Harbor12345 --docker-email= dalianpai@163.com
secret/registry-auth-secret created
[root@k8s-master maven]# kubectl get secret
NAME TYPE DATA AGE
default-token-d4gmj kubernetes.io/service-account-token 3 10d
nfs-client-provisioner-token-rqxj2 kubernetes.io/service-account-token 3 21h
qingcloud kubernetes.io/dockerconfigjson 1 10d
registry-auth-secret kubernetes.io/dockerconfigjson 1 12s

建立k8s认证凭证  

流水线

def git_address ="http://192.168.1.120:88/dalianpai_group/tensquare_back_k8s.git"
def git_auth = "cc7c6270-03bf-4fe2-9ee3-a5e4d391e0d3"
//构建版本的名称
def tag = "latest"
//Harbor私服地址
def harbor_url = "192.168.1.120:8001"
//Harbor的项目名称
def harbor_project_name = "tensquare_k8s"
//Harbor的凭证
def harbor_auth = "b00af28a-e611-41b7-b123-88e99e457839"
def secret_name = "registry-auth-secret"
//Harbor的凭证
def k8s_auth="3d37d57b-d05b-4416-b9cb-313874e00162"
podTemplate(label: 'jenkins-slave', cloud: 'kubernetes', containers: [
    containerTemplate(
    name: 'jnlp',
    image: "192.168.1.120:8001/library/jenkins-slave-maven:latest"
  ),
  containerTemplate(
     name: 'docker',
     image: "docker:stable",
     ttyEnabled: true,
     command: 'cat'
  ),
],
 volumes: [
   hostPathVolume(mountPath: '/var/run/docker.sock', hostPath:'/var/run/docker.sock'),
   nfsVolume(mountPath: '/usr/local/apache-maven/repo', serverAddress:'192.168.1.114' , serverPath: '/opt/nfs/maven'),
],
)
{
 node("jenkins-slave"){
    // 第一步
   stage('拉取代码'){
        checkout([$class: 'GitSCM', branches: [[name: '${branch}']],userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
  }
   // 第二步
   stage('编译,安装公共子工程') {
      sh "mvn -f tensquare_common clean install"
   }
    // 第三步
   stage('构建镜像,部署项目'){
    //把选择的项目信息转为数组
    def selectedProjects = "${project_name}".split(',')
     for(int i=0;i<selectedProjects.size();i++){
     //取出每个项目的名称和端口
     def currentProject = selectedProjects[i];
     //项目名称
     def currentProjectName = currentProject.split('@')[0]
     //项目启动端口
     def currentProjectPort = currentProject.split('@')[1]
     //定义镜像名称
        def imageName = "${currentProjectName}:${tag}"
        //编译,构建本地镜像
         sh "mvn -f ${currentProjectName} clean package dockerfile:build"
 
         container('docker') {
            //给镜像打标签
             sh "docker tag ${imageName}  ${harbor_url}/${harbor_project_name}/${imageName}"
           //登录Harbor,并上传镜像
             withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]){
                  //登录
                  sh "docker login -u ${username} -p ${password}  ${harbor_url}"
                  //上传镜像
                  sh "docker push  ${harbor_url}/${harbor_project_name}/${imageName}"
              }
             //删除本地镜像
             sh "docker rmi -f ${imageName}"
             sh "docker rmi -f  ${harbor_url}/${harbor_project_name}/${imageName}"
           }
        def deploy_image_name = "${harbor_url}/${harbor_project_name}/${imageName}"
       //部署到K8S
      sh """
     sed -i 's#\$IMAGE_NAME#${deploy_image_name}#' ${currentProjectName}/deploy.yml
     sed -i 's#\$SECRET_NAME#${secret_name}#'  ${currentProjectName}/deploy.yml
     """
    kubernetesDeploy configs: "${currentProjectName}/deploy.yml",kubeconfigId: "${k8s_auth}"
       }
   }
  }
}  

最后的效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/407677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

H5项目如何打包成APP

开发uni-app的编辑器HBuilderX可以将H5项目打包成APP&#xff0c;相信很多小伙伴还不知道这个功能。下面将介绍下如何将H5打包成APP。 HBuilderX下载链接&#xff1a;https://www.dcloud.io/hbuilderx.html 1.新建5APP项目 选择文件>新建>项目&#xff0c;新建5APP项目…

.env 文件

.env 文件配置 文件说明 .env&#xff1a;全局默认配置文件&#xff0c;无论什么环境都会加载合并。 .env.development&#xff1a;开发环境的配置文件 .env.production&#xff1a;生产环境的配置文件 注意&#xff1a;三个文件的文件名必须按上面方式命名&#xff0c;不能乱…

推荐10个基于Vue3.0全家桶的优秀开源项目

目录 PPTist vue-next-admin Vue vben admin VUE3-MUSIC vue-pure-admin vue3-composition-admin newbee-mall-vue3-app Element Plus vue3-bigData cool-admin-vue 今天来分享 10 个基于 Vue3.0 全家桶的优秀开源项目&#xff01; PPTist PPTist 是一个基于 Vue3.…

【Vue路由(router)进一步详解】

Vue路由&#xff08;router&#xff09;进一步详解query属性具体实例代码如下&#xff1a;params属性具体实例代码如下&#xff1a;props属性replace属性编程式路由导航路由缓存具体代码&#xff1a;总结本篇文章主要针对已经掌握Vue路由&#xff08;router&#xff09;基础以及…

Vue业务组件封装(二)Form表单

前言 这个系列主要是分享自己在工作中常用到的业务组件&#xff0c;以及如何对这些组件进行有效的封装和封装的思路。注&#xff1a;都是基于element ui进行二次封装。 封装组件的基本方法就是通过props和emit进行父子组件的传值和通信。利用插槽、组件等增加组件的可扩展性和复…

JavaScript实现留言板

目录 1.案例说明&#xff1a; 2.html部分 3.css部分 4.js代码 5.全部代码 6.效果图&#xff1a; 1.案例说明&#xff1a; 利用JavaScript、css以及html制作一个简易的留言板 要求在页面文本框中输入一些文字之后&#xff0c;点击“提交”按钮&#xff0c;就可以让输入的…

React+Mobx|综合项目实践(附项目源码、地址)

欢迎来到我的博客 📔博主是一名大学在读本科生,主要学习方向是前端。 🍭目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 🛠目前正在学习的是🔥 R e a c t 框架 React框架 Reac

【学姐面试宝典】前端基础篇Ⅳ(JavaScript)

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【前端面试专栏】 今天继续学习前端面试题相关的知识&#xff01; 感兴趣的小伙伴一起来看看吧~&#x1f91e; 文章目录webpack 的作用什么是按需加载如何理解前端模块化讲讲 JS 的语…

npm i 报错及解决方案

目录报错案例1报错案例2报错案例3报错案例4报错案例5报错案例1 npm ERR! Cannot read properties of null (reading pickAlgorithm)解决方案&#xff1a;清理缓存后再次安装 npm cache clear --force报错案例2 npm ERR! gyp info it worked if it ends with ok ... npm ERR!…

前端使用lottie-web,使用AE导出的JSON动画贴心教程

Lottie简介 官方介绍&#xff1a;Lottie是一个库&#xff0c;可以解析使用AE制作的动画&#xff08;需要用bodymovie导出为json格式&#xff09;,支持web、ios、android、flutter和react native。 在web端&#xff0c;lottie-web库可以解析导出的动画json文件&#xff0c;并将其…

【博主推荐】html好看的图片轮播多种风格(源码)

html好看的图片轮播多种风格所有轮播图动态效果展示1.普通自带按钮切换轮播图1.1 效果展示1.2 源码2.自动切换图片2.1 效果展示2.2 源码3.鼠标拖动切换图片3.1 效果展示4.数字按钮拖动切换图片4.1 效果展示5.图片带缩略图5.1 效果展示6.上下拖动切换图片6.1 效果展示7. 3D切换图…

X-Frame-Options简介

最近安全检查&#xff0c;发现没有保障和避免自己的网页嵌入到别人的站点里面&#xff0c;于是需要设置X-Frame-Options增加安全性。 网上查了查资料&#xff0c;这里记录一下。 可以使用下面工具进行验证&#xff1a;Clickjacking Tool | Test | UI Redressing 1、X-Frame-Op…

3.js中判断数组中是否存在某个对象/值,判断数组里的对象是否存在某个值 的五种方法 及应用场景|判断数组里有没有某对象,有不添加,没有则添加到数组

3.js中判断数组中是否存在某个对象/值&#xff0c;判断数组里的对象是否存在某个值 的五种方法 及应用场景 一、当数组中的数据是简单类型时&#xff1a; 应用js中的indexof方法&#xff1a;存在则返回当前项索引&#xff0c;不存在则返回 -1。 var arr[1,2,3,4]var str2// …

ECharts设置双x轴

下面给大家分享一下ECharts的几种功能&#xff0c;循序渐进地实现一个复杂的曲线图。 V1.0&#xff1a; 代码&#xff1a; let option {title: { text: V1.0 },legend: { data:[销量] },// x轴的数据xAxis: {data: ["王","胡歌","曾小贤",&q…

Vue3使用axios的配置教程详解

1.安装 npm install --save axios vue-axios2.在src根目录创建service文件夹。然后创建axios.js 2.1在axios.js添加拦截器,请求拦截:initAxios.interceptors.request;响应拦截:initAxios.interceptors.response import axios from "axios";const initAxios axios.…

用idea创建vue项目

目录 一、安装node.js &#xff08;1&#xff09;下载安装包 &#xff08;2&#xff09;测试node.js是否安装成功 &#xff08;3&#xff09;安装vue和全局vue-cli 二、idea安装vue.js插件 三、创建vue项目 四、修改配置文件 五、配置idea运行的环境 一、安装node.js …

ERROR: npm v9.4.1 is known not to run on Node.js v8.13.0.

前面全是废话&#xff0c;大家可以直接看序号8下面的nvm的命令以及序号11之后的问题解决&#xff0c;希望能帮助到你们&#xff01;是个什么问题呢&#xff1f;昨天领导给了个前后端分离的项目&#xff0c;让不才我搭建一下环境&#xff0c;我兴高采烈的拿着项目搭建手册按照文…

微信小程序开发 app.json全局配置

JSON 是一种数据格式&#xff0c;在实际开发中&#xff0c;JSON 总是以配置文件的形式出现。app.json 是当前小程序的全局配置&#xff0c;可以通过app.json对小程序项目进行设置所有页面路径、窗口外观、界面表现、底部 tab 等。{"pages": ["pages/index/index…

vue中实现文件批量打包压缩下载(以及下载跨域问题分析)

上次做了一个选择多个数据生成多个二维码并下载&#xff0c;当时项目催的紧&#xff0c;就简单写了个循环生成二维码下载&#xff0c;一次性会下载很多文件&#xff0c;特别难整理&#xff1b; 刚好这次项目又遇到类似这种功能&#xff0c;需要一次性批量下载多个文件&#xf…

浅谈uniapp的flex布局

文章目录1 flex布局1.1 flex-direction1.2 flex-wrap1.3 justify-content1.4 align-items1.5 align-content属性1.6 其他项目属性1.6.1 order属性1.6.2 flex-grow属性1.6.3 flex-shrink属性1.6.4 flex属性1 flex布局 ​ flex是Flexible Box的缩写&#xff0c;意为”弹性布局”…