K8S部署Java项目(Gitlab CI/CD自动化部署终极版)

news2025/2/27 20:56:48

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


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


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

文章目录

  • 一、平台搭建
    • 1. `K8S`搭建
    • 2. `Gitlab`代码仓库部署
    • 3. `Gitlab Runner`执行工具部署
    • 4. `Harbor`镜像仓库部署
      • 4.1 部署Harbor
      • 4.2 创建仓库项目
  • 二、`Java Springboot`项目上传到Gitlab
    • 1. 项目demo获取
    • 2. pom配置
    • 3. Dokcerfile和.gitlab-ci.yml配置
    • 4. Dokcerfile和.gitlab-ci.yml拓展信息
      • 4.1 Dockerfile文件配置
      • 4.2 .gitlab-ci.yml文件配置
    • 5. 上传项目到Gitlab
  • 三、CI功能打包、构建镜像
    • 1. 流程介绍
    • 2. 打包阶段
    • 3. 构建镜像阶段
    • 4. Harbor查看镜像
  • 四、部署镜像(项目)
    • 1. yaml文件配置
    • 2. 将文件上传到服务器
    • 3. 创建命名空间
    • 4. 部署yaml文件
      • 4.1 部署pvc
      • 4.2 部署deploy
      • 4.3 部署svc
    • 5. 查看服务
      • 5.1 查看pvc
      • 5.2 查看deploy
      • 5.3 查看svc
      • 5.4 查看pod
      • 5.5 查看logs
      • 5.6 查看describe
  • 五、访问验证
    • 1. 服务所在节点IP
    • 2. deploy配置的端口
    • 3. Java项目接口URL
    • 4. 完整访问URL
    • 5. 访问服务接口
      • 5.1 curl访问
      • 5.2 浏览器访问
  • 六、拓展(尚未成功,继续研究,仅供参考)
    • 1. 配置Ingress
    • 2. 访问服务
  • 七、报错汇总
    • 1. pod启动失败的查看命令
    • 2. 报错内容汇总


一、平台搭建

在K8S集群中,配合Gitlab、Harbor实现自动化部署Java springboot服务
首先需要搭建K8S集群、Gitlab及Gitlab Runner、Harbor,如已部署或有相同平台可忽略

1. K8S搭建

首先你要有一个K8S集群,如已搭建可跳过,没有可以参考链接搭建
K8S搭建(centos)完整版
k8s搭建(ubuntu)详细演示完整一篇

2. Gitlab代码仓库部署

用于管理项目代码和使用CI自动化工具
如已有可用环境可忽略,如无可参考安装使用
K8S部署GitLab(详细完整版)

3. Gitlab Runner执行工具部署

用于执行自动化脚本实现自动化打包、构建镜像等操作
如已有可用环境可忽略,如无可参考安装使用
gitlab runner 安装、注册、配置、使用(Docker部署)

4. Harbor镜像仓库部署

4.1 部署Harbor

用于存储自动化构建的镜像,后续部署服务会从仓库拉取
如已有可用环境可忽略,如无可参考安装使用
K8S部署Harbor镜像仓库(含离线安装包harbor-offline-installer国内下载链接)
K8S部署Harbor(三部曲之一:配置)
K8S部署Harbor(三部曲之二:部署)
K8S部署Harbor(三部曲之三:使用)

4.2 创建仓库项目

创建harbor镜像仓库项目用于存放推送的项目镜像,项目名为k8s-demo
在这里插入图片描述

二、Java Springboot项目上传到Gitlab

需要提前准备好Java项目,并上传到Gitlab代码仓库

1. 项目demo获取

如果没有现成的springboot项目可以从下面链接获取
下载:Java项目-基于Gitlab CI/CD功能实现自动化部署(在k8s中部署)
其中主要包含了如下文件:

  • 一个简单的请求接口用于后续验证部署是否成功
  • 构建镜像用的Dockerfile配置文件,构建项目镜像使用的文件
  • Gitlab的.gitlab-ci.yml配置文件,该文件用于执行自动化部署脚本等操作
  • 后续部署需要用到的yaml文件sb-pvc.yaml、sb-dplm.yaml、sb-svc.yaml、以及配置域名的sb-igs.yaml
  • 一些Java项目相关的文件

项目截图:
在这里插入图片描述

2. pom配置

