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

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

感谢阅读,祝君暴富!


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

psp游戏存档收集SAVEDATA

不想从头开始 ppsspp存档目录 pc:ppsspp解压目录\memstick\PSP\SAVEDATA 安卓:根目录\PSP\SAVEDATA 噬神者2(日版) NPJH50832099c645531020001000 風燐-https://wwl.lanzouq.com/iI1R01owozxa 咲夜-https://wwl.lanzouq.com/id1tX1owp2uf につてのぬ…

【ACW 服务端】页面操作Java增删改查代码生成

版本: 1.2.2-JDK17-SNAPSHOT 项目地址:wu-smart-acw 演示地址:演示地址 admin/admin Java增删改查代码生成 找到对应菜单 选择你需要的数据实例 选择数据库 选择数据库表 选择客户端(如果是本地ACW服务代码启动默认注册上的客户端ID是…

AD9226 65M采样 模数转换

用 vivado 写的 AD9220_ReadTEST module AD9220_ReadTEST( input clk, input rstn,output clk_driver, //模块时钟管脚 input [12:0]IO_data, //模块数据管脚output [11:0]ADC_Data,//12位ADC数据 output ADC_OTR //信号过压标志位 );wire areset, pll260m_lockedPIN; wire…

开源分子对接程序rDock的安装及使用流程

前言 本文介绍开源分子对接程序rDock在Linux Ubuntu 22.04系统上的conda安装、编译安装过程及程序使用流程。 一、rDock是什么? rDock来源 rDock是一个快速、多功能的开源对接程序,可用于将小分子与蛋白质和核酸对接。它专为高通量虚拟筛选&#xff08…

OLED透明屏厂家:开启2024年新征程

随着科技的不断进步和创新,OLED透明屏作为一种前沿的显示技术,正逐渐走进人们的视野,成为多个领域的焦点。在2024年2月21日这个特殊的日子,我们这家领先的OLED透明屏厂家正式开工,预示着我们将迎来一个充满机遇和挑战的…

Ubuntu22部署MySQL5.7详细教程

Ubuntu22部署MySQL5.7详细教程 一、下载MySQL安装包二、安装MySQL三、启动MySQL检查状态登录MySQL 四、开启远程访问功能1、允许其他主机通过root访问数据库2、修改配置文件,允许其他IP通过自定义端口访问 五、使用Navicat连接数据库 默认情况下,Ubuntu2…

穿越科技的电影之旅:计算机专业必看的三部经典电影

文章目录 方向一:电影推荐方向二:技术与主题方向三:职业与人生 计算机专业必看的几部电影,就像一场精彩的编程盛宴!《黑客帝国》让你穿越虚拟世界,感受高科技的魅力;《社交网络》揭示了互联网巨…

图——最小生成树实现(Kruskal算法,prime算法)

目录 预备知识: 最小生成树概念: Kruskal算法: 代码实现如下: 测试: Prime算法 : 代码实现如下: 测试: 结语: 预备知识: 连通图:在无向图…

前缀和第二弹

力扣560.和为k的子数组 子数组经典暴力解法:枚举全部位置,因为取值为可能为负 首先把前缀和,和出现的次数都存储一下,一般前缀和就出现一次,然后往后找,如果前缀和-k就说明有一段数组是等于sum-k class Sol…

Python 如何给出一个周期性函数接近某个值所有的值

Python 如何给出一个周期性函数接近某个值的值 推荐阅读正文一般化周期性函数拓展推荐阅读 Python 寻找一个一维数组中最接近某个值的元素 Python 如何切分函数 正文 一般化周期性函数 本文一看,可能感觉标题有些拗口,难以理解,请看下图: 图像显然具有一定的周期性,如…

特殊文本文件

特殊文件 普通文件.txt属性文件.propertiesXML文件.xml 为什么要用这些特殊文件 存储多个用户的:用户名、密码 存储多个用户的:用户名、密码、家乡、性别 存储有关系的数据,做完系统的配置文件 做为信息进行传输 这些特殊文件,我…

Android中通过属性动画实现文字轮播效果

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 一、创建一个自定义ProvinceView类,具体代码如下 /*** Author: ly* Date: 2024/2/22* D…

Redis的常见面试题

目录 前言 Redis支持哪些数据类型 五种核心类型 Zset为什么用跳表不用红黑树 ? Redis常见的应用场景? 如何检测Redis的连通性? 如何设置key的过期时间? Redis为什么是单线程模型? Redis里的IO多路复用是什…

恶意代码识别率提升95%!谷歌开源人工智能网络安全防御工具

近日,谷歌日前宣布发起网络安全人工智能防御计划,旨在利用人工智能技术提升网络安全水平,扭转困扰网络安全行业的“防守困境”。 该计划的核心举措是开源Magika,这是一款用于文件类型识别的AI工具,能够帮助检测恶意软件…

国产嵌入式教学实验箱操作教程:2-13 定时器控制实验

一、实验目的 熟悉定时器的基本结构,学习定时器的功能和控制方法,并实现基于定时器中断方式控制程序。 二、实验原理 定时器 TMS320CC6748有4个定时器/计数器,均可配置为64位计数器、两个独立32位计数器及自动重装32位计数器,…

【FreeRTOS基础入门】事件组与同步点

文章目录 前言一、事件组是什么案例1.1 事件组的概念 二、事件组的操作2.1 事件组与其他实现同步与互斥方法的区别2.2 创建事件组2.3 删除事件组2.4 设置事件2.5 等待事件2.6 示例代码 三、同步点3.1 同步点是什么3.2 设置同步点 总结 前言 FreeRTOS是一个广泛应用于嵌入式系统…

我的第一个浏览器插件网页一键上传的开发历史

前言 一键上传选中的网页内容,实现知识快速收藏。如飞书剪存,有道云剪报,MrDoc速记。早在2008年,我参考了有道云一键上传,实现了一个简单的浏览器插件,能方便保存网页内容到个人网站。这些插件目前都很难兼…

Day32 进程Process

文章目录 1.什么是进程1.1 概念1.2 特点1.3 进程段1.4 进程分类1.5 进程状态1.6 进程状态切换图1.7 调度进程 2.进程函数接口2.1 创建进程 fork()2.2 回收资源函数2.3 结束进程2.4 获取进程号 3.exec函数族(了解)4.守护进程 Daemon4.1 守护进程的特点4.2…

提升技术栈的秘诀:Spring Cloud学习网站带你飞跃职业瓶颈!

介绍:Spring Cloud是一个基于Spring Boot实现的微服务架构开发工具集。 Spring Cloud利用Spring Boot的开发便利性简化了分布式系统基础设施的开发。例如,服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等都是其内置的功能。它的优势包括…

LangChain支持哔哩哔哩视频总结

是基于LangChain框架下的开发,所以最开始请先 pip install Langchain pip install bilibili-api-python 技术要点: 使用Langchain框架自带的Document loaders 修改BiliBiliLoader的源码,自带的并不支持当前b站的视频加载 源码文件修改&a…