私有云大作业

部署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
基础环境配置

  1. master节点安装etcd
  2. master节点安装kubernetes,k8s
  3. node节点安装kubernetes
  4. 所有节点配置flannel网络
  5. 配置master为镜像仓库
  • 如果以上步骤基础课程部分已配置,删除已经创建资源完成后续的项目部署即可

部署项目

构建项目

  1. 创建springboot项目(包含数据库的基本操作(增、删、改、查页面)和登录(redis))

    1. 实现一个登录窗体使用数据库和redis
    2. 实现一个窗体上面有管理的增、删、改、查(不分页)操作
  2. 使用dockerfile构建镜像文件

  3. 部署tomcat+mysql+redis集群

    1. 使用pv和pvc、及附加组件DNS
    2. 使用glusterFS及PV\pvc实现持久化存储
    3. 部署heapster监控和dashboard监控k8s资源
  4. jenkins自动化构建docker镜像并部署到k8s集群

k8s 版本升级和回滚

  1. gitlab的安装和上传代码
  2. jenkins实现k8s应用版本升级和回滚
    1. 修改管理页面中的查询(分页效果)上传到gitlab
    2. jenkins实现项目版本v2
  3. 使用jenkins实现版本的升级和回滚
  4. 按模板(课程作业v1.docx)制作文档提交相关制作内容

准备工作:

1.自制一个war包

已经具备一个springboot的项目,打包方式为war包的方式
该项目的具有登录注册功能、增删改查功能
其中登录功能使用到了redis
简而言之,就是要有一个使用到redis、mysql的一个项目的war包(这个war包也可以通过java -jar 启动)
image.png

2.清理k8s的资源

清理default命名空间下的所有资源
清理的结果如下:
image.png

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

image.png

# 打包镜像
docker tag redis:latest 10.0.0.11:5000/redis:1.0

#推送镜像
 docker push 10.0.0.11:5000/redis:1.0 

image.png

#查看私有仓库的镜像
curl 10.0.0.11:5000/v2/_catalog
# 发现 有mysql、redis、tomcat ,现在就可以开始部署springboot项目了

image.png

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 

image.png
image.png

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 

image.png
image.png

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 

image.png

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

image.png

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

image.png
image.png

配置开机自动挂载:

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的域名
image.png

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

image.png

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

image.png

5.2本地连接网站所使用的redis

image.png

5.3浏览器访问网站并登录

image.png
image.png
登录成功

5.4 再次查看redis数据库中是否有数据

image.png
发现此时redis数据库中有数据

集群部署成功!!!

6.自动化部署:

6.1gitlab上传项目代码

image.png

6.2jenkins构建一个maven任务

image.png

6.2.1配置项目的仓库地址:

image.png

6.2.2跳过maven测试阶段

因为项目中使用到的mysql数据库和redis数据库的地址都是使用的域名,这些域名只有在k8s集群中才有效,
如果不是k8s集群,打包项目会报连接数据库失败错误
image.png

6.2.3安装publish over ssh

用于将打好的包和Dockerfile发送到master主机上
image.png

6.2.4配置pulish over ssh 发送文件到master主机上

image.png

把community*.war 改名改成 community.war
image.png

image.png

这是上图详细的配置代码

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执行构建:

image.png

此时查看私有仓库,发现多样一个v14版本
image.png

6.3 gitlab和jenkins配置构建,实现代码改动,自动构建

目标:

一旦gitlab的代码发生改变,那么自动构建这个任务,而无需人为干预

6.3.1jenkins安装gitlab插件

image.png

6.3.2 jenkins在任务中设置钩子构建

jenkins配置gitlab钩子:
image.png
image.png
image.png
保存配置!!!

6.3.3 gitlab配置webhook钩子

image.png

image.png

如此一来,只要提交代码,gitlab就会通过钩子告诉jenkins构建任务,
jenkins便会构建任务,打成镜像,修改项目的镜像为最新的当前镜像!!

6.4 测试钩子自动构建项目:

6.4.1修改源码,git提交

源代码注释掉分页:
image.png
使用git重新提交代码:
image.png

6.4.2观察jenkins是否自动构建

发现jenkins已经在自动构建了:
image.png
查看此时的镜像版本:

kubectl edit deployment xubin-tomcat

镜像版本为17:
image.png

6.4.3自动化构建部署成功!!!

7.升级回滚

7.1 升级

升级之前先查看一下版本:

  kubectl edit deployment xubin-tomcat

image.png

7.1.1 修改代码内容,git提交

image.png
image.png

7.1.2 查看jenkins是否构建

image.png

7.1.3 在此查看镜像版本:

发现升级成功!!!
image.png

7.1.4 升级后的代码有分页功能

登录网页进行验证:
image.png

7.2 回滚

# 查看tomcat的deployment的历史版本
kubectl rollout history deployment xubin-tomcat

image.png

7.2.1使用如下指令回滚即可:
#回滚到1
kubectl rollout undo deployment xubin-tomcat --to-revision=1
7.2.2 回滚后的代码没有分页功能

访问网页登录验证,查看是否有分页功能:
image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值