需要在pom中添加maven插件依赖、maven插件并定义jar包名称(需要与springboot版本保持一致)

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.6.3</version>
        </dependency>
    </dependencies>
    
    <build>
        <!--配置后最终生成的jar包名称就是该元素中的名称
        指定package打包后生成的jar包文件名称为app.jar,package打包后会在target文件夹中看到app.jar文件-->
        <finalName>app</finalName>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.6.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

3. Dokcerfile和.gitlab-ci.yml配置

可根据Java项目情况参考文章配置这两个文件的内容
我是用的两个文件的模板连接如下:
三个都一样,推荐使用第一个
Dockerfile和.gitlab-ci.yml文件模板(标准版)
Dockerfile和.gitlab-ci.yml文件模板(精简无注释)
Dockerfile和.gitlab-ci.yml文件模板(含详细注释)

4. Dokcerfile和.gitlab-ci.yml拓展信息

下面是拓展介绍,可忽略

4.1 Dockerfile文件配置

Dockerfile文件配置参考:Dockerfile文件参数配置和使用

4.2 .gitlab-ci.yml文件配置

.gitlab-ci.yml文件配置参考:.gitlab-ci.yml文件参数配置和使用
.gitlab-ci.yml文件参数汇总及解释参考:.gitlab-ci.yml文件参数

5. 上传项目到Gitlab

配置文件配置好之后就可以将项目上传到Gitlab代码仓库中了
可参考下方链接文章,虽然是gitee但与gitlab相似
通过GIT将本地项目上传到gitee
当然前面搭建Gitlab的文章中也有介绍如何上传本地项目到Gitlab

三、CI功能打包、构建镜像

在上面我们将代码上传到Gitlab上以后即可触发CI/CD流程

1. 流程介绍

Gitlab检测到.gitlab-ci.yml文件会调用Gitlab Runner执行该文件中的脚本,进行流程化作业部署
执行过程会根据yml文件中的阶段进行,流程如下:

  • 打包
  • 构建镜像
  • 将镜像推送到镜像仓库
  • 在主节点服务器中执行kubectl命令(即部署yaml文件)部署项目
  • 后续更新镜像,yaml文件会根据镜像地址拉取新的镜像,实现服务自动部署

提交即部署,体验还不错

接下来是在gitlab中自动执行的操作

2. 打包阶段

job1_package执行过程
准备docker执行器—准备环境—仓库资源拉取—执行job的脚本—开始jar打包—下载依赖—打包完成
在这里插入图片描述
此处省略下载过程(略长)。。。。。。
在这里插入图片描述
job中的脚本执行完毕后会输出Job succeed表示这个job已经执行结束

3. 构建镜像阶段

job2_build执行过程
构建镜像阶段:先用docker命令登录harbor仓库–通过Dockerfile文件构建镜像放到本地—推送到harbor镜像仓库—删除本地镜像
在这里插入图片描述
在这里插入图片描述

构建镜像阶段任务完成
表示构建镜像并推送成功

4. Harbor查看镜像

此时可以到harbor镜像仓库中查看是否成功上传,可以看到已经存在
在这里插入图片描述
到此表示gitlabCI任务的打包、构建镜像两个阶段结束
以上两个阶段为gitalb自动化执行的文件脚本,接下来看需要部署yaml文件,但部署yaml只需要一次,后续更新镜像后会自动部署

四、部署镜像(项目)

根据Java项目情况配置三个yaml文件,其中deploy的yaml文件中镜像的拉取地址为上面自动化构建后推送的镜像仓库地址

1. yaml文件配置

可参考文章配置三个yaml文件用于部署Java项目:K8S部署Java项目的yaml配置文件模板

2. 将文件上传到服务器

需要将yaml文件上传到集群中的节点服务器中,我这里是可执行kubectl命令的主节点k8s-master
放到自己创建的文件夹springboot-yaml中
在这里插入图片描述

3. 创建命名空间

在主节点k8s-master中执行kubectl命令
创建命名空间用于管理部署的服务

kubectl create namespace ns-sb

在这里插入图片描述
查看所有命名空间

kubectl get namespace -A

在这里插入图片描述

4. 部署yaml文件

依次部署pvc文件、deploy文件、svc文件

4.1 部署pvc

kubectl apply -f springboot-yaml/sb-pvc.yaml

在这里插入图片描述

