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


前言

前面已经完成了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 "[email protected]"

然后两次回车即可,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文件的镜像拉取设置要修改一下才能拉取到。

猜你喜欢

转载自blog.csdn.net/qq_34526237/article/details/132817367
k8s