部署SpringBoot项目
部署节点要求
环境要求:集群部署(CentOS 7.8 + docker 1.13 + kubectl 1.52)
主机规划
master 10.0.0.11
node1 10.0.0.12
node3 10.0.0.13
基础环境配置
- master节点安装etcd
- master节点安装kubernetes,k8s
- node节点安装kubernetes
- 所有节点配置flannel网络
- 配置master为镜像仓库
- 如果以上步骤基础课程部分已配置,删除已经创建资源完成后续的项目部署即可
部署项目
构建项目
-
创建springboot项目(包含数据库的基本操作(增、删、改、查页面)和登录(redis))
- 实现一个登录窗体使用数据库和redis
- 实现一个窗体上面有管理的增、删、改、查(不分页)操作
-
使用dockerfile构建镜像文件
-
部署tomcat+mysql+redis集群
- 使用pv和pvc、及附加组件DNS
- 使用glusterFS及PV\pvc实现持久化存储
- 部署heapster监控和dashboard监控k8s资源
-
jenkins自动化构建docker镜像并部署到k8s集群
k8s 版本升级和回滚
- gitlab的安装和上传代码
- jenkins实现k8s应用版本升级和回滚
- 修改管理页面中的查询(分页效果)上传到gitlab
- jenkins实现项目版本v2
- 使用jenkins实现版本的升级和回滚
- 按模板(课程作业v1.docx)制作文档提交相关制作内容
准备工作:
1.自制一个war包
已经具备一个springboot的项目,打包方式为war包的方式
该项目的具有登录注册功能、增删改查功能
其中登录功能使用到了redis
简而言之,就是要有一个使用到redis、mysql的一个项目的war包(这个war包也可以通过java -jar 启动)
2.清理k8s的资源
清理default命名空间下的所有资源
清理的结果如下:
1.上传镜像
制作包含项目的tomcat镜像
FROM tomcat:9
ADD community.war /usr/local/tomcat/webapps
chmod 777 -R docker
cd docker/
mv community-0.0.1-SNAPSHOT.war community.war
vi Dockerfile #Dockerfile的内容如上所示
docker build -t 10.0.0.11:5000/tomcat:community .
docker push 10.0.0.11:5000/tomcat:community
将tomcat、mysql、redis镜像上传至私有仓库10.0.0.11
1.1原理部分:
# 打包镜像
docker tag 镜像定位 私有仓库IP:端口/新的镜像名
# 推送镜像
docker push 私有仓库IP:端口/新的镜像名
# 查看镜像
curl 私有仓库IP:端口/v2/_catalog
1.2实践部分:
由于我的私有镜像中已经有tomcat和mysql镜像了,这里我就再添加一个redis镜像即可
# 拉取redis镜像
docker pull redis
# 打包镜像
docker tag redis:latest 10.0.0.11:5000/redis:1.0
#推送镜像
docker push 10.0.0.11:5000/redis:1.0
#查看私有仓库的镜像
curl 10.0.0.11:5000/v2/_catalog
# 发现 有mysql、redis、tomcat ,现在就可以开始部署springboot项目了
2.创建3个svc
这是一个集群,我们规定一个前缀xubin,所有的资源都加一个前缀,方便区分
分别是mysql-svc、redis-svc、tomcat-svc
备注:
其中mysql-svc、redis-svc,用作域名==>将项目中的数据库地址和reids的地址改成mysql-svc、redis-svc
2.1 mysql的svc
xubin-mysql-svc.yaml文件的内容如下
apiVersion: v1
kind: Service
metadata:
name: xubin-mysql-svc
spec:
ports:
- name: xubin-mysql-svc
port: 3306
targetPort: 3306
selector:
app: xubin-mysql
type: ClusterIP
# 创建xubin-mysql-svc
vi xubin-mysql-svc.yaml
kubectl create -f xubin-mysql-svc.yaml
2.2 redis的svc
xubin-redis-svc.yaml文件的内容如下
apiVersion: v1
kind: Service
metadata:
name: xubin-redis-svc
spec:
ports:
- name: xubin-redis-svc
port: 6379
targetPort: 6379
selector:
app: xubin-redis
type: ClusterIP
vi xubin-redis-svc.yaml
kubectl create -f xubin-redis-svc.yaml
2.3 tomcat的svc
xubin-tomcat-svc.yaml文件的内容如下
apiVersion: v1
kind: Service
metadata:
name: xubin-tomcat-svc
spec:
ports:
- name: xubin-tomcat-svc
port: 8080
targetPort: 8080
nodePort: 30003
selector:
app: xubin-tomcat
type: NodePort
vi xubin-tomcat-svc.yaml
kubectl create -f xubin-tomcat-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: xubin-redis-test-svc
spec:
ports:
- name: xubin-tomcat-svc
port: 6379
targetPort: 6379
nodePort: 6379
selector:
app: xubin-tomcat
type: NodePort
apiVersion: v1
kind: Service
metadata:
name: xubin-mysql-test-svc
spec:
ports:
- name: xubin-mysql-svc
port: 3306
targetPort: 3306
nodePort: 30001
selector:
app: xubin-mysql
type: NodePort
2.4 查看svc的情况
kubectl get svc -o wide
3.mysql数据的持久化准备
3.1gluster挂载mysql卷
在master主机上执行以下命令
#创建分布式复制卷
gluster volume create xubin_mysql replica 2 master:/gfs/mysql1 master:/gfs/mysql2 node1:/gfs/mysql1 node1:/gfs/mysql2 node2:/gfs/mysql1 node2:/gfs/mysql2 force
force
#开启卷
gluster volume start xubin_mysql
#查看卷信息
gluster volume info xubin_mysql
# 挂载目录
mkdir /xubin_mysql
mount -t glusterfs 10.0.0.11:/xubin_mysql /xubin_mysql
#这是取消挂载指令 umount /xubin_mysql
#这是删除卷指令: gluster volume delete xubin_mysql
授予777权限:
[root@master tomcat-mysql-redis]# mkdir /xubin_mysql
[root@master tomcat-mysql-redis]# chmod 777 /xubin_mysql -R
[root@master tomcat-mysql-redis]# mount -t glusterfs 10.0.0.11:/xubin_mysql /xubin_mysql
配置开机自动挂载:
vi /etc/fstab
#最后一行,添加如下信息
# 将10.0.0.11:/xubin_mysql 与本地的/xubin_mysql进行挂载
10.0.0.11:/xubin_mysql /xubin_mysql glusterfs defaults,_netdev 0 0
创建gluster_endpoint
3.2创建gluster_endpoint
vi gluster_endpoint.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: glusterfs
namespace: default
subsets:
- addresses:
- ip: 10.0.0.11
- ip: 10.0.0.12
- ip: 10.0.0.13
ports:
- port: 49153 #这个端口选择之前
protocol: TCP
3.3创建gluster类型pv
vi glusterfs-mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: xubin-mysql-pv
labels:
type: glusterfs
spec:
capacity:
storage: 3Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: "glusterfs"
path: "xubin_mysql"
readOnly: false
3.4创建gluster类型pvc
vi glusterfs-mysql-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: xubin-mysql-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 3Gi
4.创建deployment
4.1创建mysql的deployment
vi mysql_deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: xubin-mysql
spec:
replicas: 1
template:
metadata:
labels:
app: xubin-mysql
spec:
containers:
- image: 10.0.0.11:5000/mysql:8.0
imagePullPolicy: IfNotPresent #不使用远程镜像
name: xubin-mysql
resources:
limits:
cpu: "0.3"
memory: 0.8Gi
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "20011230xu"
volumeMounts:
- name: mysql-gfs
mountPath: /var/lib/mysql #将mysq容器存储数据的目录往外映射
volumes:
- name: mysql-gfs
persistentVolumeClaim:
claimName: xubin-mysql-pvc #对应的是pvc中的名字
4.2创建redis的deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: xubin-redis
spec:
replicas: 1
template:
metadata:
labels:
app: xubin-redis
spec:
containers:
- image: 10.0.0.11:5000/redis:1.0
imagePullPolicy: IfNotPresent #不使用远程镜像
name: xubin-redis
ports:
- containerPort: 6379
4.3创建tomcat的deployment
注意:这个tomcat镜像的mysql和redis地址需要配置成svc的域名
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: xubin-tomcat
spec:
replicas: 1
template:
metadata:
labels:
app: xubin-tomcat
spec:
containers:
- image: 10.0.0.11:5000/tomcat:community
imagePullPolicy: IfNotPresent #不使用远程镜像
name: xubin-tomcat
ports:
- containerPort: 8080
4.4 查看部署的pod情况
kubectl get pod -o wide
5.浏览器访问master:8080/community
5.1 访问前准备
为方便导入数据,创建一个mysql_test_svc用于导入数据:(向外暴露30001端口)
apiVersion: v1
kind: Service
metadata:
name: xubin-mysql-test-svc
spec:
ports:
- name: xubin-mysql-svc
port: 3306
targetPort: 3306
nodePort: 30001
selector:
app: xubin-mysql
type: NodePort
为方便查看redis的数据情况,创建一个redis_test_svc用于查看数据:(暴露30379端口)
apiVersion: v1
kind: Service
metadata:
name: xubin-redis-test-svc
spec:
ports:
- name: xubin-tomcat-svc
port: 6379
targetPort: 6379
nodePort: 30379
selector:
app: xubin-redis
type: NodePort
5.2本地连接网站所使用的redis
5.3浏览器访问网站并登录
登录成功
5.4 再次查看redis数据库中是否有数据
发现此时redis数据库中有数据
集群部署成功!!!
6.自动化部署:
6.1gitlab上传项目代码
6.2jenkins构建一个maven任务
6.2.1配置项目的仓库地址:
6.2.2跳过maven测试阶段
因为项目中使用到的mysql数据库和redis数据库的地址都是使用的域名,这些域名只有在k8s集群中才有效,
如果不是k8s集群,打包项目会报连接数据库失败错误
6.2.3安装publish over ssh
用于将打好的包和Dockerfile发送到master主机上
6.2.4配置pulish over ssh 发送文件到master主机上
把community*.war 改名改成 community.war
这是上图详细的配置代码
cd /root/community
#!/bin/bash
# 通过Dockerfile构建镜像
docker build -t 10.0.0.11:5000/tomcat:community$BUILD_ID .
#上传到私有仓库
docker push 10.0.0.11:5000/tomcat:community$BUILD_ID
# 构建结束之后,删除war包
rm -rf ./*
# 修改tomcat:deployment的镜像版本
kubectl set image deployment/xubin-tomcat xubin-tomcat=10.0.0.11:5000/tomcat:community$BUILD_ID
6.2.5执行构建:
此时查看私有仓库,发现多样一个v14版本
6.3 gitlab和jenkins配置构建,实现代码改动,自动构建
目标:
一旦gitlab的代码发生改变,那么自动构建这个任务,而无需人为干预
6.3.1jenkins安装gitlab插件
6.3.2 jenkins在任务中设置钩子构建
jenkins配置gitlab钩子:
保存配置!!!
6.3.3 gitlab配置webhook钩子
如此一来,只要提交代码,gitlab就会通过钩子告诉jenkins构建任务,
jenkins便会构建任务,打成镜像,修改项目的镜像为最新的当前镜像!!
6.4 测试钩子自动构建项目:
6.4.1修改源码,git提交
源代码注释掉分页:
使用git重新提交代码:
6.4.2观察jenkins是否自动构建
发现jenkins已经在自动构建了:
查看此时的镜像版本:
kubectl edit deployment xubin-tomcat
镜像版本为17:
6.4.3自动化构建部署成功!!!
7.升级回滚
7.1 升级
升级之前先查看一下版本:
kubectl edit deployment xubin-tomcat
7.1.1 修改代码内容,git提交
7.1.2 查看jenkins是否构建
7.1.3 在此查看镜像版本:
发现升级成功!!!
7.1.4 升级后的代码有分页功能
登录网页进行验证:
7.2 回滚
# 查看tomcat的deployment的历史版本
kubectl rollout history deployment xubin-tomcat
7.2.1使用如下指令回滚即可:
#回滚到1
kubectl rollout undo deployment xubin-tomcat --to-revision=1
7.2.2 回滚后的代码没有分页功能
访问网页登录验证,查看是否有分页功能: