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

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


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


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

文章目录

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

pom 复制代码
    <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命令

创建命名空间用于管理部署的服务

l 复制代码
kubectl create namespace ns-sb

查看所有命名空间

l 复制代码
kubectl get namespace -A

4. 部署yaml文件

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

4.1 部署pvc

l 复制代码
kubectl apply -f springboot-yaml/sb-pvc.yaml

4.2 部署deploy

l 复制代码
kubectl apply -f springboot-yaml/sb-dplm.yaml

4.3 部署svc

l 复制代码
kubectl apply -f springboot-yaml/sb-svc.yaml

5. 查看服务

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

5.1 查看pvc

l 复制代码
kubectl get pvc -n ns-sb

刚开始时Pending

绑定后是Bound

5.2 查看deploy

l 复制代码
kubectl get deployment -n ns-sb

5.3 查看svc

l 复制代码
kubectl get svc -n ns-sb

5.4 查看pod

l 复制代码
kubectl get pod -n ns-sb

还可以加-o wide参数来查看pod所在节点以及集群ip

l 复制代码
kubectl get pod -n ns-sb -o wide

5.5 查看logs

查看pod的logs日志

l 复制代码
kubectl logs sb-dplm-898c9564-v8nq7 -n ns-sb

5.6 查看describe

查看pod的describe描述

l 复制代码
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为

l 复制代码
173.33.0.222:30089/test/java

5. 访问服务接口

5.1 curl访问

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

l 复制代码
curl 173.33.0.222:30089/test/java

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

5.2 浏览器访问

也可通过浏览器访问

l 复制代码
173.33.0.222:30089/test/java

输出返回内容表示服务正常,部署成功

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

通常只有开发测试环境才会使用nodePort方式访问,生产环境需要使用更为安全的访问方法(LoadBalncer或者配置ingress)

我们配置ingress使用自己定义的域名进行访问

1. 配置Ingress

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

l 复制代码
vim springboot-yaml/sb-igs.yaml

依旧可参考K8S部署Java项目的yaml配置文件模板中的ingress配置文件进行编辑,保存后部署

2. 访问服务

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

l 复制代码
hs.sb.com/test/java

七、报错汇总

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

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

查看pod描述信息

l 复制代码
kubectl describe pod podname -n namespacename

l 复制代码
kubectl describe pod sb-dplm-898c9564-qm425 -n ns-sb

查看pod日志信息

l 复制代码
kubectl logs podname -n namespacename

l 复制代码
kubectl logs sb-dplm-898c9564-qm425 -n ns-sb

2. 报错内容汇总

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


感谢阅读,祝君暴富!

相关推荐
鸽鸽程序猿20 分钟前
【算法】【优选算法】二分查找算法(下)
java·算法·二分查找算法
遇见你真好。36 分钟前
自定义注解进行数据脱敏
java·springboot
x2lab38 分钟前
国产化 ARM 环境mysql-mariadb 部署
arm开发·mysql·docker·mariadb
NMBG2239 分钟前
[JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决
java·开发语言·面试·java-ee·intellij-idea
像污秽一样1 小时前
Spring MVC初探
java·spring·mvc
计算机-秋大田1 小时前
基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解
java·spring boot·微信小程序·小程序·vue
LuckyLay1 小时前
Spring学习笔记_36——@RequestMapping
java·spring boot·笔记·spring·mapping
醉颜凉2 小时前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
狂奔solar2 小时前
分享个好玩的,在k8s上部署web版macos
前端·macos·kubernetes
阿维的博客日记2 小时前
java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程
java·jvm