Kubernetes(k8s)实战:使用k8s+jenkins实现CICD

news2024/11/24 10:01:23

文章目录

  • 一、什么是CICD
  • 二、准备k8s环境
  • 三、jenkins环境准备(选择一台服务器)
    • 1、安装java(最新版jenkins只支持jdk11以上)
      • (1)找到jdk资源上传到指定机器
      • (2)配置环境变量
    • 2、安装maven
      • (1)找到maven资源上传到指定机器
      • (2)配置环境变量
      • (3)配置maven的阿里云镜像
    • 3、安装和配置git(使用gitee)
      • (1)安装git
      • (2)在服务器上生成公钥
      • (3)验证
    • 4、准备springboot项目
      • (1)编写springboot项目
      • (2)将springboot项目提交到gitee
      • (3)git clone测试
    • 5、安装jenkins
      • (1)下载jenkinx
      • (2)启动jenkins(需要java环境)
      • (3)windows访问192.168.56.101:8080
      • (4)配置jenkins的get、maven、java
      • (5)新建任务测试
      • (6)设置push之后自动构建
    • 6、dockerhub准备(阿里云)
      • (1)创建一个springboot-demo 的镜像仓库
      • (2)准备shell脚本实现docker push
      • (3)jenkins的pipeline增加步骤
      • (4)再次执行jenkins的构建
  • 四、Kubernetes拉取镜像运行
    • 1、准备springboot-demo.yaml文件
    • 2、准备shell文件,用于k8s自动拉取镜像部署
    • 3、修改jenkins的pipeline
    • 4、w1执行不了kubectl 命令
    • 5、大功告成 !

一、什么是CICD

CIDI(Continuous Integration,Continuous Delivery & Deployment),持续集成,持续部署,持续发布。

也就是说,在本地开发完代码之后,push到远程仓库,然后代码打包、部署的这个过程完全是自动化完成的。
在这里插入图片描述
但是我们不要进入一个误区,CICD并不意味着一定就是这一套流程,只要实现了代码提交后自动部署即可,不管是部署在k8s还是tomcat中,这是由应用规模和使用的工具来决定的。

二、准备k8s环境

Kubernetes(k8s)集群搭建,完整无坑,不需要科学上网~

三、jenkins环境准备(选择一台服务器)

1、安装java(最新版jenkins只支持jdk11以上)

(1)找到jdk资源上传到指定机器

# 解压
tar -zxvf jdk-17_linux-x64_bin.tar.gz

(2)配置环境变量

vi /etc/profile
# 在最后添加上
export JAVA_HOME=/root/jenkins/jdk-17.0.7
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
# 保存后执行
source /etc/profile 
# 确保安装完成
java -version

2、安装maven

(1)找到maven资源上传到指定机器

# 解压
tar -zxvf apache-maven-3.6.2-bin.tar.gz

(2)配置环境变量

vi /etc/profile
# 在最后添加
export MAVEN_HOME=/root/jenkins/apache-maven-3.6.2
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
# 保存后执行
source /etc/profile 
# 确保安装完成
mvn -version

(3)配置maven的阿里云镜像

apache-maven-3.6.2/conf/settings.xml中,修改镜像

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>        
</mirror>

3、安装和配置git(使用gitee)

(1)安装git

# 下载安装
yum install git 
# 配置git
git config --global user.name "cxf"
git config --global user.email "cxf@qq.com"

(2)在服务器上生成公钥

# -t key 类型 -C 注释 中间三次enter即可
ssh-keygen -t ed25519 -C "Gitee SSH Key"
# 查看公钥 私钥文件 id_ed25519	公钥文件 id_ed25519.pub
ls ~/.ssh/

复制生成后的 ssh key,通过仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」 ,将生成的公钥添加到仓库中。
在这里插入图片描述

(3)验证

# 通过 ssh -T 测试时,输出 Anonymous:添加成功后,就可以使用 SSH 协议对仓库进行拉取。
$ ssh -T git@gitee.com
Hi Anonymous! You've successfully authenticated, but GITEE.COM does not provide shell access.

4、准备springboot项目

(1)编写springboot项目

@RestController
public class K8SController {
    @RequestMapping("/k8s")
    public String k8s(){
        return "hello K8s <br/>111222 ";
    }
}

(2)将springboot项目提交到gitee

(3)git clone测试

git clone git@gitee.com:xiangno1/springboot-demo.git

拉下来代码,说明服务器配置没问题。

5、安装jenkins

jenkins官网:https://jenkins.io/
入门指南:https://www.jenkins.io/zh/doc/pipeline/tour/getting-started/

必须在k8s集群中,因为后面需要在jenkins的目录下创建文件执行,比如这里选用m1节点。

(1)下载jenkinx

wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

