侧边栏壁纸
博主头像
小周的个人博客 博主等级

行动起来,活在当下

  • 累计撰写 60 篇文章
  • 累计创建 11 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Java项目部署

Administrator
2026-05-26 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

1、案例需求介绍

ZrLog是使用 Java 开发的博客平台,运行在tomcat环境中,本案例需要将ZrLog部署在k8s集群中,并实现外部访问。

部署思路如下:

  1. 准备镜像仓库,用于存储镜像。

  2. 将Java项目提前打包好,项目运行在什么环境中,需要将运行环境打包到镜像中。

  3. 准备项目所需的数据库,并配置好项目连接数据库的信息。

  4. 在k8s中部署项目,并通过Ingress发布项目。

2、部署zrlog数据库

本方案将数据部署在k8s集群外部。可以直接使用前边项目的数据库。

#登录数据库
mysql -uroot -padmin123456
​
#创建zrlog数据库
create database zrlog;
​
#创建zrlog用户(密码长度须满足8位)
create user zrlog@'%' identified by "zrlog123456";
​
#授权用户权限
grant all on zrlog.* to zrlog@'%' identified by "zrlog123456";
​
#查看用户
select user,host from mysql.user;

3、准备zrlog镜像

通过Dockerfile来构建zrlog镜像

mkdir zrlog
cd zrlog
cat dockerfile
​
#定义基础镜像
FROM centos:7.9.2009
​
#配置阿里仓库安装openJDK
RUN yum install --nogpgcheck java-1.8.0-openjdk.x86_64 -y && \
    yum clean all && rm -rf /var/cache/yum/*
​
#拷贝tomcat二进制包
COPY ./apache-tomcat-8.0.30.tar /
​
#安装tomcat
RUN tar -xf /apache-tomcat-8.0.30.tar -C /usr/local/ && \
    mv /usr/local/apache-tomcat-8.0.30/ /usr/local/tomcat
​
#清空webapps目录默认数据
RUN rm -rf /usr/local/tomcat/webapps/*
​
#拷贝zrlog.war到webapps目录
COPY ./zrlog.war /usr/local/tomcat/webapps/
​
#将zrlog目录改名为ROOT作为tomcat的默认一级访问目录
RUN mv /usr/local/tomcat/webapps/zrlog.war /usr/local/tomcat/webapps/ROOT.war
​
#暴露容器的端口
EXPOSE 8080
​
#启动tomcat(该脚本tomcat自带)
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
#构建镜像(准备好需要拷贝的tomcat二进制包和zrlog.war包到当前构建目录)
docker build -f dockerfile -t zrlog:v1.0 .

推送zrlog镜像到harbor仓库

提示:在harbor中创建一个名为zrlog的项目仓库。

#登录仓库
docker login 192.168.0.25
Username: admin
Password: 12345
#修改镜像标签
docker tag zrlog:v1.0 192.168.0.25/zrlog/zrlog:v1.0
#上传镜像到仓库
docker push 192.168.0.25/zrlog/zrlog:v1.0

4、部署zrlog项目

创建zrlog名称空间

kubectl create ns zrlog

在zrlog空间中创建Secret存储Harbor仓库信息

kubectl create secret docker-registry registry \
  --docker-server=192.168.0.25 \
  --docker-username=admin \
  --docker-password=12345 \
  --namespace=zrlog

创建PVC存储tomcat日志文件

# cat tomcatlog-pvc.yml
​
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: tomcat-log
  namespace: zrlog
spec:
  storageClassName: "nfs-client"
  accessModes:
  - ReadWriteMany
  resources:
   requests:
     storage: 5Gi
#创建PVC
kubectl create -f tomcatlog-pvc.yml

通过Deployment部署zrlog

cat zrlog-pod.yml
​
apiVersion: apps/v1
kind: Deployment
metadata:
  name: zrlog-deploy
  namespace: zrlog
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zrlog
  template:
    metadata:
      labels:
        app: zrlog
    spec:
      imagePullSecrets:         #镜像仓库的secret
      - name: registry
      containers:
      - name: zrlog
        image: 192.168.0.25/zrlog/zrlog:v1.0
        ports:
        - containerPort: 8080
        env:
        - name: JAVA_TOOL_OPTIONS              #设置程序编码为UTF8
          value: "-Dfile.encoding=UTF-8"
​
        volumeMounts:
        - name: log                             #挂载卷
          mountPath: /usr/local/tomcat/logs/    #挂载到容器的目录
​
      volumes:                                  #定义存储卷
      - name: log                               #卷名称
        persistentVolumeClaim:                  #卷类型PVC
          claimName: tomcat-log                 #PVC名字
​
---
#Service
apiVersion: v1
kind: Service
metadata:
  name: zrlog-svc
  namespace: zrlog
spec:
  selector:
    app: zrlog
  ports:
  - port: 8080
    targetPort: 8080
#创建Pod
kubectl create -f zrlog-pod.yml

创建Ingress发布zrlog提供外部访问

cat zrlog-ingress.yml
​
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: zrlog-ingress         #自定义ingress名称
  namespace: zrlog
  annotations:
    #指定控制器的类别为nginx
    kubernetes.io/ingress.class: nginx
spec:
  rules:                         #定义主机列表
  - host: web.zrlog.com          #自定义域名
    http:
      paths:
      - pathType: Prefix         #路径类型
        path: "/"                #定义站点路径
        backend:                 #定义后端引用的服务
          service:               #关联service
            name: zrlog-svc      #对应上面创建的service名称
            port:
              number: 8080       #service端口
#创建Ingress
kubectl create -f zrlog-ingress.yml

提示:windows配置域名解析

访问:http://web.zrlog.com

发表一篇文章验证博客平台可用性!

扩容zrlog的Pod数量后再次验证

kubectl edit deploy zrlog-deploy -n zrlog
...
replicas: 3

问题:默认新扩容的Pod都需要指定数据库的连接信息。解决方法可以通过在原有的镜像基础上,直接定义好数据库的连接信息,在重新构建一个新的镜像即可。

删除zrlog的Pod

kubectl delete -f zrlog-pod.yml

在MySQL中删除zrlog数据库并重新创建

drop database zrlog;
create database zrlog;

在Harbor主机基于上一个镜像创建容器,并指定连接数据库的信息,然后在重新构建新的镜像

docker run -id --name=zrlog -p 8080:8080 zrlog:v1.0

访问zrlog:http://192.168.0.25:8080

数据库连接成功后,通过docker将该容器重新导成新镜像

docker commit zrlog zrlog:v2.0

修改镜像标签上传到仓库

docker tag zrlog:v2.0 192.168.0.25/zrlog/zrlog:v2.0
docker push 192.168.0.25/zrlog/zrlog:v2.0

在k8s中创建PVC存储zrlog文章中的图片

cat zrlog-pvc.yml
​
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: zrlog-data
  namespace: zrlog
spec:
  storageClassName: "nfs-client"
  accessModes:
  - ReadWriteMany
  resources:
   requests:
     storage: 5Gi
#创建PVC
kubectl create -f zrlog-pvc.yml

通过Deployment部署zrlog:v2.0版本镜像,并挂载PVC

cat zrlog-pod.yml
​
apiVersion: apps/v1
kind: Deployment
metadata:
  name: zrlog-deploy
  namespace: zrlog
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zrlog
  template:
    metadata:
      labels:
        app: zrlog
    spec:
      imagePullSecrets:         #镜像仓库的secret
      - name: registry
      containers:
      - name: zrlog
        image: 192.168.0.25/zrlog/zrlog:v2.0
        ports:
        - containerPort: 8080
        env:
        - name: JAVA_TOOL_OPTIONS              #设置程序编码为UTF8
          value: "-Dfile.encoding=UTF-8"
​
        volumeMounts:
        - name: log                             #挂载卷
          mountPath: /usr/local/tomcat/logs/    #挂载到容器的目录
        - name: data                            #挂载卷
          mountPath: /usr/local/tomcat/webapps/ROOT/attached/
​
      volumes:                                  #定义存储卷
      - name: log                               #卷名称
        persistentVolumeClaim:                  #卷类型PVC
          claimName: tomcat-log                 #PVC名字
      - name: data
        persistentVolumeClaim:                  #卷类型PVC
          claimName: zrlog-data                 #PVC名字
​
---
#Service
apiVersion: v1
kind: Service
metadata:
  name: zrlog-svc
  namespace: zrlog
spec:
  selector:
    app: zrlog
  ports:
  - port: 8080
    targetPort: 8080
#创建Pod
kubectl create -f zrlog-pod.yml

登录zrlog发表一篇带图片的文章:http://web.zrlog.com

扩容zrlog验证新的Pod是否需要重新配置连接数据库

kubectl edit deploy zrlog-deploy -n zrlog
...
  replicas: 3


0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区