K8S部署Java项目(Springboot项目)pod状态:CrashLoopBackOff

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


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


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

文章目录

  • 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

截图
在这里插入图片描述
使用describe描述命令查看,sb-dplmdeployment名称,ns-sb是命名空间名称

kubectl describe pod sb-dplm -n ns-sb

日志截图如下,看不出什么问题,只知道意思是重启容器失败
在这里插入图片描述
使用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.mzph.cn/news/695412.shtml

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

相关文章

昇腾ACL应用开发之模型转换ATC

一.前提条件 在前面的章节中我们已经安装了包含模型转换的套件包CANN-TOOLKIT,默认的安装路径会在/usr/local/Ascend里面,我们将该套件所需要的东西加入到环境变量中以便我们调用: 将source /usr/local/Ascend/ascend-toolkit/set_env.sh加入…

人为物累,心为形役

一、人是什么 你是你,他是他,我是我,有什么区别吗,直到自我发现我与你不同时,不同是什么,身体结构?人生经历?所拥有的一切?暂时搁置这些的话,抽离我们的意识…

[ai笔记11] 论ai韭菜的自我修养

欢迎来到文思源想的ai空间,这是技术老兵学习ai以及观点分享的第11篇内容! 上班之后时间确实少了许多,但是最近也没闲着,关于ai的学习一直在探索两个部分,一个是看那本有名的书《这就是ChatGPT》,另外一个则…

Gmail邮箱群发邮件的技巧?邮箱怎么绑定?

Gmail邮箱注册教程指南?如何注册新的Gmail邮箱帐户? Gmail邮箱作为谷歌推出的邮件服务,以其高效、稳定和便捷的特性受到广大用户的喜爱。然而,如何在Gmail中进行有效的群发邮件,接下来,蜂邮将给大家介绍一…

odoo16-API(Controller)带有验证访问的接口

odoo16-API(Controller)带有验证访问的接口 目前我使用odoo原生的登录token来验证登陆的有效性 废话不多说直接上代码 # 测试获取session_id import requests class GetOdooData(http.Controller):def getOdooToken(self):# http://localhost:8123访问…

【深入理解设计模式】 工厂设计模式

工厂设计模式 工厂设计模式是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的接口。在工厂设计模式中,我们定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 工厂设计模式的目…

part2 思维导图(微分部分)

1. 导数和微分 2. 一元微分学 2.1 四则运算 2.2 口诀 2.3 导数计算 2.3.1 计算1 2.3.1 计算2

win32汇编定时器继续学习2

前面学习了win32汇编定时器,还非常不熟悉,继续熟悉,稍微增加一点功能; .386.model flat,stdcalloption casemap:noneinclude windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32…

2024生物发酵展创新盛会-兰格恒流泵

​ 参展企业介绍 兰格恒流泵有限公司成立于1997年,是英国豪迈国际有限公司(Halma)的全资子公司。我们始终坚持以客户需求为导向,提供安全、高精度及高品质的流体传输设备和解决方案。兰格产品系列超…

前端架构: 脚手架之Chalk和Chalk-CLI使用教程

Chalk Chalk 是粉笔的意思, 它想表达的是,给我们的命令行中的文本添加颜色类似彩色粉笔的功能 在官方文档当中,它的 Highlights 核心特性 Expressive API Highly performant No dependencies Ability to nest styles 256/Truecolor color support Auto-…

提高工作效率,体验ONLYOFFICE办公软件

ONLYOFFICE办公软件 一、前言二、特点完整办公套件协作过程更容易 三、访问地址 一、前言 随着数字化办公的普及,办公软件在我们的工作中扮演着越来越重要的角色。为了提高工作效率,我们需要一个功能强大、易于使用的办公软件。ONLYOFFICE作为一款全功能…

分布式系统一致性与共识算法

分布式系统的一致性是指从系统外部读取系统内部的数据时,在一定约束条件下相同,即数据(元数据,日志数据等等)变动在系统内部各节点应该是一致的。 一致性模型分为如下几种: ① 强一致性 所有用户在任意时…

安装SSH连接工具

连接Linux 1). 打开finalShell 2). 建立连接 Linux目录结构 在Linux系统中,也是存在目录的概念的,但是Linux的目录结构和Windows的目录结构是存在比较多的差异的 在Windows目录下,是一个一个的盘符(C盘、D盘、E盘),目…

东南大学easyconnect无法连接校园网的解决方案

一般没设置柯学上网的电脑都没什么问题 1.网络异常 加上clash直连即可

五种多目标优化算法(NSWOA、MOJS、MOAHA、MOPSO、NSGA2)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 1.1NSWOA 1.2MOJS 1.3MOAHA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3)&#xff0…

设计模式-创建型模式-抽象工厂模式

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。 由于工厂方法模式中的每个工厂只生产一类产品&…

stm32——hal库学习笔记(DAC)

这里写目录标题 一、DAC简介(了解)1.1,什么是DAC?1.2,DAC的特性参数1.3,STM32各系列DAC的主要特性 二、DAC工作原理(掌握)2.1,DAC框图简介(F1)2.2…

《穿越科技的前沿:计算机专业必看的电影盛宴》

文章目录 每日一句正能量前言电影推荐推荐一:《黑客帝国》推荐二:《社交网络》推荐三:《源代码》推荐四:《谍影重重》系列推荐五:《旋转木马》 技术与主题后记 每日一句正能量 一个人的一生,就是一座有了年…

探索Go语言中的HTTP路由和中间件

在Go语言中,HTTP路由和中间件是实现Web应用程序核心功能的关键组件。路由负责将传入的HTTP请求分发到适当的处理函数,而中间件则提供了一种在请求处理过程中插入额外逻辑的机制。 HTTP路由 在Go中,net/http标准库提供了基本的路由功能&…

WebGIS开发技术岗真实面经分享!

24春招在即,很多人都已经在开始踏上面试的征程 面对日益严峻的就业环境,想获得更好的工作机会,没有捷径可走,只有不断提升才是硬道理。在此小编分享几个网友GIS开发岗真实的面试经历,希望对正在求职的你,有…