(2)启动jenkins(需要java环境)

# 启动报错,需要先安装字体
# java.lang.NullPointerException: Cannot load from short array because "sun.awt.FontConfiguration.head" is null
yum install fontconfig
fc-cache --force

# 后台启动
nohup java -jar jenkins.war --httpPort=8080 & 
tail -f nohup.out 

# 启动日志会提示密码
#4c7341496d044ef7849576ccddc20d11
#This may also be found at: /root/.jenkins/secrets/initialAdminPassword

(3)windows访问192.168.56.101:8080

jenkins启动时会打印一串密码,需要填上

点击【安装推荐的插件】,需要等一段时间自动完成。

下载完插件之后,需要创建第一个 管理员用户 我们设置为admin/admin。

(4)配置jenkins的get、maven、java

在全局配置,新版的在tools中,配置maven。默认是使用系统环境变量中的。

(5)新建任务测试

新建一个任务(item),输入名称(springboot-demo),选择流水线
在这里插入图片描述
配置springboot-demo的task,修改pipeline内容 ,增加maven构建,然后“保存和立即构建“,同时可以查看“Console Output”

因为我们之前安装git的时候已经配置了公钥,所以拉取的时候并不需要用户密码了!

node {
   def mvnHome
   stage('Preparation') {
      git 'git@gitee.com:xiangno1/springboot-demo.git'
   }
   
   stage('Maven Build') { 
      sh "mvn clean package"
   }
}

编写完之后保存,然后点击【立即构建】。
在/root/.jenkins/workspace 中,会下载springboot-demo,并使用maven打成一个jar包。

(6)设置push之后自动构建

当用户进行git commit/push提交代码到github时,能够通知jenkins自动构建

注意:jenkins的ip一定要是github能够访问到的地址

在gitee上配置jenkins的webhook地址:http://192.168.56.101:8080/springboot-demo (需要外网访问)
在这里插入图片描述
生成Personal access tokens
Jenkins访问github需要授权,所以在github上生成token交给jenkins使用,即Personal access tokens
github的Settings[个人信息右上角]–>Developer settings–>Personal access tokens–>Generate new token
最后保存好该token,比如:**72f048b514e95d6fe36f86d84374f2dcce402b43

jenkins安装插件
01 安装github plugin插件:[系统管理]->[插件管理]->[可选插件]
02 安装gitlab插件和gitlab hook插件:[系统管理]->[插件管理]->[可选插件]

配置GitHub Server
[系统管理]->[系统配置]->[找到github服务器]->[添加github服务器]

在流水线触发器勾选GitHub hook trigger for GITScm polling

6、dockerhub准备(阿里云)

(1)创建一个springboot-demo 的镜像仓库

docker镜像深入学习,docker镜像发布公有云与私有云

# 登录 ,需要输入密码
docker login --username=沙里沟第二小学扛把子 registry.cn-hangzhou.aliyuncs.com
# 私有云的话,需要在k8s添加凭证
kubectl create secret docker-registry 'springboot-demo' \
     --docker-username='沙里沟第二小学扛把子' \
     --docker-password='cxf123!!' \
     --docker-email='784482906@qq.com' \
     --docker-server='registry.cn-hangzhou.aliyuncs.com/cxf01/springboot-demo'
<secret-name> 是您为 secret 指定的名称,例如 my-registry-secret。
<username> 是您在镜像仓库的用户名。
<password> 是您在镜像仓库的密码。
<email> 是与您在镜像仓库的账号相关联的电子邮件。
<registry> 是您的镜像仓库地址。
接下来,您需要在使用该凭证的部署(deployment)或其他相关资源中引用该 secret。可以在相关资源的定义文件中添加以下部分
spec:
     template:
       spec:
         imagePullSecrets:
         - name: <secret-name>

(2)准备shell脚本实现docker push

# mkdir /root/.jenkins/workspace/scripts/
# vi /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
# 记得chmod +x /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
# 脚本开始
# 进入到springboot-demo目录
cd ../springboot-demo

# 编写Dockerfile文件

cat <<EOF > Dockerfile
FROM openjdk:8-jre-alpine
COPY target/springboot-demo-0.0.1-SNAPSHOT.jar /springboot-demo.jar
ENTRYPOINT ["java","-jar","/springboot-demo.jar"]
EOF

echo "Dockerfile created successfully!"

# 基于指定目录下的Dockerfile构建镜像
docker build -t registry.cn-hangzhou.aliyuncs.com/cxf01/springboot-demo:v1.0 .

# push镜像,这边需要阿里云镜像仓库登录,在w1上登录
docker push registry.cn-hangzhou.aliyuncs.com/cxf01/springboot-demo:v1.0

(3)jenkins的pipeline增加步骤

