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



    前言

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


    一、jenkins配置

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

    1.1 jenkins配置git

    linux安装git如下

    yum install git
    
    • 1

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

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

    /usr/bin/git
    
    • 1

    在这里插入图片描述

    1.2 jenkins 配置maven

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

    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    export MAVEN_HOME=/opt/*/maven3.6/apache-maven-3.6.3
    export PATH=MAVEN_HOME/bin:MAVEN_HOME/bin:PATH
    #刷新配置
    source /etc/profile
    
    • 1
    • 2
    • 3
    • 4

    检查是否安装成功

    mvn help:system
    
    • 1

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

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

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

    1.3 jenkins配置java

    /root/tools/jdk/jdk1.8.0_144
    
    • 1

    在这里插入图片描述

    二、jenkins流水线配置

    2.1.新增项目

    在这里插入图片描述

    2.2 springboot项目配置git仓库

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

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

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

    然后两次回车即可,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
    • 3

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

    2.3 springboot项目配置maven打包

    clean install
    
    • 1

    在这里插入图片描述

    这里的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 “传输完成”
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 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
    
    • 1
    • 2
    • 3

    这里要执行的命令,我写成了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 !"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    解释下,这里主要做的事有生成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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    2.6 验证

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

    kubectl get svc --all-namespaces
    
    • 1

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

    在这里插入图片描述

    返回了200,验证成功。

    总结

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

  • 相关阅读:
    2020华数杯全国大学生数学建模竞赛C题-脱贫帮扶绩效评价体系的构建与探究(二)(附MATLAB和Python代码)
    Linux期末复习总结
    数据分类分级指南范围
    jmeter使用bzm线程组压测(Custom Thread Groups插件)
    hadoop测试环境sqoop使用
    【1day】复现海康威视综合安防管理平台center 接口文件上传漏洞
    前端学习2——CSS3
    服务器数据备份最佳实践快速指南
    centos脚本获取昨天日期删除指定文件之外的其他文件
    【原理分析】SpringBoot的自动装配原理
  • 原文地址:https://blog.csdn.net/qq_34526237/article/details/132817367