• K8S部署Java项目 pod的logs报错为:Error: Unable to access jarfile app.jar


    天行健,君子以自强不息;地势坤,君子以厚德载物。


    每个人都有惰性,但不断学习是好好生活的根本,共勉!


    文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。

    相关文章:K8S部署Java项目(Gitlab CI/CD自动化部署)

    1. 场景

    在k8s集群中部署Java的springboot项目(gitlab自动化打包构建的镜像),部署deployment文件时报错后一直重启

    2. 报错

    pod状态STATUS如下

    CrashLoopBackOff
    
    • 1

    截图
    在这里插入图片描述
    使用logs命令查看,sb-dplm-d765487f8-6plb2pod名称

    kubectl logs sb-dplm-d765487f8-6plb2 -n ns-sb
    
    • 1

    报错内容

    Error: Unable to access jarfile app.jar
    
    • 1

    报错截图如下,可以看到报错问题是无法获取jar包文件app.jar
    在这里插入图片描述

    3. 分析

    应该是镜像问题,构建的镜像可能没有app.jar包或者app.jar放置的位置不对,或者其他。
    此时我们到gitlab cicd的job界面看buid构建镜像阶段的job终端窗口输出内容
    找到了在阶段开始更新资源时的操作如下
    在这里插入图片描述
    可以看到他移除了target文件夹,而且也移除了我复制到当前目录的app.jar文件
    也可以看到后续列举当前文件列表中没有我们需要的app.jar了
    问题也就出在这里了
    这个操作是不可以的,但好像默认情况下,不设置artifacts参数配置就会自动移除诸如.zip,.jar等文件
    怎么才能让他不移除我们的app.jar
    在构建打包阶段的末尾添加artifacts参数来配置app.jar文件路径名,使其可在后续阶段可以使用

    4. 解决

    4.1 查看pod位置

    如果不知道部署的pod在那个服务器节点,可使用以下命令在主节点执行查看

    kubectl get pod -n ns-sb -o wide
    
    • 1

    4.2 删除pod

    首先我们要把之前部署的pod删除,该操作可在主节点(k8s-master节点)执行
    为了完全删除我们使用deployment名称删除(sb-dplm是deployment名称,ns-sb是命名空间名称)

    kubectl delete deployment sb-dplm -n ns-sb
    
    • 1

    4.3 删除镜像

    到pod所在服务器(我这是k8s-worker2节点)删除镜像

    docker rmi 镜像ID
    
    • 1

    4.4 配置参数

    接下来修改配置文件添加参数
    在.gitlab-ci.yml文件内容中打包阶段添加artifacts,构建镜像阶段添加dependencies
    如下

    #打包项目
    job1-package:
      #任务阶段
      stage: package
      #任务执行选用的runner的标签,定义后会根据标签选用对应的runner执行任务,也可省略,会自动选取一个使用
      tags:
        - runner-01
      #指定此job只对master分支生效,不定义则对所有分支生效
      only:
        - master
      #执行脚本,maven打包,创建文件夹,将jar包复制到文件夹中
      script:
        #提示信息打印
        - echo '打包任务开始---->打jar包,将包从target文件夹中复制到当前目录'
        #跳过测试打包,-Dmaven.test.skip=true表示跳过单元测试
        - mvn clean package -Dmaven.test.skip=true
        #确保文件夹创建成功,查看一下
        - ls
        #打包之后jar包默认存放位置为target/目录下,可查看jar包
        - ls target
        - cp target/app.jar app.jar
        - ls
      #因为后续要用到这个任务打的包文件,后续配合dependencies在其他任务引用,不设置则会被后续任务开始阶段移除
      artifacts:
        paths:
          - app.jar
    
    #任务部分,根据定义的stage顺序来执行任务
    #构建镜像
    job2-build:
      #任务阶段
      stage: build
      #任务引用的镜像,构建镜像时会使用Dockerfile文件中的内容,包含镜像配置,故该job中无需镜像配置
      image: docker:stable
      services:
        - docker:24.0.7-dind
      #任务执行选用的runner的标签,定义后会根据标签选用对应的runner执行任务
      tags:
        - runner-01
      #局部前置脚本命令,仅作用于此任务部分
      before_script:
        - echo "开始构建镜像--->"
    
      #执行脚本,列举jar包文件夹,构建镜像,打标签,推送镜像,删除镜像
      script:
        #提示信息打印
        - echo '打标签---推送镜像---删除镜像'
        #首先查看当前目录位置,此时查看到的内容就是app.jar中的文件内容,当前位置为/k8s-dev-ops/jar/k8s-project,也就是Dockerfile中WORKDIR定义的值
        - ls
        #首先登录harbor镜像仓库,否则在推送的时候会爆未授权的错误
        - docker login 173.33.0.224:8443 -u admin -p Harbor12345
        #这里可以直接构建镜像,省略前面的步骤,注意,最后的点不要忘记
        - docker build -t $IMAGE_HARBOR_REPOSITORY/$PROJECT_IMAGE_NAME:$PROJECT_IMAGE_TAG .
        #查看镜像是否生成到本地
        - docker images | grep $PROJECT_IMAGE_TAG
        #将镜像推送到到harbor仓库,注意,这里的仓库项目名必须是提前在harbor中创建好的项目名,如果没有创建则会推送失败
        - docker push $IMAGE_HARBOR_REPOSITORY/$PROJECT_IMAGE_NAME:$PROJECT_IMAGE_TAG
        #删除jar包,先查看
        - ls
        - rm -rf app.jar
        #检查是否被删除
        - ls
        #删除本地镜像
        - docker rmi -f $IMAGE_HARBOR_REPOSITORY/$PROJECT_IMAGE_NAME:$PROJECT_IMAGE_TAG
      #配合artifacts参数使用,使用package阶段任务的打包环境
      dependencies:
        - job1-package
    
    • 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
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    同时在Dockerfile文件中也要将当前的app.jar复制到容器内的当前位置,即COPY命令的内容需要加上

    #关键字和值之间可以是空格" "也可以是等号"="
    #指定基础镜像,以此镜像为基础构建
    FROM openjdk:8-jdk-alpine
    
    #作者
    MAINTAINER hs
    
    #设置环境变量
    #JAVA_HOME环境变量定义,即配置jdk安装目录路径,需是jdk文件全路径名
    ENV JAVA_HOME=/usr/local/java/jdk1.8.0.121
    #MAVEN环境变量定义,即maven安装的位置,需是maven全路径名
    ENV MAVEN_HOME=/usr/share/maven
    #配置环境变量
    ENV PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
    #指定容器的时区
    ENV TZ=Asia/Shanghai
    
    #复制文件到镜像中,将本地文件或目录复制到镜像指定位置,该操作也在.gitlab-ci.yml文件中脚本进行执行了
    COPY app.jar app.jar
    
    #容器入口,该命令应该是将每个字符串组合起来,nohub java -jar app.jar
    #ENTRYPOINT ["nohup","java","-jar","app.jar"]
    
    #声明要监听的端口(暴露端口,容器内部的端口,这里暂时不用)
    EXPOSE 8089
    
    • 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

    4.5 重新构建镜像(执行gitlab CI)

    可以看到虽然依旧有removing app.jar操作,但是下面我们列举当前文件列表,其中app.jar保留了下来
    在这里插入图片描述

    4.6 重新部署deployment

    然后重新部署deployment文件即可

    kucectl apply -f springboot-yaml/sb-dplm.yaml
    
    • 1

    4.7 查看pod

    再次查看pod是否成功启动

    kubectl get pod -n ns-sb -o wide
    
    • 1

    这里可能会出现新的报错,启动后报错logs查看报错为no main manifest attribute, in app.jar
    可参考另一篇:K8S部署Java项目 pod报错 logs日志内容:no main manifest attribute, in app.jar

    感谢阅读,祝君暴富!


  • 相关阅读:
    【PHP框架 | Laravel8 系列5】 - 视图与CSRF保护
    教育教学论坛杂志教育教学论坛杂志社教育教学论坛编辑部2022年第39期目录
    react hook 获取setState的新值
    3D设计软件Rhinoceros 6 mac 犀牛6中文版功能特征
    QEM网格简化算法学习
    传统机器学习笔记7——GBDT模型详解
    Jedis操作Redis
    JavaScript 的发展历史
    intel cpu core/“酷睿”系列发展史,供组装机的朋友们参考
    【路径规划】基于matlab AI抗疫服务移动机器人路径规划系统【含Matlab源码 2096期】
  • 原文地址:https://blog.csdn.net/mo_sss/article/details/136211541