从零开始带你实现一套自己的CI/CD(五)Jenkins+K8s

news2024/11/15 18:42:31

目录

  • 一、简介
  • 二、Jenkins + K8s
    • 2.1 Jenkins配置k8s-master服务器信息
    • 2.2 配置镜像仓库信息
    • 2.3 编写k8s yaml文件
    • 2.4 将yaml文件推送到k8s
    • 2.5 配置免密钥登录
    • 2.6 k8s部署yaml资源文件
    • 2.7 重新部署yaml资源文件
    • 2.8 构建注意事项
    • 2.9 完整Jenkinsfile
    • 2.10 构建成功
  • 三、Webhook
  • 源码

一、简介

从零开始带你实现一套自己的CI/CD(一)Jenkins
从零开始带你实现一套自己的CI/CD(二)Jenkins+Sonar Qube
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor
从零开始带你实现一套自己的CI/CD(四)Jenkins Pipeline流水线

上一节我们学习了Jenkins Pipeline风格的方式,Jenkins执行目标服务器编写好的shell脚本进行容器部署。但是也是有缺点的:编写的shell脚本比较复杂,容器不方便管理。这一节我们就学习一下Jenkins结合K8s技术实现项目部署。

k8s官方文档:https://kubernetes.io/zh-cn/docs/home/

Kubernetes 为你提供:

  • 服务发现和负载均衡
    Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
  • 存储编排
    Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
  • 自动部署和回滚
    你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
  • 自动完成装箱计算
    你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
  • 自我修复
    Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
  • 密钥与配置管理
    Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

二、Jenkins + K8s

2.1 Jenkins配置k8s-master服务器信息

进入Jenkins 系统管理 -》 系统配置 -》 Publish over SSH,添加k8s-master节点的服务器信息:

Remote Directory 是Jenkins服务器连接到k8s服务器时的目录,我们填写/usr/local/k8s,注意需要将该目录创建出来。
勾选Use password authentication, or use a different key,输入服务器密码。
在这里插入图片描述

2.2 配置镜像仓库信息

在Jenkins连接到k8s-master服务器后,需要执行k8s命令进行部署,需要从Harbor镜像仓库中拉取我们的镜像,所以需要在docker中配置Harbor的账号密码信息。
注意:k8s集群所有的节点都需要修改这个配置,因为部署的时候不一定是哪一个节点。

vim /etc/docker/daemon.json

#加入harbor镜像仓库的地址,注意Json的格式,不要少了逗号
"insecure-registries": ["http://192.168.153.131:80"]

#重启Docker服务
systemctl restart docker

在这里插入图片描述

然后使用docker login命令登录试一下

在这里插入图片描述

2.3 编写k8s yaml文件

创建pipeline.yaml文件:
pipeline.yaml文件创建了一个Deployment、一个Service、一个Ingress
Pod镜像指向Harbor镜像仓库中的镜像。
Service8886端口映射到容器的8080端口。
Ingress host配置 hello.world.com域名转发到创建的Service。
需要修改本地hosts文件,映射hello.world.com域名到k8s集群的任意IP地址。
在这里插入图片描述

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: pipeline
  labels:
    app: pipeline
spec:
  replicas: 2
  selector:
    matchLabels:
      app: pipeline
  template:
    metadata:
      labels:
        app: pipeline
    spec:
      containers:
        - name: pipeline
          image: 192.168.153.131:80/helloworld/helloworld:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  namespace: test
  labels:
    app: pipeline
  name: pipeline
spec:
  selector:
    app: pipeline
  ports:
  - port: 8886
    targetPort: 8080
  type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: test
  name: pipeline
spec:
  ingressClassName: ingress
  rules:
  - host: hello.world.com
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: pipeline
              port:
                number: 8886

2.4 将yaml文件推送到k8s

接下来修改我们的Jenkinsfile的流程
删除之前Publish Over SSH的步骤,不再需要去执行目标服务器中准备好的shell脚本,而是将Git仓库中编写好的pipeline.yaml k8s资源文件推送到k8s-master节点。然后通过k8s部署pipeline.yaml资源文件。