4.2 部署deploy

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

在这里插入图片描述

4.3 部署svc

kubectl apply -f springboot-yaml/sb-svc.yaml

在这里插入图片描述

5. 查看服务

以下查看命令都可尝试在最后加上-o wide参数来查看更为详细的信息
注:由于部署过程中出现了很多问题,所以会删除部署的服务重新部署,截图中有些服务名称变了,请忽略该细节,最终的结果是成功的。然后遇到的问题也都总结在最后一章了,如遇到类似可供参考

5.1 查看pvc

kubectl get pvc -n ns-sb

刚开始时Pending
在这里插入图片描述
绑定后是Bound
在这里插入图片描述

5.2 查看deploy

kubectl get deployment -n ns-sb

在这里插入图片描述

5.3 查看svc

kubectl get svc -n ns-sb

在这里插入图片描述

5.4 查看pod

kubectl get pod -n ns-sb

在这里插入图片描述
还可以加-o wide参数来查看pod所在节点以及集群ip

kubectl get pod -n ns-sb -o wide

在这里插入图片描述

5.5 查看logs

查看pod的logs日志

kubectl logs sb-dplm-898c9564-v8nq7 -n ns-sb

在这里插入图片描述

5.6 查看describe

查看pod的describe描述

kubectl describe pod sb-dplm-898c9564-v8nq7 -n ns-sb

在这里插入图片描述

五、访问验证

部署完成后,进行访问(如果从节点未配置kubectl命令执行权限则需要再主节点进行操作)
IP+端口+接口请求

1. 服务所在节点IP

需要先确定我们部署的项目pod所在的服务器是哪个(可使用第四章3.5.4小节查看pod的第二个命令进行查看)
如查看我的pod所在位置为k8s-worker2节点,该节点的iP为173.33.0.222

2. deploy配置的端口

我们在部署的deploy配置文件中配置的端口参数即nodePort值为30089

3. Java项目接口URL

最后是我们Java项目的接口请求url为test/java

4. 完整访问URL

所以我们访问的url为

173.33.0.222:30089/test/java

5. 访问服务接口

5.1 curl访问

可在命令窗口通过curl执行get请求(接口注解为@GetMapping)

curl 173.33.0.222:30089/test/java

如图输出我们返回的内容就表示服务可正常访问,表示springboot在k8s中部署成功
在这里插入图片描述

5.2 浏览器访问

也可通过浏览器访问

173.33.0.222:30089/test/java

输出返回内容表示服务正常,部署成功
在这里插入图片描述

六、拓展(尚未成功,继续研究,仅供参考)

通常只有开发测试环境才会使用nodePort方式访问,生产环境需要使用更为安全的访问方法(LoadBalncer或者配置ingress)
我们配置ingress使用自己定义的域名进行访问

1. 配置Ingress

和sb-pvc.yaml、sb-dplm.yaml、sb-svc.yaml放在同一位置,我们可以直接使用vim命令创建并编辑Ingress文件

vim springboot-yaml/sb-igs.yaml

依旧可参考K8S部署Java项目的yaml配置文件模板中的ingress配置文件进行编辑,保存后部署
在这里插入图片描述

2. 访问服务

部署后可使用定义的域名进行访问

hs.sb.com/test/java

七、报错汇总

1. pod启动失败的查看命令

如果pod启动状态有问题,可执行以下两个命令进行检查
查看pod描述信息

kubectl describe pod podname -n namespacename

kubectl describe pod sb-dplm-898c9564-qm425 -n ns-sb

查看pod日志信息

kubectl logs podname -n namespacename

kubectl logs sb-dplm-898c9564-qm425 -n ns-sb

2. 报错内容汇总

