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

准备开始

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

根目录下增加gitlab-ci.yml 注意名字是固定的不然流水线也不会触发。内容:

# 因为我们Runner执行器设置为docker, 所以这里需要指定docker的版本
image: docker:stablevariables: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-cacheDEPLOYMENT_NAME: k8s-gitlab-demo  # 项目在 k8s 中部署的名称K8S_NS: demo  # k8s 命名空间stages:- package- build- deploypackage:stage: packagescript:- 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/intelligentonly:- masterimage:  $MAVEN_IMAGEbuild:stage: buildscript:- 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_IMAGEonly:- master# 使用 k8s 部署
deploy:stage: deployimage: $K8S_IMAGEenvironment: 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_profilescript:- 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- fionly:- masterenvironment: k3s-gitlab

gilab-ci.yml 涉及的内容比较多,如maven拉取镜像如何加速、阿里云镜像库如何登录、k3s客户端kubectl如何访问k3s集群。后面再展开。
根目录下增加k8s-demo.yaml,用来自动部署spring boot应用,内容如下:

---
apiVersion: v1
kind: Service
metadata:name: $DEPLOYMENT_NAMEnamespace: demolabels:app: ci-cd-demo
spec:type: NodePortports:- name: ci-cd-demoport: 8080protocol: TCPnodePort: 30080selector: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-demotemplate:metadata:labels:app: ci-cd-demospec:containers: #docker容器的配置- name: $DEPLOYMENT_NAMEimage: $PROJECT_IMAGEimagePullPolicy: Alwaysports:- containerPort: 8080protocol: TCPenv:- name: JAVA_OPTSvalue: -Xms256m -Xmx256mimagePullSecrets:- name: aliyun-respository-secret

可以看到在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: 数值类型变量,为自己的阿里云私有仓库登录密码

  1. docker方式安装gitlab runner(和gitlab不是统一台ECS),然后后在api仓库中注册runner

不然流水线会一直阻塞,不会运行。

  1. 腾讯云服务器上安装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 -

具体原因参考: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

k3s安装成功后,由于后面要从阿里云拉取镜像部署spring boot,
所以要事前创建好阿里云的secret,名字要和k8s-demo.yaml中
的名字一致
在这里插入图片描述
在这里插入图片描述

执行命令:

  kubectl create namespace demokubectl create secret docker-registry aliyun-  respository-secret \--docker-server=registry.cn-hangzhou.aliyuncs.com \--docker-username=你的阿里云用户名 \--docker-password=你的阿里云密码 \--docker-email=你的阿里云邮箱

注意要在腾讯云的防火墙开放k3s的6443端口,NodePort 30080端口

执行流水线

本地更改controller的任意代码,提交并推送到gitlab。可以看到流水线执行成功
在这里插入图片描述
在这里插入图片描述

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

kubectl get pod --namespace demo

在这里插入图片描述

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

kubectl describe pod k8s-gitlab-demo-6994fcbbc7-5p5r4 --namespace demo

可以看到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

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

  vim config.toml

在这里插入图片描述

在每个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

然后重新执行流水线。发现他会从aliyun上下载依赖,而不是超慢的maven2.

在这里插入图片描述

.这里还有个缓存的问题,以后在研究,如有大神知晓,请不吝留言赐教,谢谢!到此,就告一段落了,

enjoy!

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

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

相关文章

【计算机网络】计算机网络相关术语

文章目录 NAT概述NAT的基本概念NAT的工作原理1. **基本NAT&#xff08;静态NAT&#xff09;**2. **动态NAT**3. **NAPT&#xff08;网络地址端口转换&#xff0c;也称为PAT&#xff09;** 底层实现原理1. **数据包处理**2. **转换表**3. **超时机制** NAT的优点NAT的缺点总结 P…

跟踪用户状态,http协议无状态 Cookie HttpSession,Session和Cookie的关系

1.概念分析 跟踪用户状态指的是web应用能够分辨请求属于哪个用户&#xff0c;进而记录用户的状态&#xff0c;从而为用户提供连续的针对性的服务。比如有多个客户在同一个购物网站上购物&#xff0c;每一个用户都会有一个虚拟的购物车。当某个客户发送请求将商品添加到购物车时…

初学Qt之环境安装与 hello word

环境&#xff1a; Qt Creator 4.11.0 (Community) Qt 5.14.0 目录 1.Qt环境配置 1.1 下载Qt 5.14.0 1.2 注册Qt账号 1.3 安装Qt 1.4 配置环境变量 2.创建项目 2.1 创建一个项目 2.2 初始代码解析 2.3 可视化GUI ​编辑 2.4 hello word 2.4.1 可视化hello word …

Spring Boot知识管理系统:创新与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

公开课学习:软件测试面试3大难题

1.验证码机制的处理&#xff1a;自动化遇到验证码怎么办?怎么测试? 流程&#xff1a;先识别元素&#xff0c;再对元素进行操作。实际上&#xff0c;验证码无法用自动化技术操作解决&#xff0c;都是由开发给万能码&#xff0c;或者屏蔽验证码去解决&#xff01;那如果不能屏…

数据结构——优先级队列(堆)

概念&#xff1a; 在操作数据的时候&#xff0c;操作的数据具有优先级&#xff0c;需要返回最高级别的优先级数据或者添加新对象时就需要用到优先级队列。 jdk1.8中的PrioriytQueue底层实现了堆这种数据结构实际上&#xff0c;堆其实就是在完全二叉树进行调整而来。 堆&#x…

C++STL--------vector