Jenkins将pipeline.yaml文件推送到k8s-master服务器
注意推送的目录就是之前配置的/usr/local/k8s 目录下

在这里插入图片描述

在这里插入图片描述

sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yaml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

在这里插入图片描述

然后开始构建,如果能够在k8s-master服务器的**/usr/local/k8s**目录看到pipeline.yaml文件,就表示我们配置的没有问题。
在k8s-master节点进行查看:

在这里插入图片描述

2.5 配置免密钥登录

Jenkins配置免密钥登录k8s-master主机
pipeline.yaml文件推送到k8s-master节点后,是无法直接执行kubectl apply命令的,因为没有权限。
所以需要配置免秘钥登录。
将Jenkins中公钥信息复制到k8s-master的~/.ssh/authorized_keysz中,保证远程连接无密码。

#jenkins
cd ~
ls -a
ssh-keygen -t rsa # 如果没有.ssh文件,用此命令生成
cd .ssh/
cat id_rsa.pub # 查看公钥

#k8s-master
cd ~
mkdir .ssh
cd .ssh/ # 如果没有.ssh文件,直接使用mkdir .ssh 命令创建即可
vi authorized_keys #将公钥直接粘贴保存

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将Jenkins服务器的公钥信息粘贴到k8s-master服务器的.ssh/authorized_keys
在这里插入图片描述
在这里插入图片描述

然后再部署Jenkins的服务器通过ssh root@192.168.153.128 ls命令,不需要输入密码执行了命令则说明配置成功。

在这里插入图片描述

2.6 k8s部署yaml资源文件

然后生成Jenkins流水线语法
ssh root@192.168.153.128 kubectl apply -f /usr/local/k8s/pipeline.yaml shell命令转换为流水线语法

在这里插入图片描述

sh 'ssh root@192.168.153.128 kubectl apply -f pipeline.yaml'

我们在Jenkinsfile中在添加一个步骤:将pipeline.yaml文件推送到k8s-master节点后,执行kubectl apply命令进行部署。
在这里插入图片描述

2.7 重新部署yaml资源文件

在完成以上步骤后,看似Jenkins和K8s的整合已经完成了,但是这里还有一个问题。
当我们的代码发生了变化,但是pipeline.yaml资源文件没有改变,k8s则不会重新执行部署。
在这里插入图片描述

所以我们需要增加一条k8s命令:kubectl rollout restart Deployment pipeline -n test,就算pipeline.yaml没有发生改变,k8s也会重新部署。
在这里插入图片描述

 sh '''ssh root@192.168.153.128 kubectl apply -f /usr/local/k8s/pipeline.yaml
 ssh root@192.168.153.128 kubectl rollout restart Deployment pipeline -n test'''

在这里插入图片描述

在这里插入图片描述

2.8 构建注意事项

我们使用了k8s部署,不再需要参数化构建
在这里插入图片描述

所以可以把之前需要的参数全部删除了,对应需要修改我们的Jenkinsfile中的tag变量:
在这里插入图片描述

在这里插入图片描述

在pipeline.yaml中的镜像版本也修改为latest
在这里插入图片描述

2.9 完整Jenkinsfile

