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

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


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


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

文章目录

  • 1. 场景
  • 2. 报错
  • 3. 分析
  • 4. 解决
    • 4.1 查看pod位置
    • 4.2 删除pod
    • 4.3 删除镜像
    • 4.4 配置参数
    • 4.5 重新构建镜像(执行gitlab CI)
    • 4.6 重新部署deployment
    • 4.7 查看pod

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

1. 场景

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

2. 报错

pod状态STATUS如下

CrashLoopBackOff

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

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

报错内容

Error: Unable to access jarfile app.jar

报错截图如下,可以看到报错问题是无法获取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

4.2 删除pod

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

kubectl delete deployment sb-dplm -n ns-sb

4.3 删除镜像

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

docker rmi 镜像ID

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:stableservices:- 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

同时在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

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

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

4.6 重新部署deployment

然后重新部署deployment文件即可

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

4.7 查看pod

再次查看pod是否成功启动

kubectl get pod -n ns-sb -o wide

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

感谢阅读,祝君暴富!


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue报错,xxx is defined #变量未定义

vue.js:5129 [Vue warn]: Error in v-on handler: "ReferenceError: count is not defined" 浏览器将这个变量 当做全局变量了,事实上它只是实例中的变量 加上this指定,是vue实例中的变量

Sora的第一波受害者出现了。

不知道大家最近除了被Sora刷屏之外,有没有被这张图刷屏 我只能说网友太强大了 说实话,我进入舟老师的直播间,每次都是还有3分钟下播,还有6单就拍完 但是10分钟后还在激情逼单,6单之后还有6单 也许在营销学上&#x…

代码随想录算法训练营第二天

● 今日学习的文章链接和视频链接 ● 自己看到题目的第一想法 977.有序数组的平方 方法一&#xff1a; 思路&#xff1a; 先将数据所有数据平方将数组排序 代码&#xff1a; class Solution { public:vector<int> sortedSquares(vector<int>& nums) {vect…

Z 字形变换

题目链接 Z 字形变换 题目描述 注意点 s 由英文字母&#xff08;小写和大写&#xff09;、‘,’ 和 ‘.’ 组成1 < numRows < 1000 解答思路 一种方法是模拟整个Z字形变换思路&#xff0c;使用一个二维数组存储变换后的矩阵&#xff0c;首先需要确定这个矩阵的行数r…

猫头虎分享已解决Bug || SyntaxError: Unexpected token < in JSON at position 0

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

说一下JVM创建对象的流程?

一、类加载检查。 在实例化一个对象的时候&#xff0c;JVM 首先会去检查目标对象是否已经被加载并初始化了。如果没有&#xff0c;JVM 需要立刻去加载目标类&#xff0c;然后调用目标类的构造器完成初始化。然后初始化的过程&#xff0c;主要是对目标类里面的静态变量、成员变…

新手入门C语言之移位操作符和位操作符

在C语言中&#xff0c;移位操作符和位操作符是专门针对二进制的数字进行&#xff0c;因此&#xff0c;在描述移位操作符和位操作符之前&#xff0c;我们先来了解十进制&#xff0c;二进制&#xff0c;八进制&#xff0c;十六进制等的含义以及相互之间的转化。 一.进制以及相互…

为什么需要MDL锁

点击上方蓝字关注我 在数据库管理中&#xff0c;元数据&#xff08;metadata&#xff09;的保护至关重要&#xff0c;而MySQL中的"元数据锁"&#xff08;MDL锁&#xff09;就是它的守护者。 1. 什么是MDL锁MDL锁&#xff0c;全名Metadata Lock&#xff0c;是MySQL中…

WordPress使用

WordPress功能菜单 仪表盘 可以查看网站基本信息和内容。 文章 用来管理文章内容&#xff0c;分类以及标签。编辑文章以及设置分类标签&#xff0c;分类和标签可以被添加到 外观-菜单 中。 分类名称自定义&#xff1b;别名为网页url链接中的一部分&#xff0c;最好别设置为中文…

为M系Mac安装Centos

下载镜像 需要使用特殊镜像&#xff0c;官网或国内的arch 镜像源不可安装 https://share.weiyun.com/2qc0S2VV CentOS-7-aarch64-08191738.mpg https://www.aliyundrive.com/s/1DCW2E5EySR 原文链接&#xff1a;https://blog.csdn.net/acdemic964850/article/details/1290565…

docker部署grafana+zabbix监控

1. grafana介绍 Grafana 是一个开源的数据可视化工具&#xff0c;它可以帮助用户将数据源中的数据进行图形化展示和实时监控&#xff0c;以便于用户能够更加直观地理解数据。Grafana 支持多种数据源&#xff0c;包括 Graphite、Elasticsearch、InfluxDB、Prometheus 等&#x…

【鸿蒙 HarmonyOS 4.0】开发工具安装

一、准备开发环境 1.1、安装IDE 鸿蒙应用开发需要使用配套的IDE——HUAWEI DevEco Studio。 DevEco Studio基于IntelliJ IDEA Community&#xff08;IDEA社区版&#xff09;构建&#xff0c;为鸿蒙应用提供了一站式开发环境&#xff0c;集成了开发、运行、调试以及发布应用的…