以下为整个过程中遇到的问题以及解决方法,供大家参考,希望有所帮助

  • /usr/bin/bash: line 136: docker:command not found
    Gitlab CI/CD docker命令报错:/usr/bin/bash: line 136: docker:command not found
  • ERROR: Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker running?
    Gitlab CI/CD ERROR: Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker running?
  • error during connect: Post http://docker:2375/v1.40xxxxxx: dial tcp: lookup docker o
    Gitlab CI/CD报错: error during connect: Post http://docker:2375/v1.40xxxxxx: dial tcp: lookup docker o
  • ERROR: error during connect : Get “http://docker:2375/_ping“: dial tcp:lookup docker on 10
    Gitlab CI ERROR: error during connect : Get “http://docker:2375/_ping“: dial tcp:lookup docker on 10
  • /usr/bin/bash: line 137: kubectl: command not found
    Gitlab CI 报错: /usr/bin/bash: line 137: kubectl: command not found
  • Error: Unable to access jarfile app.jar
    K8S部署Java项目 pod的logs报错为:Error: Unable to access jarfile app.jar
  • Error: A JNI error has occurred, please check your installation and try again
    Error: A JNI error has occurred, please check your installation and try again
  • CrashLoopBackOff
    K8S部署Java项目(Springboot项目)pod状态:CrashLoopBackOff
  • cannot access org.springframework.context.ConfigurableApplicationContext bad class file: /root/.m2/r
    cannot access org.springframework.context.ConfigurableApplicationContext bad class file: /root/.m2/r
  • no main manifest attribute, in app.jar
    no main manifest attribute, in app.jar
  • no main manifest attribute, in app.jar备用方案,请现尝试上一个再用这个
    K8S部署Java项目 pod报错 logs日志内容:no main manifest attribute, in app.jar

感谢阅读,祝君暴富!

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

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

相关文章

编曲学习:和声小调 终止式 离调和弦 转调应用

和声小调 音阶 大调音程关系排列:全 全 半 全 全 全 半 小调音程关系排列:全 半 全 全 半 全 全 C大调音阶: 1 2 3 4 5 6 7 1 C小调音阶: 1 2 b3 4 5 b6 b7 1 C大调基本音级构成的和弦: Cmaj7 Dmin7 Emin7 Fmaj7 G7 Amin7 Bm7-5 C小调基本音级构成的和弦: Cmin7 D…

Mycat核心教程--ZooKeeper集群搭建【三】

Mycat核心教程--ZooKeeper集群搭建 八、 ZooKeeper集群搭建8.1.ZooKeeper简介8.2.数据复制的好处8.3.Zookeeper设计目的8.4.zookeeper集群包括3种角色8.4.1.Leader角色8.4.2.Follower 角色8.4.3.Observer 角色 8.5.zookeeper集群工作流程8.6.zookeeper集群节点数量为奇数&#…

stm32——hal库学习笔记(DMA实验)

一、DMA介绍&#xff08;了解&#xff09; 二、DMA结构框图介绍&#xff08;熟悉&#xff09; 三、DMA相关寄存器介绍&#xff08;熟悉&#xff09; 四、DMA相关HAL库驱动介绍&#xff08;掌握&#xff09; 五、DMA配置步骤&#xff08;掌握&#xff09; 六、编程实战&#xff…

进程间通信学习笔记(有名管道和无名管道)

进程间通信方式&#xff1a; 无名管道(pipe)有名管道(fifo)信号(signal)共享内存(mmap)套接字(socket) 无名管道&#xff1a; 在内核里面开辟一片内存&#xff0c;进程1和进程2都可以通过这片内存进行通信 无名管道特点&#xff1a; 只能用于具有亲缘关系的进程之间的通信&am…

5Why分析法不会用?别担心,精益企业管理咨询公司助你解锁新技能

近年来&#xff0c;为了保持竞争力&#xff0c;许多企业开始转向精益管理&#xff0c;而5Why分析法则是实现这一目标的关键工具之一。然而&#xff0c;对于许多初学者来说&#xff0c;5Why分析法可能显得陌生和复杂。今天&#xff0c;天行健精益企业管理咨询公司就来分享如何运…

浅谈 FD 、PCB 以及 进程内存布局

文章目录 名词解释概念介绍进程内存布局 名词解释 FD&#xff1a;file description&#xff0c;文件描述符&#xff0c;是一个指针变量。 PCB&#xff1a;进程控制块。 概念介绍 我们知道&#xff0c;linux 里面的文件都有基本信息&#xff0c;例如&#xff1a;文件路径、文…

Redis 管道详解

Redis 管道 关键词&#xff1a;Pipeline Pipeline 简介 Redis 是一种基于 C/S 模型以及请求/响应协议的 TCP 服务。通常情况下&#xff0c;一个 Redis 命令的请求、响应遵循以下步骤&#xff1a; 客户端向服务端发送一个查询请求&#xff0c;并监听 Socket 返回&#xff08…

SAR ADC学习笔记(2)

