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: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!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言-常见文件操作函数详解(fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite)

&#x1f30f;个人博客&#xff1a;尹蓝锐的博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 顺序读写数据常用函数 函数名调用形式功能返回值fgetcfgetc(fp)从指针变量fp指向的文件中读…

(五)Proteus仿真STM32单片机串口数据流收发

&#xff08;五&#xff09;Protues仿真STM32单片机串口数据流收发 – ARMFUN 1&#xff0c;打开STM32CubeMX&#xff0c;找到USART1,配置模式Asynchronous&#xff0c;此时PA9、PA10自动变成串口模式 串口默认参数:115200bps 8bit None 1stop 2&#xff0c;NVIC Settings使能…

Kafka之基本概念

1、Kafka是什么&#xff1f; Kafka是由Scala语言开发的一个多分区、多副本&#xff0c;基于Zookeeper集群协调的系统。 那这个所谓的系统又是什么系统呢&#xff1f; 回答这个问题要从发展的角度来看&#xff1a;起初Kafka的定位是分布式消息系统。但是目前它的定位是一个分布…

Pr 视频效果:元数据和时间码刻录

视频效果/视频/元数据和时间码刻录 Video/Metadata & Timecode Burn-in 元数据和时间码刻录 Metadata & Timecode Burn-in效果是一种在视频画面上叠加显示剪辑元数据或时间码的工具。它允许在导出视频时&#xff0c;将需用的元数据信息直接刻录在画面上&#xff0c;方便…

Linux操作系统小项目——实现《进程池》

文章目录 前言&#xff1a;代码实现&#xff1a;原理讲解&#xff1a;细节处理&#xff1a; 前言&#xff1a; 在前面的学习中&#xff0c;我们简单的了解了下进程之间的通信方式&#xff0c;目前我们只能知道父子进程的通信是通过匿名管道的方式进行通信的&#xff0c;这是因…

MacOS编译和安装Poco库的方法

1.从官网git下载最新的poco源代码 在/usr/local路径下创建Poco文件夹&#xff0c;克隆Poco源代码 sudo git clone -b poco-1.13.3-release https://github.com/pocoproject/poco.git2.等了一会后&#xff0c;报错啦&#xff01;&#xff01;&#xff01; error: RPC failed…

Unity3D 单例模式

Unity3D 泛型单例 单例模式 单例模式是一种创建型设计模式&#xff0c;能够保证一个类只有一个实例&#xff0c;提供访问实例的全局节点。 通常会把一些管理类设置成单例&#xff0c;例如 GameManager、UIManager 等&#xff0c;可以很方便地使用这些管理类单例&#xff0c;…

<Project-8 pdf2tx-MM> Python Flask应用:在浏览器中翻译PDF文件 NLTK OCR 多线程 指定翻译器 改进后的P6

项目概述 名字解释 缩写&#xff1a; pdf2tx-MM pdf file transfer to text content with Multi-threads and Multi-translators pdf2tx-MM 是一个基于 Flask 的 Web 应用程序&#xff0c;提供将 PDF 文件中的内容提取、翻译并展示。使用者上传 PDF 文件&#xff0c;应用程序…

计算机视觉之OpenCV vs YOLO

好多开发者希望搞明白OpenCV 和YOLO区别&#xff0c;实际上&#xff0c;二者在计算机视觉领域都有广泛应用&#xff0c;但它们有很大的不同。 一、OpenCV 概述 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它…

Cherno游戏引擎笔记(61~72)

---------------一些维护和更改------------- 》》》》 Made Win-GenProjects.bat work from every directory 代码更改&#xff1a; echo off->pushd ..\->pushd %~dp0\..\call vendor\bin\premake\premake5.exe vs2019popdPAUSE 为什么要做这样的更改&#xff1f; …

20年408数据结构

第一题&#xff1a; 解析&#xff1a;这种题可以先画个草图分析一下&#xff0c;一下就看出来了。 这里的m(7,2)对应的是这图里的m(2,7),第一列存1个元素&#xff0c;第二列存2个元素&#xff0c;第三列存3个元素&#xff0c;第四列存4个元素&#xff0c;第五列存5个元素&#…

云栖实录 | 大模型驱动,开源融合的 AI 搜索产品发布

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 郭瑞杰 | 阿里云智能集团资深技术专家&#xff0c;阿里云 AI 搜索负责人 邹 宽&#xff5c;阿里云智能集团高级产品专家&#xff0c;阿里云 AI 搜索产品负责人 活动&#xff1a;…

【EXCEL数据处理】000021 案例 保姆级教程,附多个操作案例。EXCEL文档安全性设置。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000021 案例 保姆级教程&#xff0c;附多个操作案例。…

【套路揭秘】新手如何一步跃升至管理层

&#x1f525;禅道AI功能让企业实现人工智能的自然接入&#xff0c;助力企业开启高效办公新阶段。 ✅AI 提词 通过AI一键提词&#xff0c;可灵活设计项目流程需要的AI提词&#xff0c;实现人工智能无缝融入产品研发流程&#xff0c;提高软件研发过程效率。 &#x1f4a1;需求…

uniapp打包安卓apk步骤

然后安装在手机上就可以啦

Apache DolphinScheduler-1.3.9源码分析(二)

引言 随着大数据的发展&#xff0c;任务调度系统成为了数据处理和管理中至关重要的部分。Apache DolphinScheduler 是一款优秀的开源分布式工作流调度平台&#xff0c;在大数据场景中得到广泛应用。 在本文中&#xff0c;我们将对 Apache DolphinScheduler 1.3.9 版本的源码进…

基于FPGA的ov5640摄像头图像采集(二)

之前讲过ov5640摄像头图像采集&#xff0c;但是只包了的摄像头驱动与数据对齐两部分&#xff0c;但是由于摄像头输入的像素时钟与HDMI输出的驱动时钟并不相同&#xff0c;所有需要利用DDR3来将像素数据进行缓存再将像素数据从DDR3中读出&#xff0c;对DDR3的读写参考米联客的IP…

JVM系列(二) -类的加载过程介绍

一、背景介绍 我们知道 Java 是先通过编译器将.java类文件转成.class字节码文件&#xff0c;然后再通过虚拟机将.class字节码文件加载到内存中来实现应用程序的运行。 那么虚拟机是什么时候加载class文件&#xff1f;如何加载class文件&#xff1f;class文件进入到虚拟机后发…

Python酷库之旅-第三方库Pandas(142)

目录 一、用法精讲 641、pandas.Timestamp.hour属性 641-1、语法 641-2、参数 641-3、功能 641-4、返回值 641-5、说明 641-6、用法 641-6-1、数据准备 641-6-2、代码示例 641-6-3、结果输出 642、pandas.Timestamp.is_leap_year属性 642-1、语法 642-2、参数 6…

【MySQL 08】复合查询

目录 1.准备工作 2.多表查询 笛卡尔积 多表查询案例 3. 自连接 4.子查询 1.单行子查询 2.多行子查询 3.多列子查询 4.在from子句中使用子查询 5.合并查询 1.union 2.union all 1.准备工作 如下三个表&#xff0c;将作为示例&#xff0c;理解复合查询 EMP员工表…