node {
   def mvnHome
   stage('Preparation') {
      git 'git@gitee.com:xiangno1/springboot-demo.git'
   }
   
   stage('Maven Build') { 
      sh "mvn clean package"
   }
   
   stage('Build Image') { 
      sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh"
   }
}

(4)再次执行jenkins的构建

构建成功!并且上传阿里云docker镜像成功!
在这里插入图片描述
在这里插入图片描述

四、Kubernetes拉取镜像运行

1、准备springboot-demo.yaml文件

在/root/.jenkins/workspace/scripts/目录下创建springboot-demo.yaml

# 以Deployment部署Pod
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: springboot-demo
spec: 
  selector: 
    matchLabels: 
      app: springboot-demo
  replicas: 1
  template: 
    metadata:
      labels: 
        app: springboot-demo
    spec: 
      imagePullSecrets: # 私有云凭证
      - name: springboot-demo
      containers: 
      - name: springboot-demo
        image: registry.cn-hangzhou.aliyuncs.com/cxf01/springboot-demo:v1.0
        ports: 
        - containerPort: 8080
---
# 创建Pod的Service
apiVersion: v1
kind: Service
metadata: 
  name: springboot-demo
spec: 
  ports: 
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector: 
    app: springboot-demo
---
# 创建Ingress,定义访问规则
apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: springboot-demo
spec: 
  rules: 
  - host: springboot.cxf.com
    http: 
      paths: 
      - path: /
        backend: 
          serviceName: springboot-demo
          servicePort: 80

2、准备shell文件,用于k8s自动拉取镜像部署

编写k8s-deploy-springboot-demo.sh文件

# vi /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh
# chmod +x /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh
kubectl delete -f springboot-demo.yaml
kubectl apply -f /root/.jenkins/workspace/scripts/springboot-demo.yaml
echo "k8s deploy success!"

3、修改jenkins的pipeline

node {
   def mvnHome
   stage('Preparation') {
      git 'git@gitee.com:xiangno1/springboot-demo.git'
   }
   
   stage('Maven Build') { 
      sh "mvn clean package"
   }
   
   stage('Build Image') { 
      sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh"
   }

   stage('K8S Deploy') { 
      sh "/root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh"
   }
}

4、w1执行不了kubectl 命令

切换到master上,cd ~  --->   cat ~/.kube/config  --->复制内容
切换到worker02上   cd ~  ---> mkdir ~/.kube   vi ~/.kube/config   --->粘贴内容

5、大功告成 !

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

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

相关文章

stm32 freertos多任务状态迁移,中断临界段,任务延时

freertos的作用 处理器运行模式 arm中SP&#xff0c;LR&#xff0c;PC寄存器以及其它所有寄存器以及处理器运行模式介绍 一、xTaskCreate&#xff08;&#xff09; 1、prvInitialiseNewTask&#xff08;&#xff09; 2、prvAddNewTaskToReadyList&#xff08;&#xff09; (1…

mysql迁移

目录 1.SQLyog 2.阿里云DTS 1.创建任务 2.配置源库及目标库信息 3.配置任务对象及高级配置 4.高级配置 1.SQLyog 适用于离线迁移&#xff0c;全量迁移&#xff0c;少量迁移&#xff0c;数据库大小在几百兆范围内&#xff0c;时间需要几十秒到几分钟不等。 选择源库&…

java网络编程、TCP和UDP、三次握手和四次挥手

一、网络编程入门 &#xff08;1&#xff09;概念 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;可以进行数据传输 &#xff08;2&#xff09;网络编程三要素&#xff1a; IP地址 设备在网络中的地址&#xff0c;是唯一的标识。全称”互联网协议地址”&a…

value_counts()方法--Pandas

1. 函数功能 返回DataFrame中值与计算组成的Series 2. 函数语法 DataFrame.value_counts(subsetNone, normalizeFalse, sortTrue, ascendingFalse, dropnaTrue)3.函数参数 参数含义subset可选参数&#xff0c;标签或者标签列表 &#xff0c;计算时要用的列normalize布尔值&…

android原生工程测试opencv库与opencl功能

1.jni原生工程main文件夹中创建jniLibs 2.复制opencv库到jniLibs 3.复制opencv头文件 头文件库导入后如下: 头文件与库路径包含 头文件直接复制出来外面,不然识别不了 断点调试

Jetson nano中使用tensorrt推理yolov5

克隆下载yolov5项目 准备yolov5项目, 从仓库下载5 5.0版本 git clone -b v5.0 https://github.com/ultralytics/yolov5.git下载权重地址 https://github.com/ultralytics/yolov5/releases/tag/v5.0自行安装必要的库 pip3 install -r requirements.txt准备tensorrtx项目 下载后可…

