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

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

91ebb839e67931ec1c1a43a6b5dd3dcd.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:

  • Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

来源:feixiang.blog.csdn.net/
article/details/131568925


1 什么是CICD

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

也就是说,在本地开发完代码之后,push到远程仓库,然后代码打包、部署的这个过程完全是自动化完成的。

077e52f8163b85bb767543e0cace717f.png

但是我们不要进入一个误区,CICD并不意味着一定就是这一套流程,只要实现了代码提交后自动部署即可,不管是部署在k8s还是tomcat中,这是由应用规模和使用的工具来决定的。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

2 准备k8s环境

传送门:https://feixiang.blog.csdn.net/article/details/131513900

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

3 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,通过仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」 ,将生成的公钥添加到仓库中。

14c0b77d5d2d8e3443d87ed7d237fa73.png
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),选择流水线

0a6ae6924c8e1a55613baa09fa8bf28a.png

配置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

573a13be5d522b4dbc9afcfa695e9887.png

生成Personal access tokens

Jenkins访问github需要授权,所以在github上生成token交给jenkins使用,即Personal access tokens

github的Settings[个人信息右上角]–>Developer settings–>Personal access tokens–>Generate new token

最后保存好该token,比如:**72f048b514e95d6fe36f86d84374f2dcce402b43

jenkins安装插件

  • 安装github plugin插件:[系统管理]->[插件管理]->[可选插件]

  • 安装gitlab插件和gitlab hook插件:[系统管理]->[插件管理]->[可选插件]

配置GitHub Server

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

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

6、dockerhub准备(阿里云)

1)创建一个springboot-demo 的镜像仓库
# 登录 ,需要输入密码
docker login --username=沙里沟第二小学扛把子 registry.cn-hangzhou.aliyuncs.com
# 私有云的话,需要在k8s添加凭证
kubectl create secret docker-registry <secret-name> \
     --docker-username=<username> \
     --docker-password=<password> \
     --docker-email=<email> \
     --docker-server=<registry>
<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镜像成功!

5ce06600f69235b3fbe8916e9bd151b3.png 1447d1100f58696ccab53d7d8d1e8647.png

4 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   --->粘贴内容

大功告成 !


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

8cae6befb2460005ff0ac2e3b6795839.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

6ec96c1e8fa3f272b8094557f4c46981.png

dcf2c8568e311ce791ecffb5789e410a.png74e5ed49714823152c982f8c318fcecb.png5d1b6787cad7ea501b3eea5d09712e8f.png11d2b13ac4cf2036becedbb489017858.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用KubernetesK8s)和Jenkins构建Vue项目时,可以按照以下步骤进行操作: 1. 首先,创建一个Git仓库来管理Vue项目的源代码,并将其与Jenkins关联。可以选择在Jenkins中创建一个新的项目或使用现有的项目。 2. 在Jenkins中创建一个Pipeline或一个自由风格项目,并配置相关参数。比如,指定GIT仓库的URL、凭证、构建触发器等。 3. 在Jenkins Pipeline脚本或构建过程中,配置Kubernetes插件以与K8s集群通信。这个插件使Jenkins能够在K8s集群上创建和管理Pod、容器等资源。 4. 在构建过程中,可以通过执行一系列步骤来构建Vue项目。例如,可以通过运行npm install安装项目所需的依赖项,然后执行npm run build命令来构建Vue项目。 5. 构建完成后,可以使用Kubernetes插件将构建生成的静态文件打包为容器镜像,并将其推送到K8s的镜像仓库中。 6. 在Jenkins中配置Kubernetes插件,以便创建部署文件(Deployment)和服务(Service)等K8s资源。这些资源将使用前面构建的镜像来部署Vue应用程序。 7. 配置Kubernetes插件以在K8s集群上创建一个新的Pod,并将前面创建的K8s资源应用到该Pod上。 8. 最后,确认应用程序在K8s集群中成功部署并运行。可以通过访问指定的服务URL来查看Vue应用程序的界面。 这里只是简要地介绍了使用K8sJenkins构建Vue项目的基本步骤和操作。具体的实施会因环境、涉及的组件等因素而有所差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值