文章目录 一、vector常用接口介绍1、initializer_list2、接口有很多类似3、typeid(类型).name()4、find() 函数5、内置类型构造 二、vector()常用接口模拟实现 截图来源网站&#xff1a;https://legacy.cplusplus.com/reference/vector/vector/ 一、vector常用接口介绍 是一个…

哪种护眼大路灯孩子用着最好?公认最好的护眼大路灯

哪种护眼大路灯孩子用着最好&#xff1f;最近也有不少家长关注到了孩子视力健康的这个情况&#xff0c;很着急开始寻找各种能够减少孩子因为不良光线影响视力健康的方法&#xff0c;其中大路灯以良好的表现成为家长们的首选&#xff0c;但快速发展的市场中&#xff0c;却涌入了…

【C】C语言常见概念~

C语言常见概念 转义字符 转义字符&#xff0c;顾名思义&#xff0c;转变原来意思的字符 比如 #include <stdio.h> int main() {printf("abcndef");return 0; }输出的结果为&#xff1a; 将代码修改一下&#xff1a; #include <stdio.h> int main(…

双目视觉搭配YOLO实现3D测量

一、简介 双目&#xff08;Stereo Vision&#xff09;技术是一种利用两个相机来模拟人眼视觉的技术。通过对两个相机获取到的图像进行分析和匹配&#xff0c;可以计算出物体的深度信息。双目技术可以实现物体的三维重建、距离测量、运动分析等应用。 双目技术的原理是通过两…

SpringBoot基础(五):集成JUnit5

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 SpringBoot基础(三)&#xff1a;Logback日志 SpringBoot基础(四)&#xff1a;bean的多种加载方式 SpringBoot基础(五)&#xff1a;集成JUnit5 目录 一、JUnit…

AIGC毕设项目分享:基于RAG的数字人对话系统及其应用

本研究的主要目标是设计并实现一个基于检索增强生成&#xff08;RAG&#xff09;技术的数字人对话系统&#xff0c;旨在提升数字人系统在多轮对话中的上下文管理、情境感知能力以及动态内容生成效果。系统结合了深度学习中的最新大语言模型技术&#xff0c;通过引入RAG框架来增…

K8S配置MySQL主从自动水平扩展

前提环境 操作系统Ubuntu 22.04 K8S 1.28.2集群&#xff08;1个master2个node&#xff09; MySQL 5.7.44部署在K8S的主从集群 metrics-server v0.6.4 概念简介 在K8s中扩缩容分为两种 ●Node层面&#xff1a;对K8s物理节点扩容和缩容&#xff0c;根据业务规模实现物理节点自动扩…

爬虫案例——网易新闻数据的爬取

案例需求&#xff1a; 1.爬取该新闻网站——&#xff08;网易新闻&#xff09;的数据&#xff0c;包括标题和链接 2.爬取所有数据&#xff08;翻页参数&#xff09; 3.利用jsonpath解析数据 分析&#xff1a; 该网站属于异步加载网站——直接网页中拿不到&#xff0c;需要…

MySQL-08.DDL-表结构操作-创建-案例

一.MySQL创建表的方式 1.首先根据需求文档定义出原型字段&#xff0c;即从需求文档中可以直接设计出来的字段 2.再在原型字段的基础上加上一些基础字段&#xff0c;构成整个表结构的设计 我们采用基于图形化界面的方式来创建表结构 二.案例 原型字段 各字段设计如下&…

深入理解线性表--顺序表

目录 顺序表- Seqlist -> sequence 顺序 list 表 顺序表的概念 问题与解答 顺序表的分类 静态顺序表 动态顺序表 问题与解答(递进式) 动态顺序表的实现 尾插 头插 尾删 头删 指定位置插入 指定位置删除 销毁 总结 前言&#xff1a;线性表是具有相同特性的一类数据结构…

2024 年 04 月编程语言排行榜,PHP 排名创新低?

编程语言的流行度总是变化莫测&#xff0c;每个月的排行榜都揭示着新的趋势。2024年4月的编程语言排行榜揭示了一个引人关注的现象&#xff1a;PHP的排名再次下滑&#xff0c;创下了历史新低。这种变化对于PHP开发者和整个技术社区来说&#xff0c;意味着什么呢&#xff1f; P…

现代数字信号处理I-P3 MVUE学习笔记

目录 1. 参数估计问题的提出与本质 2. 估计的性质 2.1 Ancillary&#xff08;多余估计&#xff09; 例1&#xff0c;Ancillary估计量 2. Uniformly Optimal 3. Sufficiency充分性 3.1 统计量充分性定义 例2&#xff1a;利用充分统计量定义获取伯努利分布的充分统计量 …

Anaroute - 理论学习(一)

一、贡献&#xff1a; 框架能够在考虑特定约束的同时&#xff0c;高效地完成复杂AMS设计的布线&#xff0c;并实现签署质量的性能。 提出了一种对称性约束的分配算法&#xff0c;根据引脚位置分配合适的网络匹配要求新的引脚聚类策略&#xff0c;以实现规律性的布线模式&…

微知-Bluefield DPU使用flint烧录固件报错MFE_NO_FLASH_DETECTED是什么?MFE是什么?

文章目录 背景一些报错场景MFE是什么&#xff1f;有哪些MFE 背景 在DPU的fw操作flint的时候&#xff0c;很多命令都会报这个错误&#xff1a;MFE_NO_FLASH_DETECTED&#xff0c;早期很疑惑并且猜测MFE是Mellanox Firmware Engine。实际并不是&#xff0c;具体还得走到mellanox…