gitlab-ci 集成 k3s 部署spring boot 应用

简介: gitlab-ci 集成 k3s 部署spring boot 应用

环境
一台ECS gitlab 16.10

一台ECS gitlab-runner docker方式

一台腾讯云服务器 k3s k3s version v1.30.5+k3s1 (9b586704)
go version go1.22.6
本地: idea 2024

准备开始
gitlab上创建"api"仓库,本地IDEA 创建spring boot web demo项目k8s-gitlab-demo. 确保能正常打包,并本地可以通过java -jar xxx.jar 正常运行。 然后推送到gitlab的"api"仓库,后面当代码更改后可以触发流水线
代码中根目录下增 加Dockerfile,内容如下:
FROM openjdk:8-jdk
COPY ./*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
1
2
3
4
根目录下增加gitlab-ci.yml 注意名字是固定的不然流水线也不会触发。内容:

因为我们Runner执行器设置为docker, 所以这里需要指定docker的版本

image: docker:stable

variables:
MAVEN_IMAGE: maven:3.5-jdk-8-alpine # maven 打包使用的镜像
K8S_IMAGE: registry.cn-hangzhou.aliyuncs.com/sanchar/kubectl:v1.20.1 # k8s 部署使用的镜像
PROJECT_IMAGE_SERVER: registry.cn-hangzhou.aliyuncs.com # 阿里云镜像地址
PROJECT_IMAGE: registry.cn-hangzhou.aliyuncs.com/favision_anban/mes-web:1.0 # 项目镜像链接
MAVEN_OPTS: -Dmaven.repo.local=/root/.m2/repository # 指定 maven 本地仓库路径,以便做缓存
PACKAGE_CACHE_REF_NAME: k8s-gitlab-demo-cache
DEPLOYMENT_NAME: k8s-gitlab-demo # 项目在 k8s 中部署的名称
K8S_NS: demo # k8s 命名空间

stages:

  • package
  • build
  • deploy

package:
stage: package
script:

- echo "=============== 开始编译打包任务 ==============="
- rm -fr /data/gitlab-runner/tmp/intelligent
- mkdir -p /data/gitlab-runner/tmp/intelligent
- mvn clean package -P test -Dmaven.test.skip=true $MAVEN_OPTS --settings=/root/.m2/settings.xml
- cp -r target/*.jar Dockerfile /data/gitlab-runner/tmp/intelligent

only:

- master

image: $MAVEN_IMAGE

build:
stage: build
script:

- echo "=============== docker build image  ==============="
- cd /data/gitlab-runner/tmp/intelligent
- docker build -t $PROJECT_IMAGE .
- docker login --username $REG_USERNAME --password $REG_PASSWORD $PROJECT_IMAGE_SERVER
- docker push $PROJECT_IMAGE

only:

- master

使用 k8s 部署

deploy:
stage: deploy
image: $K8S_IMAGE
environment: k3s-gitlab

构建 k8s 可执行环境

before_script:

- mkdir -p /etc/kubernetes
- mv $K8S_ADMIN_CONF /etc/kubernetes/admin.conf
- echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
- source ~/.bash_profile

script:

- echo "=============== deploy  ==============="
- if [ "$(kubectl get deployment -n $K8S_NS | grep $DEPLOYMENT_NAME | awk '{print $1}')" ]; then
- kubectl set image deploy $DEPLOYMENT_NAME $DEPLOYMENT_NAME=$PROJECT_IMAGE -n $K8S_NS
- kubectl scale deployment $DEPLOYMENT_NAME --replicas=0 -n $K8S_NS
- kubectl scale deployment $DEPLOYMENT_NAME --replicas=1 -n $K8S_NS
- else
- mv $K8S_DEMO_YAML $DEPLOYMENT_NAME.yaml
- kubectl apply -f $DEPLOYMENT_NAME.yaml -n $K8S_NS
- fi

only:

- master

environment: k3s-gitlab

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
gilab-ci.yml 涉及的内容比较多,如maven拉取镜像如何加速、阿里云镜像库如何登录、k3s客户端kubectl如何访问k3s集群。后面再展开。
根目录下增加k8s-demo.yaml,用来自动部署spring boot应用,内容如下:


apiVersion: v1
kind: Service
metadata:
name: $DEPLOYMENT_NAME
namespace: demo
labels:
app: ci-cd-demo
spec:
type: NodePort
ports:

  • name: ci-cd-demo
    port: 8080
    protocol: TCP
    nodePort: 30080
    selector:
    app: ci-cd-demo

apiVersion: apps/v1
kind: Deployment #对象类型
metadata:
name: $DEPLOYMENT_NAME #名称
labels:
app: ci-cd-demo #标注
spec:
replicas: 1 #运行容器的副本数,修改这里可以快速修改分布式节点数量
selector:
matchLabels:
app: ci-cd-demo
template:
metadata:
labels:
app: ci-cd-demo
spec:
containers: #docker容器的配置

   - name: $DEPLOYMENT_NAME
     image: $PROJECT_IMAGE
     imagePullPolicy: Always
     ports:
       - containerPort: 8080
         protocol: TCP
     env:
       - name: JAVA_OPTS
         value: -Xms256m -Xmx256m
 imagePullSecrets:
   - name: aliyun-respository-secret

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
可以看到在gitlab.yml的流水线及k8s-demo.yaml中用到了很多的变量,如REG_USERNAME、 K8S_IMAGE、 K8S_ADMIN_CONF等有的变量文件中没有需要在gitlab->api仓库、设置->ci/cd->变量中增加。如图:

详细说明如下:

K8S_ADMIN_CONF: 为文件类型变量,内容是k3s的配置文件内容
具体位置在腾讯云服务器的/etc/rancher/k3s/k3s.yml
注意copy值之前要把里面的server地址改成服务器的外网地址,不能是127.0.0.1:6443.原始值如图:

改掉以后才能被阿里云ECS上的kubectl访问。

K8S-DEMO_YAML: 文件型变量,值为k8s-demo.yaml的内容,直接拷贝无需更改。

REG_USERNAME: 数值类型变量,为自己的阿里云私有仓库登录用户名

REG_PASSWORD: 数值类型变量,为自己的阿里云私有仓库登录密码

docker方式安装gitlab runner(和gitlab不是统一台ECS),然后后在api仓库中注册runner
不然流水线会一直阻塞,不会运行。

腾讯云服务器上安装k3s,为了使外网能访问需要使用–tls-san 选项,安装命令如下:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC="--tls-san 你的服务器地址" sh -s -
1
具体原因参考:https://github.com/k3s-io/k3s/issues/1381
我使用的重装的方式,因为机器上已经安装好了k3s.其他方式还待研究,大神有好方式的请不吝留言赐教。
为了是containerd拉取镜像速度更快,需要在配置加速。
在腾讯云的shell下目录线执行:

cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"docker.io":
endpoint:

  - "https://po13h3y1.mirror.aliyuncs.com"
  - "http://hub-mirror.c.163.com"
  - "https://mirror.ccs.tencentyun.com"
  - "https://registry-1.docker.io"
  - "http://f1361db2.m.daocloud.io"

EOF
systemctl restart k3s
1
2
3
4
5
6
7
8
9
10
11
k3s安装成功后,由于后面要从阿里云拉取镜像部署spring boot,
所以要事前创建好阿里云的secret,名字要和k8s-demo.yaml中
的名字一致

执行命令:

kubectl create namespace demo
kubectl create secret docker-registry aliyun- respository-secret \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=你的阿里云用户名 \
--docker-password=你的阿里云密码 \
--docker-email=你的阿里云邮箱
1
2
3
4
5
6
注意要在腾讯云的防火墙开放k3s的6443端口,NodePort 30080端口

执行流水线
本地更改controller的任意代码,提交并推送到gitlab。可以看到流水线执行成功

然后登录到k3s服务器,输入可以看到有pod的一个副本在运行中!

kubectl get pod --namespace demo
1

可以执行如下命令,查看pod的信息

kubectl describe pod k8s-gitlab-demo-6994fcbbc7-5p5r4 --namespace demo
1
可以看到pod使用的镜像就是CI中推送到阿里云上的镜像,说明可以正常拉取,如果不正常,这个命令可以看到错误信息。

最后可以打开浏览器访问:
http://你的ip地址:30080/user
可以看到正常返回信息,

说明CI/CD部署成功!

注意和优化的地方
阿里云登录和外部访问k3s集群的地方上面已经讲过。这里主要说下maven加速。
在gitlab-ci.yml中可以看到mvn命令是runner拉取镜像并创建容器后才会有,在两台ECS和腾讯服务器的宿主机上均不会安装maven。如果你的流水线,在package阶段执行比较慢,在gitlab-runner服务器上通过docker ps命令可以看到有一个动态容器产生了,通过docker exec -it 容器id /bin/bash 进入容器,shell下执行 mvn
可以看到mvn是有效的,但是找到对应的settings.xml,里面基本上没有什么配置,更不能加速.但是因为这个容器是gitlab-runner创建的所以就要通过这个桥梁了。查看它的容器信息

docker inspect gitlab-runner
1
可以看到它挂载了host上的config文件和docker客户端,

vim config.toml
1

在每个runner的docker部分都设置了挂载卷,其中就有.m2,host上目录就是 /data/.m2

ok,现在我们把自己配置了阿里云仓库的镜像的settings.xml上传到这个目录下,如图:

然后更改 gitlab-ci.yml中的mvn命令行(我已更改),

  • mvn clean package -P test -Dmaven.test.skip=true $MAVEN_OPTS --settings=/root/.m2/settings.xml
    1
    然后重新执行流水线。发现他会从aliyun上下载依赖,而不是超慢的maven2.
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
弹性计算 机器人 应用服务中间件
一键部署开源Qwen3并集成到钉钉、企业微信
Qwen3系列模型现已正式发布并开源,包含8款“混合推理模型”,其中涵盖两款MoE模型(Qwen3-235B-A22B与Qwen3-30B-A3B)及六个Dense模型。阿里云计算巢已支持Qwen3-235B-A22B和Qwen3-32B的私有化部署,用户可通过计算巢轻松完成部署,并借助AppFlow集成至钉钉机器人或企业微信。文档详细介绍了从模型部署、创建应用到配置机器人的全流程,帮助用户快速实现智能助手的接入与使用。
237 19
一键部署开源Qwen3并集成到钉钉、企业微信
|
17天前
|
存储 文字识别 自然语言处理
通义大模型在文档自动化处理中的高效部署指南(OCR集成与批量处理优化)
本文深入探讨了通义大模型在文档自动化处理中的应用,重点解决传统OCR识别精度低、效率瓶颈等问题。通过多模态编码与跨模态融合技术,通义大模型实现了高精度的文本检测与版面分析。文章详细介绍了OCR集成流程、批量处理优化策略及实战案例,展示了动态批处理和分布式架构带来的性能提升。实验结果表明,优化后系统处理速度可达210页/分钟,准确率达96.8%,单文档延迟降至0.3秒,为文档处理领域提供了高效解决方案。
|
2月前
|
JSON 缓存 并行计算
NVIDIA 实现通义千问 Qwen3 的生产级应用集成和部署
阿里巴巴近期开源了通义千问Qwen3大语言模型(LLM),包含两款混合专家模型(MoE)235B-A22B与30B-A3B,以及六款稠密模型(Dense)从0.6B到32B不等。开发者可基于NVIDIA GPU使用TensorRT-LLM、Ollama、SGLang、vLLM等框架高效部署Qwen3系列模型,实现快速词元生成和生产级应用开发。
|
3月前
|
安全 Java 持续交付
如何实现上传jar直接部署成功,这篇文章直接带你上手springboot实现jar包热更新!
本文详细讲解了在Spring Boot应用中实现Jar包热更新的实践方法。通过自定义类加载器(`HotClassLoader`),动态加载和卸载指定目录下的Jar包,结合Spring Bean动态注册机制,使新加载的类能够被Spring容器管理。同时,提供了文件上传接口,方便用户手动触发Jar包更新。文章还强调了安全性、依赖管理和线程安全等注意事项,并给出了测试步骤和总结,帮助开发者高效实现热更新功能,减少服务中断和提升开发效率。
|
4月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
151 0
|
4月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
150 0
|
1月前
|
前端开发
SpringBoot2.3.1集成Knife4j接口文档
SpringBoot2.3.1集成Knife4j接口文档
134 44
|
1月前
|
机器学习/深度学习 数据采集 存储
朴素贝叶斯处理混合数据类型,基于投票与堆叠集成的系统化方法理论基础与实践应用
本文探讨了朴素贝叶斯算法在处理混合数据类型中的应用,通过投票和堆叠集成方法构建分类框架。实验基于电信客户流失数据集,验证了该方法的有效性。文章详细分析了算法的数学理论基础、条件独立性假设及参数估计方法,并针对二元、类别、多项式和高斯分布特征设计专门化流水线。实验结果表明,集成学习显著提升了分类性能,但也存在特征分类自动化程度低和计算开销大的局限性。作者还探讨了特征工程、深度学习等替代方案,为未来研究提供了方向。(239字)
72 5
朴素贝叶斯处理混合数据类型,基于投票与堆叠集成的系统化方法理论基础与实践应用
|
2月前
|
人工智能 安全 Shell
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
Jupyter MCP服务器基于模型上下文协议(MCP),实现大型语言模型与Jupyter环境的无缝集成。它通过标准化接口,让AI模型安全访问和操作Jupyter核心组件,如内核、文件系统和终端。本文深入解析其技术架构、功能特性及部署方法。MCP服务器解决了传统AI模型缺乏实时上下文感知的问题,支持代码执行、变量状态获取、文件管理等功能,提升编程效率。同时,严格的权限控制确保了安全性。作为智能化交互工具,Jupyter MCP为动态计算环境与AI模型之间搭建了高效桥梁。
163 2
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
|
3月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
296 70
OSZAR »