88、基于STM32单片机学习型搬运机器人四自由度机械臂机械手遥感控制设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

单片机主芯片选择方案 方案一&#xff1a;AT89C51是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元&a…

VR智慧景区:数字文旅新模式,你体验了吗?

传统的旅游行业如果想要破局&#xff0c;就势必要发展线上业务&#xff0c;VR智慧文旅就是一个很好的发展选择。随着5G技术的发展&#xff0c;我们该如何进一步的探索数字文旅的新趋势、新机遇和新发展呢&#xff1f; VR智慧景区可以帮助文旅行业实现全景漫游、实景导航、电子沙…

UG\NX二次开发 获取基准面的点和方向

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 获取基准面的点和方向,包括坐标系上的基准面。 效果: 代码: #include "me.hpp" #include <stdio.h> #include <string.h> #include <uf.h> #include <uf_ui.h&…

《CAPL编程语言》来啦!!!

目标人群 想入门CAPL编程的 想提高CAPL编程能力的 想系统性学习CAPL编程语言的 时长 30小时 报名方式 联系作者微信 内容 &#xff01;&#xff01;&#xff01;始于CAPL&#xff0c;又不止于CAPL&#xff01;&#xff01;&#xff01; 这里不只有CAPL语法介绍&#xf…

力扣 216. 组合总和 III

题目来源&#xff1a;https://leetcode.cn/problems/combination-sum-iii/description/ C题解&#xff1a;由 进入for循环进行回溯&#xff0c;到 ......&#xff0c;以此类推。 递归法&#xff1a; 确定递归函数参数&#xff1a;要求集合的个数k&#xff0c;目标和n&#x…

ES6模块化的基本语法

ES6模块化的基本语法 1、默认导出与默认导入2、按需导出和按需导入3、直接导入并执行模块中的代码 1、默认导出与默认导入 默认导出的语法 export default 默认导出的成员示例 let n110let n220function show(){}export default{n1,show }默认导入的语法 import 接收名称 f…

基于Java学生事务处理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

vue2【监听器】

目录 1&#xff1a;监听器的作用 2&#xff1a;语法格式 3&#xff1a;示例 4&#xff1a;应用场景 4.1&#xff1a;axios发送请求 4.2&#xff1a;JQuery发送请求 5&#xff1a;监听器的格式&#xff1a; 5.1&#xff1a;函数格式的监听器&#xff1a; 缺点一&#x…

MySQL数据库、表、用户的基础操作

根据两个实例进行练习 1&#xff09;创建库 mysql> create database Market; Query OK, 1 row affected (0.00 sec) 2&#xff09;创建表 mysql> create table customers (-> c_num int(11) PRIMARY KEY AUTO_INCREMENT,-> c_name varchar(50) ,-> c_contact…

F103串口和DMA配合使用总结

常规的串口使用是这样的&#xff1a;先配置基本的GPIO和串口&#xff0c;然后调用发送和接收函数&#xff0c;如果需要中断&#xff0c;可以根据情况配置发送中断和接收中断。 比如&#xff1a; //PB10:UT3_TX //PB11:UT3_RX void lcd_usart_init(uint32_t bound) {//GPIO端口…

Linux内核模块开发 第 7 章

The Linux Kernel Module Programming Guide Peter Jay Salzman, Michael Burian, Ori Pomerantz, Bob Mottram, Jim Huang译 断水客&#xff08;WaterCutter&#xff09;源 LKMPG 7 /proc 文件系统 Linux 中有一个额外的机制——/proc file system&#xff0c;用于支持内核…

Linux学习之分区挂载

VMWare 16虚拟机添加一块硬盘 点击“硬盘&#xff08;SCSI&#xff09;”&#xff0c;在弹出来的窗口点击“硬盘&#xff08;SCSI&#xff09;”之后添加。 选择硬盘之后&#xff0c;点击下一步。 虚拟磁盘类型&#xff0c;就选择默认的SCSI(S)。 选择“创建新虚拟机磁盘…

SpringBoot整合minio笔记

SpringBoot整合minio笔记 物料准备&#xff1a; 1.引入minio以及 spring-file-storage 相关依赖 2.配置yml 3.配置 FileRecorder实现类 4.启用EnableFileStorage注解 5.测试上传 引入minio以及 spring-file-storage 相关依赖 minio是一个OSS云存储服务&#xff0c;mini…

web 页面布局:(二)float 浮动布局

web 页面布局&#xff1a;&#xff08;二&#xff09;float 浮动布局 页面宽度使用样式居中 使用浮动浮动元素外的剩余空间使用浮动的高度细节 页面宽度 在很早很早的时期&#xff0c;各大网站的底部都会有这么类似的一句声明&#xff1a;最佳分辨率 sss x ttt&#xff0c;比如…