SAR ADC工作原理 基本算法&#xff1a;二进制搜索 / 折半查找 SAR ADC基本结构&#xff1a;采样保持电路、电容DAC、比较器、SAR逻辑

Docker Volume

"Ice in my vein" Docker Volume(存储卷) 什么是存储卷? 存储卷就是: “将宿主机的本地文件系统中存在的某个目录&#xff0c;与容器内部的文件系统上的某一目录建立绑定关系”。 存储卷与容器本身的联合文件系统&#xff1f; 在宿主机上的这个与容器形成绑定关系…

BLEU: a Method for Automatic Evaluation of Machine Translation

文章目录 BLEU: a Method for Automatic Evaluation of Machine Translation背景和意义技术原理考虑 n n n - gram中 n 1 n1 n1 的情况考虑 n n n - gram中 n > 1 n\gt 1 n>1 的情况考虑在文本中的评估初步实验评估和结论统一不同 n n n 值下的评估数值考虑句子长度…

在培训机构中备考PMP为什么题库这么重要?

参加过培训和考试&#xff0c;对题库的了解也就越来越深了&#xff0c;刚开始接触PMP的时候以为学习的时候会像其他考试一样有官方题库进行参考&#xff0c;但是了解后才发现一切都没有我想的那么简单&#xff0c;也是在威班PMP培训的时候才知道题库是多重要。 PMI有官方题库吗…

等保测评与商用密码共铸工控安全“双评合规”新篇章

最近听说了一个段子&#xff1a;“网络安全就像美女的内衣&#xff0c;等保和密评就是最贴身的内衣两件套&#xff0c;上下身一件都不能少。否则你的魔鬼身材&#xff08;核心数据&#xff09;就有可能被色狼&#xff08;黑客&#xff09;一览无余&#xff08;数据泄漏&#xf…

数据安全治理实践路线(中)

数据安全建设阶段主要对数据安全规划进行落地实施&#xff0c;建成与组织相适应的数据安全治理能力&#xff0c;包括组织架构的建设、制度体系的完善、技术工具的建立和人员能力的培养等。通过数据安全规划&#xff0c;组织对如何从零开始建设数据安全治理体系有了一定认知&…

数据分析-Pandas数据如何图示规律

数据分析-Pandas数据如何图示规律 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

大语言模型推理加速技术:模型压缩篇

原文&#xff1a;大语言模型推理加速技术&#xff1a;模型压缩篇 - 知乎 目录 简介 量化(Quantization) LLM.int8() GPTQ SmoothQuant AWQ 精简Attention 共享Attention参数 Multi-Query Attention Grouped-Query Attention 稀疏Attention Sliding Window Attenti…

【QT+QGIS跨平台编译】之五十二:【QGIS_CORE跨平台编译】—【qgsexpressionlexer.cpp生成】

文章目录 一、Flex二、生成来源三、构建过程一、Flex Flex (fast lexical analyser generator) 是 Lex 的另一个替代品。它经常和自由软件 Bison 语法分析器生成器 一起使用。Flex 最初由 Vern Paxson 于 1987 年用 C 语言写成。 “flex 是一个生成扫描器的工具,能够识别文本中…

QYYB-01 无线雨量报警仪 集监测 采集 记录 报警一体机

产品概述 无线雨量报警仪&#xff0c;又名简易雨量报警器、遥测雨量报警仪&#xff0c;是一款可以实时测量并显示降雨量的仪器&#xff0c;支持无线传输数据、同步显示新数据、数据超标自动报警、自动存储数据、查询和导出数据等多项功能&#xff0c;由翻斗式雨量传感器、数据采…

什么是高可用架构

一、什么是高可用 在运维中&#xff0c;经常听到高可用&#xff0c;那么什么是高可用架构呢&#xff1f;通俗点讲&#xff0c;高可用就是在服务故障&#xff0c;节点宕机的情况下&#xff0c;业务能够保证不中断&#xff0c;服务正常运行。 举个例子&#xff0c;支付宝&#…

ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a; http://122.227.135.243:9666 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbach…

抽象的后端

Connection refused: no further information 出现这条代码的核心是你使用redis&#xff0c;但是本地没有开启redis服务 如何启动redis服务 第一步&#xff1a;确定你安装了对应的框架 以spring为例 <dependency><groupId>org.springframework.boot</group…