5.k8s jenkins集成k8s一键发布案例

2023-09-14 00:43:07


前言

前面已经完成了k8s集群的部署,现在尝试jenkins自动集成到k8s集群。jenkins搭建可以参考,jenkins搭建


一、jenkins配置

前面已经完成了jenkins的搭建,但是还没有集成git,maven,java,这里做下配置。

1.1 jenkins配置git

linux安装git如下

yum install git

如下图的路径配置里如果没有git,去插件安装处安装一下git插件即可
在这里插入图片描述

配置git,如果没有git去插件管理安装一下就行

/usr/bin/git

在这里插入图片描述

1.2 jenkins 配置maven

自己下载maven安装包,解压到你自己的安装目录,修改conf文件

<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

export MAVEN_HOME=/opt/*/maven3.6/apache-maven-3.6.3
export PATH=MAVEN_HOME/bin:MAVEN_HOME/bin:PATH
#刷新配置
source /etc/profile

检查是否安装成功

mvn help:system

如果出现下载文件,则maven安装成功了,接下来去jenkins配置maven如图所示,我的安装路径如下,

/root/tools/apache-maven-3.6.3/conf/settings.xml

在这里插入图片描述
配置maven安装路径如图
在这里插入图片描述

1.3 jenkins配置java

/root/tools/jdk/jdk1.8.0_144

在这里插入图片描述

二、jenkins流水线配置

2.1.新增项目

在这里插入图片描述

2.2 springboot项目配置git仓库

这里我使用的国内免费的gittee作为仓库。

先到linux服务器上生成公钥私钥,用来联通linux和git

ssh-keygen -t rsa -C "your_email@youremail.com"

然后两次回车即可,cd ~/.ssh 目录下拷贝公钥到gitee,公钥管理处
公钥存放的文件为id_rsa.pub
私钥存放的文件为id_rsa
在这里插入图片描述

  • 然后到jenkins配置证书,点击添加证书
    在这里插入图片描述
    这里选择的是ssh username with private key在这里插入图片描述
    username和id随便填,下面框框里面填的内容为刚刚生成的私钥
    id_rsa里的所有内容。
    在这里插入图片描述
    完成后会报错如下,
Failed to connect to repository : Command "/usr/bin/git ls-remote -h https://gitee.com/jiangbingsong/k8s-demo.git HEAD" returned status code 128:
stdout:
stderr: fatal: Authentication failed for 'https://gitee.com/jiangbingsong/k8s-demo.git/

可能原因:
1.你的秘钥配置填写错误,检查一下就行
2.gittee仓库的权限不是公开的,把它配置成公开,或者设置仓库秘钥重新配置。
仓库秘钥配置的地方如下图,我配置了好几次都失败了,提示成功却没有秘钥出来
在这里插入图片描述
然后修改为仓库公开了,在基本信息下面设置仓库公开即可。
在这里插入图片描述

2.3 springboot项目配置maven打包

clean install

在这里插入图片描述

这里的pom路径为相对路径,根据你仓库地址到pom.xml文件的路径例如我的仓库下载下来的代码pom文件路径就是根路径下的,pom.xml

2.4 系统配置 ssh到hadoop1配置,也就是k8s的master节点

Dashboard-Manage Jenkins-System,publish over ssh 这里配置,
如果没有该选项,则去插件配置里面搜索这个插件安装重启一下就好了。
在这里插入图片描述
Passphrase 登录主机的密码
在这里插入图片描述

  • name 主机名,可以随便填
  • hostname 主机ip
  • username 登录用户名
  • Remote Directory 登录到远端的地址。
    编辑完成后点下测试,返回sucess配置成功。
    在这里插入图片描述

2.6 springboot项目配置拷贝jar包到远端

配置Send files or execute commands over SSH 拷贝生成的jar到远端。
在这里插入图片描述

target/demo-0.0.1-SNAPSHOT.jar
target
/root/dockerimage
pwd
echo “传输完成”
  • source files jar包生成的相对目录 整个工作空间地址为
    /var/lib/jenkins/workspace/springboot maven在springboot下生成target文件夹,从这里开始算
  • Remove prefix 前缀 要去掉target否则会连整个文件夹一起拷贝到远端,我们只是想拷贝jar包过去,所以去掉
  • Remote directory 拷贝到远端的目录

2.5 springboot项目配置打包完成后的执行脚本

新增远端执行指令,选择刚刚系统配置的远端主机
在这里插入图片描述
这个红色的警告不用管,这个是你jenkins要带到远端的文件,我这里不需要带过去,就不配置了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/36f32c9ea94c49a2bc5d227b3ca2c24e.png

  • Remote directory 远端登录的目录
  • Exec command 执行的指令
cd /root/dockerimage
./start.sh
./imagerm.sh

这里要执行的命令,我写成了shell脚本去执行,脚本如下
start.sh如下

#!/bin/sh
#
# 镜像仓库地址
DOCKER_REPOSITORIES="192.168.184.129:5000"
# 项目名称
APP_NAME="springbootdemo"
# 初始化版本号
init_version="0.0.1"
#下一个版本号
nextPlatformTags=""
#登录到私有仓库
# 处理私服docker镜像版本号 旧的版本号
platformRepoTags=$(curl -u jiangbingsong:123456 ${DOCKER_REPOSITORIES}/v2/${APP_NAME}/tags/list |jq  ".tags" |awk -F',' '{print $NF}'|sed 's/[][]//'  |sed '/^$/d'|sed 's/\"//g')
echo "platformRepoTags:" $platformRepoTags
#去掉空格
platformRepoTags=${platformRepoTags// /}
if [ "$platformRepoTags" = null ]; then
nextPlatformTags="${init_version}"
else
OLD_IFS="$IFS"
IFS="."
arryPlatTags=($platformRepoTags)
IFS="$OLD_IFS"
# 处理私服docker镜像版本号 升级版本
nextPlatformTags=${arryPlatTags[0]}.${arryPlatTags[1]}.$[arryPlatTags[2]+1]
fi
# 构建的命令
APP_NAME_BUILD="${DOCKER_REPOSITORIES}/${APP_NAME}:${nextPlatformTags} ."
echo "构建的命令: build -t ${APP_NAME_BUILD}"
docker build -t ${APP_NAME_BUILD}
#push到镜像仓库
PUSH_APP_NAME="${DOCKER_REPOSITORIES}/${APP_NAME}:${nextPlatformTags}"
#echo "提交到私有镜像仓库命令: docker push ${PUSH_APP_NAME}"
docker login ${DOCKER_REPOSITORIES} -u jiangbingsong -p 123456
docker push ${PUSH_APP_NAME}
#docker logout
kubectl apply -f springbootDeployment.yaml
echo "PUSH_APP_NAME:" ${PUSH_APP_NAME}
kubectl set image -n=webservice deployment/springbootdeploy $APP_NAME=${PUSH_APP_NAME}
echo "success !"

解释下,这里主要做的事有生成docker镜像,查询仓库内的镜像版本号,自动升级版本号,使用版本号进行升级,然后推送到仓库,最后设置deployment的镜像镜像更新。

  • springbootdeploy 为你depoyment的名字,
    springbootDeployment.yaml 和dockerfile文章内容,前面的文章有,可以找找。
    同时springbootDeployment.yaml做以下修改。
    在这里插入图片描述
    清理镜像脚本imagerm.sh如下
    这个内容不用改直接用就行,项目镜像只保留最新的2个版本
#!/bin/bash
 
# 获取所有镜像列表,并按照创建时间排序
image_list=$(docker image ls --format "{{.Repository}}:{{.Tag}}|{{.CreatedAt}}" | sort -t "|" -k2,2)
 
# 获取所有镜像名
image_names=$(echo "$image_list" | awk -F ':' '{print $1}' | uniq)
 
# 遍历每个镜像名
for image_name in $image_names; do
    # 获取特定镜像名的镜像列表
    filtered_images=$(echo "$image_list" | awk -F ':' -v name="$image_name" '$1 == name')
 
    # 获取镜像数量
    image_count=$(echo "$filtered_images" | wc -l)
 
    # 如果镜像数量超过3个,则删除旧的镜像,只保留最近的两个
    if [ $image_count -gt 3 ]; then
        images_to_delete=$((image_count - 2))
        images_to_delete_list=$(echo "$filtered_images" | head -n $images_to_delete | cut -d "|" -f 1)
 
        for image in $images_to_delete_list; do
            docker image rm $image
        done
 
    fi
done

2.6 验证

这里我的服务暴露的方式是nodeport,也可以用ingress配置成域名登录,比较麻烦,前面的教程也有弄过,这里这是为了集成jenkins就不搞这么多了。

kubectl get svc --all-namespaces

在这里插入图片描述
http://192.168.184.129:30467/hello

在这里插入图片描述

返回了200,验证成功。

总结

1.jenkins集成,可以先不直接集成k8s,可以先用jenkins集成java -jar的方式启动,这样能先排除jenkins产生的问题,我这里就不展示过程了,就直接写成了最后的结果。
2.springbootDeployment.yaml文件的镜像拉取设置要修改一下才能拉取到。

更多推荐

从零开始—【Mac系统】MacOS配置Java环境变量

系统环境说明AppleM1macOSVentura版本13.5.21.下载JDK安装包Oracle官网下载地址JDK下载【注:推荐下载JDK8Oracle官网JDK8下载】关于JDK、JRE、JVM的关系说明JDK(JavaDevelopmentKit,Java开发工具包),是整个JAVA的核心,包括JRE,很多Jav

【C++】封装unordered_map和unordered_set(用哈希桶实现)

前言:前面我们学习了unordered_map和unordered_set容器,比较了他们和map、set的查找效率,我们发现他们的效率比map、set高,进而我们研究他们的底层是由哈希实现。哈希是一种直接映射的方式,所以查找的效率很快。与学习红黑树和map、set的思路一样,我们现在学完了unordered_map和

11:STM32---spl通信

目录一:SPL通信1:简历2:硬件电路3:移动数据图4:SPI时序基本单元A:开/终条件B:SPI时序基本单元A:模式0B:模式1C:模式2D:模式3C:SPl时序A:发送指令B:指定地址写C:指定地址读二:W25Q641:简历2:硬件电路3:W25Q64框图4:Flash操作注意事项5:指令集三:案例A:软件SPI读

Ceph入门到精通-CEPH故障以其处理方法

1.SlowOSDheartbeats#ceph-shealth:HEALTH_WARNSlowOSDheartbeatsonback(longest6181.010ms)SlowOSDheartbeatsonfront(longest5953.232ms)OSDs之间会相互测试(ping)访问速度,若两个OSDs之间

Docker 常用命令

帮助启动类命令1、启动docker:systemctlstartdocker2、停l止docker:systemctlstopdocker3、重启docker:systemctlrestartdocker4、查看docker状态:systemctlstatusdocker5、开机启动:systemctlenabledo

【Flink实战】Flink对接Kafka Connetor使用docker部署kafka

🚀作者:“大数据小禅”🚀文章简介:Flink对接KafkaConnetor第一步使用docker部署kafka🚀欢迎小伙伴们点赞👍、收藏⭐、留言💬目录导航什么是DockerDocker常用命令Docker安装过程Docker部署kafka什么是DockerDocker是一个开源的容器化平台,用于将应用程序和其

Kafka消费一致性和幂等性分析

1、前言在分布式系统中,消息队列被广泛用于数据的传输和处理。其中,Kafka因其高吞吐量、可扩展性和容错性而备受关注。然而,在处理海量数据时,确保消息的一致性和幂等性十分重要。本文将通过代码示例,对Kafka消费一致性和幂等性进行分析。2、问题背景在Kafka消费过程中,消费者从消息队列中获取消息并处理。然而,在某些场

分布式面试题

文章目录前言一、大型网站系统的特点二、拆分VS集群三、微服务VSSOA四、前后端完全分离与Rest规范总结前言大型网站系统的特点拆分VS集群微服务VSSOA前后端完全分离与Rest规范一、大型网站系统的特点高并发,大流量需要面对高并发用户,大流量访问。Google日均PV35亿,日IP访问数3亿;腾讯QQ的最大在线用户

简述现代加油站的智能防雷设计及其解决措施

随着经济的发展,人民群众生活水平不断提高,汽车已经成为非常普通的代步工具,与其配套的汽车加油站也越来越多。据统计,目前,我国各种类型加油加气站将近10万座,其中中石油约有18000座,中石化约有28000多座,其他国有、民营和外资等约有46000多座。与此同时,加油站的安全问题显得更加重要。加油站是易燃易爆场所,属于第

Selenium常用操作之单选复选框、下拉列表、键盘、截屏、断言、(显式隐式)等待

目录1.窗口最大化2.单选框操作3.复选框操作4.下拉列表5.selenium三种等待6.键盘操作7.截屏8.断言9.Selenium操作JS弹窗控件10.鼠标悬停与释放1.窗口最大化driver.maximize_window()2.单选框操作driver.find_element_by_xpath("//input

【TCP】三次握手 与 四次挥手 详解

三次握手与四次挥手1.三次握手2.四次挥手三次握手和四次挥手的区别在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接1.三次握手服务端状态转化:[CLOSED->LISTEN]服务器端调用listen后进入LISTEN状态,等待客户端连接;[LISTEN->SYN_RCVD]一旦监听到连接请求(同步报文段SY

热文推荐