邢台做网站推广的公司,照明工业网站建设,企业策划书模板word,百度云盘网官网天行健#xff0c;君子以自强不息#xff1b;地势坤#xff0c;君子以厚德载物。 每个人都有惰性#xff0c;但不断学习是好好生活的根本#xff0c;共勉#xff01; 文章均为学习整理笔记#xff0c;分享记录为主#xff0c;如有错误请指正#xff0c;共同学习进步。… 天行健君子以自强不息地势坤君子以厚德载物。 每个人都有惰性但不断学习是好好生活的根本共勉 文章均为学习整理笔记分享记录为主如有错误请指正共同学习进步。 文章目录 1. 场景2. 报错逐步查看3. 分析4. 解决4.1 查看pod位置4.2 删除pod4.3 删除镜像4.4 配置参数4.5 重新构建镜像执行gitlab CI4.6 重新部署deployment4.7 查看pod 相关文章K8S部署Java项目Gitlab CI/CD自动化部署
1. 场景
在k8s集群中部署Java的springboot项目gitlab自动化打包构建的镜像部署deployment文件时报错后一直重启
2. 报错逐步查看
pod状态STATUS如下
CrashLoopBackOff截图 使用describe描述命令查看sb-dplm是deployment名称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 wide4.2 删除pod
首先我们要把之前部署的pod删除该操作可在主节点k8s-master节点执行 为了完全删除我们使用deployment名称删除sb-dplm是deployment名称ns-sb是命名空间名称
kubectl delete deployment sb-dplm -n ns-sb4.3 删除镜像
到pod所在服务器我这是k8s-worker2节点删除镜像
docker rmi 镜像ID4.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.skiptrue表示跳过单元测试- mvn clean package -Dmaven.test.skiptrue#确保文件夹创建成功查看一下- 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 TZAsia/Shanghai#复制文件到镜像中将本地文件或目录复制到镜像指定位置该操作也在.gitlab-ci.yml文件中脚本进行执行了
COPY app.jar app.jar#容器入口该命令应该是将每个字符串组合起来nohub java -jar app.jar
#ENTRYPOINT [nohup,java,-jar,app.jar]#声明要监听的端口暴露端口容器内部的端口这里暂时不用
EXPOSE 80894.5 重新构建镜像执行gitlab CI
可以看到虽然依旧有removing app.jar操作但是下面我们列举当前文件列表其中app.jar保留了下来
4.6 重新部署deployment
然后重新部署deployment文件即可
kucectl apply -f springboot-yaml/sb-dplm.yaml4.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
感谢阅读祝君暴富