Kubernetes 实战:使用 k8s+jenkins 实现 CICD
来源:feixiang.blog.csdn.net/article/details/131568925
👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战/ Java 学习路线 / 一对一提问 / 学习打卡
目前, 正在星球内部带小伙伴做第一个项目:前后端分离博客,手摸手,后端 + 前端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,直到项目上线。目前已更新了90小节,累计12w+字,讲解图:612张,还在持续爆肝中.. 后续还会上新更多项目,如秒杀系统, 在线商城, IM即时通讯等,戳我加入学习,已有280+小伙伴加入(目前最低价)
1什么是CICD
CIDI(Continuous Integration,Continuous Delivery & Deployment),持续集成,持续部署,持续发布。
也就是说,在本地开发完代码之后,push到远程仓库,然后代码打包、部署的这个过程完全是自动化完成的。
但是我们不要进入一个误区,CICD并不意味着一定就是这一套流程,只要实现了代码提交后自动部署即可,不管是部署在k8s还是tomcat中,这是由应用规模和使用的工具来决定的。
2准备k8s环境
传送门:https://feixiang.blog.csdn.net/article/details/131513900
3jenkins环境准备(选择一台服务器)
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安装插件
-
安装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镜像成功!
4Kubernetes拉取镜像运行
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 --->粘贴内容
大功告成 !
👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡
目前, 正在星球内部带小伙伴做第一个项目:前后端分离博客,手摸手,后端 + 前端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,直到项目上线。目前已更新了90小节,累计12w+字,讲解图:612张,还在持续爆肝中.. 后续还会上新更多项目,如秒杀系统, 在线商城, IM即时通讯等,戳我加入学习,已有280+小伙伴加入(目前最低价)
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。
PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。
点“在看”支持小哈呀,谢谢啦