天行健,君子以自强不息;地势坤,君子以厚德载物。
每个人都有惰性,但不断学习是好好生活的根本,共勉!
文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。
文章目录
- 一、平台搭建
-
- [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 创建仓库项目)
- [1. `K8S`搭建](#1.
- [二、`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. 报错内容汇总
以下为整个过程中遇到的问题以及解决方法,供大家参考,希望有所帮助
- /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
感谢阅读,祝君暴富!