pipeline {
    agent any
    environment{
        harborHost = '192.168.153.131:80'
        harborRepo = 'helloworld'
        harborUser = 'admin'
        harborPasswd = 'Harbor12345'
    }

    // 存放所有任务的合集
    stages {

        stage('Pull Code') {
            steps {
            checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[url: 'https://gitee.com/L1692312138/jenkins-demo.git']]])
            }
        }

        stage('Maven Build') {
            steps {
                sh '/var/jenkins_home/apache-maven-3.8.6/bin/mvn clean package -DskipTests'
            }
        }

        stage('Push Harbor') {
            steps {
                sh '''cp ./target/*.jar ./deploy/
                cd ./deploy
                docker build -t ${JOB_NAME}:latest .'''

                sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
                docker tag ${JOB_NAME}:latest ${harborHost}/${harborRepo}/${JOB_NAME}:latest
                docker push ${harborHost}/${harborRepo}/${JOB_NAME}:latest'''
            }
        }

        stage('Publish Over SSH') {
            steps {
            sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yaml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
        stage('Deployment k8s') {
            steps {
            sh '''ssh root@192.168.153.128 kubectl apply -f /usr/local/k8s/pipeline.yaml
            ssh root@192.168.153.128 kubectl rollout restart Deployment pipeline -n test'''
            }
        }
    }
    post {
      always {
        emailext body: '${FILE,path="email.html"}', subject: '【构建通知】:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!', to: 'liush99@foxmail.com'
      }
    }
}

2.10 构建成功

Deployment
在这里插入图片描述
在这里插入图片描述

Pod
在这里插入图片描述
Service
在这里插入图片描述

Ingress
在这里插入图片描述
访问服务
在这里插入图片描述
在这里插入图片描述

三、Webhook

Jenkins下载Gitee插件
如果你使用的不是Gitee,是其他的Github、GitLab、Gogs仓库则自行下载对应的Jenkins插件。
在这里插入图片描述
然后进入项目中配置 构建触发器,勾选 Gitee webhook触发构建
在这里插入图片描述
点击生成Gitee WebHook密码
在这里插入图片描述

在Gitee仓库 管理 --》 WebHooks --》 添加WebHooks
输入回调Jenkins的URL和密码,点击添加

在这里插入图片描述
出现了一个错误,Gitee WebHooks的URL需要是公网可以访问的IP,由于博主是搭建的虚拟机,所以这一步就无法实现了。
在这里插入图片描述

到此为止,Jenkins 整合 K8s构建项目的方式就完成了!

源码

Gitee:https://gitee.com/L1692312138/jenkins-demo.git

Github:https://github.com/Liu-Shihao/helloworld.git

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

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

相关文章

合宙ESP32S3 CameraWebServe 测试demo

合宙ESP32S3 CameraWebServe 合宙ESP32S3 CameraWebServe测试,我们需要一个OV2640的摄像头模组用来采集图像传输给ESP32的,这里使用的OV2640是之前安信可十周年的白嫖的。现在直接插到合宙ESP32S3开发板,简直完美。还是白嫖好!&a…

评估-----评估算法的指标

评估算法的优劣一般会用到以下参数: TN: 真反例 FN: 假反例 TP: 真正例 FP: 假正例 正样本负样本预测正样本TPFP预测负样本FNTN**精确率/查准率(precision):**预测正确的正样本个数与预测为正样本的个数的…

【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(函数发生器)】

目录 序言 🍍放置虚拟仪器仪表 🍉函数发生器 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和仿真。 首先启动NI Multisim 14.0,打开如图所示的启动界面&am…

3-Spring创建

目录 1.创建一个普通的Maven项目 2.添加Spring框架支持(spring-context,spring-beans) 3.添加启动类 1.创建一个普通的Maven项目 不选择任何模板,直接点Next。 Name:项目名称; Location:项目保存路径; …

Lesson 3. 线性回归的手动实现(3.1 变量相关性基础理论 3.2 数据生成器与 Python 模块编写)

文章目录一、变量相关性基础理论二、数据生成器与 Python 模块编写1. 自定义数据生成器1.1 手动生成数据1.2 创建生成回归类数据的函数2. Python 模块的编写与调用在此前的内容当中,我们已经学习了关于线性回归模型的基本概念,并且介绍了一个多元线性回归…

看了以后大呼过瘾的程序员必备网站,速速收藏!

程序员必备的网站,网络上一搜一大把,动辄几十个甚至一百个,虽说大多数网站也都是实用的,但数量庞杂未免让人眼花缭乱。 这里我就只挑选精华,只挑选出程序员必备的8个网站,服务于程序员的工作&生…

Python和MySQL对比(5):用Pandas实现MySQL窗口函数的效果

文章目录一、前言二、语法对比数据表row_number()lead()/lag()rank()/dense_rank()first_value()count()/sum()三、小结一、前言 环境: windows11 64位 Python3.9 MySQL8 pandas1.4.2 本文主要介绍 MySQL 中的窗口函数row_number()、lead()/lag()、rank()/dense_ran…

工业互联网蓬勃发展,出奇才能制胜

近年来,随着我国工业数字化转型的快速推进,我国工业发展进入产业新阶段,工业互联网迎来更加强劲的发展动能和更加广阔的发展空间,我国希望把握住新一轮的科技革命和产业革命,推进工业领域实体经济数字化、网络化、智能…

Cassandra入门教程

文章目录一、数据存储方式和NoSQL1.1 数据存储方式1.2 NoSQL概述1.3 NoSQL的分类二、Cassandra的介绍2.1、Cassandra概述2.1.1 来自百科的介绍2.1.2 Cassandra的Logo2.2、Cassandra特点2.3、Cassandra使用场景2.3.1 特征2.3.2 场景举例三、Cassandra下载、安装、访问3.1 Cassan…

Datawhale 吃瓜教程组队学习 task01

Datawhale 吃瓜教程组队学习task01 还没写完,会持续更新~~ 上个月看了周志华老师的机器学习视频课的前三章,但是后面中断了没看…(主要是懒🤐) 于是打算这个月继续来学习西瓜书和南瓜书🤯 Task01:概览西瓜书南瓜书第1、…

【Kubernetes 企业项目实战】04、基于 K8s 构建 EFK+logstash+kafka 日志平台(上)

目录 一、日志对我们来说到底重不重要? 日志打印的常见级别 二、常见的日志收集方案 2.1 EFK 2.2 ELK Stack 2.3 ELKfilebeat 2.4 其他方案 三、EFK 组件详细介绍 3.1 Elasticsearch 组件介绍 3.2 Filebeat 组件介绍 1)Flebeat 和 Beat 关系…

贪心策略(五)主持人调度(一、二)

主持人调度(一)_牛客题霸_牛客网 有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。 一位活动主持人在…

InnoDB与MyISAM引擎的区别

1. InnoDB与MyISAM引擎的区别 常用引擎: – InnoDB:支持事务,行级锁,外键,崩溃修复,多版本并发控制;读写效率相对较差,内存使用相对较高,占用数据空间相对较大。 – MyI…

学习IBDP中文A课程需要提前准备吗?

俗话说“宜未雨而绸缪,毋临渴而掘井”,也就说凡事都应该要预先做好充分的准备,防患于未然。而学习DP的中文课程也是如此。那么我们一起来看看,在正式进入中文A课程的学习之前,我们可以做哪些准备,令我们的学…

Qml开发之环境搭建

进入官网下载相应版本的qtcreator :https://download.qt.io/archive/qt/5.12/5.12.6/ 1.1 安装的时候注意如下对话框,需要选择下图所示的必须选项,因为我是mac 所以选择的macOS下载完之后进行点击安装,安装后运行软件图片如下&…

C#使用Spire.OCR框架识别图片中的字母,数字,文字等

OCR OCR(optical character recognition),光学字符识别。 OCR文字识别是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,然后用字符识别方法将形状翻译成计算机文字的过程;即&#xff0c…

AWS实战:S3 Cloud Watch Event 触发Lambda

架构 既然是S3 Cloud Watch Event 触发Lambda,首先就需要三个AWS的service: S3Event BridgeLambda S3有event产生时向Event Bridge发送event,Event Bridge通过event rule的配置过滤event,将符合规则的event发送给lambda进行处理。 S3如何向…

科研论文写作

科研论文写作 文章目录科研论文写作一、论文写作的重要性二、论文写作的总原则二、论文写作的注意事项数学符号上下文要保持一致英文表达存在天然的顺承关系比较级和最高级不可以轻易使用需要有甄别的使用其他论文中的句子数学符号需要有明确定义特定的缩写第一次出现需要指明全…

vue本地案例之记事本

新增 生成列表结构(v-for 数组)获取用户输入(v-model 双向数据绑定)回车,新增数据(v-on .enter添加数据:事件绑定v-on(可缩写为后面加事件名),限定回车.enter)删除 点击删除指定内容(v-on splice索引)数据…

posix API与网络协议栈

posix API与网络协议栈 scoket socket包含两部分:fd、tcb(tcp control block) 其中,fd属于文件系统,可在用户态进行操控;而tcb属于内核协议栈 三次握手 服务端API socekt():创建一个tcb和f…