0


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

文章目录

一、什么是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
# 在最后添加上exportJAVA_HOME=/root/jenkins/jdk-17.0.7
exportCLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
exportPATH=$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
# 在最后添加exportMAVEN_HOME=/root/jenkins/apache-maven-3.6.2
exportPATH=$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 installgit# 配置gitgit config --global user.name "cxf"git config --global user.email "[email protected]"

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

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

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

(3)验证

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

4、准备springboot项目

(1)编写springboot项目

@RestControllerpublicclassK8SController{@RequestMapping("/k8s")publicStringk8s(){return"hello K8s <br/>111222 ";}}

(2)将springboot项目提交到gitee

(3)git clone测试

git clone [email protected]: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# 后台启动nohupjava-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'[email protected]: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 <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"]
EOFecho"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'[email protected]: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部署PodapiVersion: apps/v1
kind: Deployment
metadata:name: springboot-demo
spec:selector:matchLabels:app: springboot-demo
  replicas:1template: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的ServiceapiVersion: v1
kind: Service
metadata:name: springboot-demo
spec:ports:-port:80protocol: TCP
    targetPort:8080selector: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'[email protected]: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、大功告成 !


本文转载自: https://blog.csdn.net/A_art_xiang/article/details/131568925
版权归原作者 秃了也弱了。 所有, 如有侵权,请联系我们删除。

“Kubernetes(k8s)实战:使用k8s+jenkins实现CICD”的评论:

还没有评论