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

news2024/11/26 1:51:51

环境

一台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: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

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

可以看到在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 demo
  kubectl 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.coloradmin.cn/o/2195090.html

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

相关文章

手把手带你服务端实现支付功能的通用解决方案!(全网最新)

友情提示&#xff1a; 跳转到本人juejin观看体验更佳&#xff08;当然CSDN也很好&#x1f60b;&#xff09; link —> https://juejin.cn/user/679936123997707/posts Thanks!&#x1f339; 前言 前段时间&#xff0c;和朋友们一起搭建的一个网站需要实现支付功能&#xff…

速卖通、Shopee、Lazada自养号测评的五大关键步骤:从环境构建到风控应对

在跨境电商领域&#xff0c;速卖通、Shopee和Lazada等平台上的自养号测评已成为提升销量、优化产品排名的重要手段。自养号测评不仅能够帮助卖家快速积累好评&#xff0c;还能有效提升产品的曝光率和转化率。然而&#xff0c;自养号测评并非易事&#xff0c;需要掌握一系列专业…

软考UML图 -- ( 类图,对象图,用例图,序列图,通信图,状态图,活动图,构件图,部署图)

文章目录 一、UML统一建模语言二、关系三、UML图1. 类图2. 对象图3. 用例图4. 序列图&#xff08;顺序图&#xff09;—— 交互图5. 通信图 —— 交互图6. 状态图7. 活动图8. 构件图&#xff08;组件图&#xff09;9. 部署图10. 总结 一、UML统一建模语言 UML由3个要素构成:UM…

Linux 外设驱动 应用 1 IO口输出

从这里开始外设驱动介绍&#xff0c;这里使用的IMX8的芯片作为驱动介绍 开发流程&#xff1a; 修改设备树&#xff0c;配置 GPIO1_IO07 为 GPIO 输出。使用 sysfs 接口或编写驱动程序控制 GPIO 引脚。编译并测试。 这里假设设备树&#xff0c;已经配置好了。不在论述这个问题…

PDF转JPG神器!这四款软件让你轻松搞定文档转换

尊敬的朋友们&#xff0c;您是否曾在数字办公和娱乐的海洋中&#xff0c;遭遇过因格式问题而一筹莫展的时刻&#xff1f;比如&#xff0c;手头有一份绝美的PDF文件&#xff0c;却想将其转换为JPG图片格式&#xff0c;好让它能在你的社交圈中大放异彩&#xff1b;别急&#xff0…

自然语言处理-语言转换

文章目录 一、语言模型二、统计语言模型1.含义与方法2.存在的问题 三、神经语言模型1.含义与方法2.one-hot编码3.词嵌入-word2vec4.模型的训练过程 四、总结 自然语言处理&#xff08;NLP&#xff09;中的语言转换方法主要涉及将一种形式的语言数据转换为另一种形式&#xff0c…

IDEA创建、导入、删除maven项目

全局配置&#xff1a; 1.File->Close Project 2.Customize->All settings 3. Apply 4.选择JRE版本->Apply 5.选择字节码版本->Apply->OK 全局配置结束 创建maven项目&#xff1a; 1.File->New->Module 2.Build system选择Maven GroupId&#xff1a…

Django学习笔记十三:优秀案例学习

Django CMS 是一个基于 Django 框架的开源内容管理系统&#xff0c;它允许开发者轻松地创建和管理网站内容。Django CMS 提供了一个易于使用的界面来实现动态网站的快速开发&#xff0c;并且具有丰富的内容管理功能和多种插件扩展。以下是 Django CMS 的一些核心特性和如何开始…

智能医疗:Spring Boot医院管理系统开发

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

手术器械检测系统源码分享

手术器械检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

【Nacos入门到实战十三】Nacos配置管理:配置优先级与加载顺序解读

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Thinkphp/Laravel基于vue的金融理财产品销售系统设计与实现Vscode毕业设计成品源码.

目录 技术栈和环境说明具体实现截图设计思路关键技术课题的重点和难点&#xff1a;框架介绍数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 技术栈和环境说明 采用PHP语言开发&#xff0c;开发环境为phpstudy 开发工具notepad并使用MYSQL数据库…

allegro 替换过孔

操作步骤如下 1.选择操作对象&#xff08;需要替换的过孔&#xff09;&#xff0c;右键–>Repace……–>Selected…… 2.在弹出的窗口中选择最终需要的过孔既可以

2024系统分析师考试---数据仓库相关概念

前言&#xff1a; 传统的操作型数据库主要面向业务的&#xff0c;所执行的操作基本上也是联机事务处理&#xff0c;随着企业规模的增长&#xff0c;历史积累的数据越来越多&#xff0c;如何利用历史数据来为未来决策服务&#xff0c;就显得越来越重要了&#xff0c;而数据仓库就…

微信小程序开发问题记录

文章目录 一&#xff0c;全局文件配置windows title不起作用 一&#xff0c;全局文件配置windows title不起作用 全局配置中配置窗口导航栏标题不生效。 但是页面使用的导航栏插件配置的title能生效。

source insight 的开源替代

source insight 的开源替代——sourcetrail&#xff0c;开源地址&#xff1a;https://github.com/CoatiSoftware/Sourcetrail Sourcetrail 是一个交互式源代码浏览器&#xff0c;它通过为代码编制索引并收集有关其结构的数据来简化现有源代码中的导航。然后&#xff0c;Sourcet…

图吧工具箱

图吧工具箱202309绿色版自动解压程序R2.exe&#xff0c;永久有效 链接&#xff1a;https://pan.baidu.com/s/1M6TI7Git8bXOzZX_qZ3LJw?pwdzked 提取码&#xff1a;zked

Java中常用的线程工具(JUC)

多线程 多线程 基本概念 CAS (Compare-And-Swap&#xff0c;比较并交换)&#xff0c;是一种用于实现多线程同步的原子操作。主要原理&#xff1a;1.比较内存中的某个位置的当前值和预期值 2.交换如果当前值与预期值相等&#xff0c;则将该位置的值更新为新值&#xff0c;否则…

ZYNQ:Petalinunx构建工程

资料准备 1、xsa 文件&#xff1a;top_020.xsa&#xff08;使用vivado 2024.1制作&#xff09; 2、设置 Petalinux &#xff08;2024.1&#xff09;环境变量&#xff1a;sptl 创建 petalinux 工程 构建工程 petalinux-create -t project --template zynq -n project配置…

Linux--IO模型与高级IO重要概念

什么是IO&#xff1f; IO是指计算机系统与外部世界进行数据交换的过程。在计算机中&#xff0c;IO通常用于与外部设备通信&#xff0c;这些设备包括键盘、鼠标、打印机、显示器、网络等。通过IO操作&#xff0c;计算机系统可以接收来自外部设备的输入数据&#xff0c;也可以将…