使用k8s部署java前后端服务

一、项目架构

前端、后端、数据库

1)前端

静态的资源:img css html js文件

js:axios、ajax

2)后端

提供数据:根据web前端发送的请求,从数据库中获取数据

请求都是无状态的,如何保持会话

每次请求都会携带一个token字符串,能够验证用户身份

3)数据库

存储数据与表格

二、流程

1)访问nginx服务,获得页面(下载静态资源)

在旧的版本中,都是使用浏览器直接访问java或者php服务,由这些服务临时渲染一个页面文件响应给客户端。

2)在浏览器中解析并且渲染页面
3)向服务器发送登录请求或者其他的请求

请求的位置:服务器主机ip或者域名在哪里,端口是哪个,服务名称映射

请求的参数:账号,密码

请求的方法:get,post

4)java服务器收到请求之后,对请求解析

例如登录,分发dispatch到login模块

5)从数据库中查询对应的用户信息

如果用户信息的账号和密码都是正确的,就返回字符串,允许用户登录,否则也返回异常信息字符串

三、部署

k8s中使用到的技术:deployment、service、volums

1、准备nfs服务器
1)新建虚拟机
2)设置计划任务,核对时间
复制代码
 [root@nginx ~]# yum -y install ntpdate
 [root@nginx ~]# ntpdate time2.aliyun.com
 26 Sep 09:45:40 ntpdate[1358]: adjust time server 203.107.6.88 offset 0.009069 sec
 [root@nginx ~]# which ntpdate
 /usr/sbin/ntpdate
 [root@nginx ~]# crontab -e
 * 5 * * * /usr/sbin/ntpdate time2.aliyun.com
3)安装nfs服务应用
复制代码
 [root@nginx ~]# yum -y install rpcbind
 [root@nginx ~]# yum -y install nfs-utils
4)配置文件
复制代码
 [root@nginx ~]# echo "/root/pes    *(rw,sync)" >> /etc/exports
5)准备pes资源
复制代码
 [root@nginx ~]# ls
 pes 
6)启动nfs服务
复制代码
 [root@nginx ~]# systemctl start rpcbind nfs-server
7)测试验证
复制代码
 [root@k8s-master ~]# showmount -e 10.0.0.99
 Export list for 10.0.0.99:
 /root/pes *
2、前端web实现

nginx:latest,使用nfs挂载

1)编写deployment清单
复制代码
 apiVersion: apps/v1
 kind: Deployment
 metadata:
         name: web-deployment
         namespace: default
         labels:
                 app: web-deployment
 spec:
         selector:
                 matchLabels:
                         app: web-deployment
         replicas: 3
         strategy:
                 rollingUpdate:
                         maxSurge: 25%
                         maxUnavailable: 25%
                 type: RollingUpdate
         template:
                 metadata:
                         labels:
                                 app: web-deployment
                 spec:
                         containers:
                         -       name: nginx
                                 image: docker.io/library/nginx:latest
                                 imagePullPolicy: Never
                                 resources:
                                         requests:
                                                 cpu: 100m
                                                 memory: 100Mi
                                         limits:
                                                 cpu: 100m
                                                 memory: 100Mi
                                 ports:
                                 -       containerPort: 80
                                 volumeMounts:
                                 -       name: pesdist
                                         mountPath: /usr/share/nginx/html
                         volumes:
                         -       name: pesdist
                                 nfs:
                                         server: 10.0.0.99
                                         path: /root/pes/web/src/dist
                         restartPolicy: Always
2)创建deployment项目
复制代码
 [root@k8s-master cc]# kubectl create -f web-deployment.yaml 
 deployment.apps/web-deployment created
 [root@k8s-master cc]# kubectl get pod
 NAME                              READY   STATUS    RESTARTS       AGE
 cluster-test-66bb44bd88-zdfdf     1/1     Running   32 (54m ago)   13d
 web-deployment-7fd7479d49-6x4nn   1/1     Running   0              8s
 web-deployment-7fd7479d49-bxdp9   1/1     Running   0              8s
 web-deployment-7fd7479d49-xhjwb   1/1     Running   0              8s
3)测试验证
复制代码
 [root@k8s-master cc]# kubectl get pod -owide
 NAME                              READY   STATUS    RESTARTS       AGE     IP              NODE         NOMINATED NODE   READINESS GATES
 cluster-test-66bb44bd88-zdfdf     1/1     Running   32 (57m ago)   13d     172.16.85.200   k8s-node01   <none>           <none>
 web-deployment-7fd7479d49-6x4nn   1/1     Running   0              2m38s   172.16.58.251   k8s-node02   <none>           <none>
 web-deployment-7fd7479d49-bxdp9   1/1     Running   0              2m38s   172.16.85.201   k8s-node01   <none>           <none>
 web-deployment-7fd7479d49-xhjwb   1/1     Running   0              2m38s   172.16.58.252   k8s-node02   <none>           <none>
 [root@k8s-master cc]# curl 172.16.58.251
 <!DOCTYPE html>
 <html lang="en">
   <head>
     <meta charset="UTF-8">
     <link rel="icon" href="/favicon.ico">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Vite App</title>
     <script type="module" crossorigin src="/assets/index-C4kAShR5.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-CSz7ARPP.css">
   </head>
   <body>
     <div id="app"></div>
   </body>
 </html>
3、后端java实现

自定义容器,使用nfs挂载

1)在pes目录中找到java的Dockerfile文件,创建镜像
复制代码
 [root@nginx ~]# cd pes/java/
 [root@nginx java]# ls
 Dockerfile  jdk  src  start.sh
 [root@nginx java]# docker build -t java:v1 .
 [root@nginx java]# docker images
 REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
 java         v1        5dc6610d8a6c   18 hours ago   592MB
2)镜像打包发送到两个节点
复制代码
 [root@nginx ~]# docker save -o java.tar java:v1
 [root@nginx ~]# ls
 java.tar
 [root@nginx ~]# scp java.tar 10.0.0.77:/root
 [root@nginx ~]# scp java.tar 10.0.0.88:/root
3)在节点中加载镜像包
复制代码
 [root@k8s-node01 ~]# ctr -n k8s.io images import java.tar --platform=linux/amd64
 [root@k8s-node01 ~]# crictl images
 IMAGE                                                               TAG                 IMAGE ID            SIZE
 docker.io/library/java                                              v1                  5dc6610d8a6cc       599MB
 [root@k8s-node02 ~]# ctr -n k8s.io images import java.tar --platform=linux/amd64
 [root@k8s-node02 ~]# crictl images
 IMAGE                                                               TAG                 IMAGE ID            SIZE
 docker.io/library/java                                              v1                  5dc6610d8a6cc       599MB
4)创建资源清单
复制代码
 apiVersion: apps/v1
 kind: Deployment
 metadata:
         name: java-deployment
         namespace: default
         labels:
                 app: java-deployment
 spec:
         selector:
                 matchLabels:
                         app: java-deployment
         replicas: 3
         strategy:
                 rollingUpdate:
                         maxSurge: 25%
                         maxUnavailable: 25%
                 type: RollingUpdate
         template:
                 metadata:
                         labels:
                                 app: java-deployment
                 spec:
                         containers:
                         -       name: java
                                 image: docker.io/library/java:v1
                                 imagePullPolicy: Never
                                 resources:
                                         requests:
                                                 cpu: 100m
                                                 memory: 100Mi
                                         limits:
                                                 cpu: 100m
                                                 memory: 100Mi
                                 ports:
                                 -       containerPort: 8080
                                 volumeMounts:
                                 -       name: pesjava
                                         mountPath: /java/src
                         volumes:
                         -       name: pesjava
                                 nfs:
                                         server: 10.0.0.99
                                         path: /root/pes/java/src
                         restartPolicy: Always
5)创建deployment项目
复制代码
 [root@k8s-master cc]# kubectl create -f java-deployment.yaml 
 deployment.apps/java-deployment created
 [root@k8s-master cc]# kubectl get pod
 NAME                               READY   STATUS    RESTARTS       AGE
 cluster-test-66bb44bd88-zdfdf      1/1     Running   33 (45m ago)   13d
 java-deployment-7b9f747b8d-9cpsw   1/1     Running   0              7s
 java-deployment-7b9f747b8d-j6l22   1/1     Running   0              7s
 java-deployment-7b9f747b8d-t4cvb   1/1     Running   0              7s
 web-deployment-7fd7479d49-6x4nn    1/1     Running   0              51m
 web-deployment-7fd7479d49-bxdp9    1/1     Running   0              51m
 web-deployment-7fd7479d49-xhjwb    1/1     Running   0              51m
6)测试验证(出现问题)

"OOMKilled" 是一种在容器化环境或某些操作系统中常见的状态,表示 "Out Of Memory Killed",即由于内存不足而被终止。

不断重启

复制代码
 [root@k8s-master cc]# kubectl get po -o wide -w
 NAME                               READY   STATUS             RESTARTS       AGE     IP              NODE         NOMINATED NODE   READINESS GATES
 cluster-test-66bb44bd88-zdfdf      1/1     Running            33 (52m ago)   13d     172.16.85.200   k8s-node01   <none>           <none>
 java-deployment-7b9f747b8d-9cpsw   0/1     OOMKilled          3 (2m1s ago)   6m32s   172.16.85.198   k8s-node01   <none>           <none>
 java-deployment-7b9f747b8d-j6l22   0/1     OOMKilled          3 (118s ago)   6m32s   172.16.58.253   k8s-node02   <none>           <none>

修改资源清单(解决问题)

复制代码
                                         limits:
                                                 cpu: 100m
                                                 memory: 300Mi

重新创建deployment

复制代码
 [root@k8s-master cc]# kubectl delete -f java-deployment.yaml 
 [root@k8s-master cc]# kubectl create -f java-deployment.yaml 
 [root@k8s-master cc]# kubectl get po -o wide 
 NAME                               READY   STATUS    RESTARTS       AGE    IP              NODE         NOMINATED NODE   READINESS GATES
 cluster-test-66bb44bd88-zdfdf      1/1     Running   33 (58m ago)   13d    172.16.85.200   k8s-node01   <none>           <none>
 java-deployment-6d9c668fc5-6ftrk   1/1     Running   0              109s   172.16.85.202   k8s-node01   <none>           <none>
 java-deployment-6d9c668fc5-crk2p   1/1     Running   0              109s   172.16.58.254   k8s-node02   <none>           <none>

重新测试

复制代码
 [root@k8s-master cc]# curl 172.16.85.202:8080
 {"code":20002,"msg":"账号不存在或密码错误"}[root@k8s-master cc]# 
4、后端数据库实现

mysql:5.7.44,使用nfs挂载

1)检查是否存在mysql:5.7.44镜像
复制代码
 [root@k8s-node01 ~]# crictl images | grep mysql
 docker.io/library/mysql                                             5.7.44              5107333e08a87       520MB
 [root@k8s-node02 ~]# crictl images | grep mysql
 docker.io/library/mysql                                             5.7.44              5107333e08a87       520MB
2)创建资源清单
复制代码
 apiVersion: apps/v1
 kind: Deployment
 metadata:
         name: mysql-deployment
         labels:
                 app: mysql-deployment
 spec:
         replicas: 1
         selector:
                 matchLabels:
                         app: mysql-deployment
         template:
                 metadata:
                         labels:
                                 app: mysql-deployment
                 spec:
                         containers:
                         -       name: mysql
                                 image: docker.io/library/mysql:5.7.44
                                 imagePullPolicy: Never
                                 resources:
                                         requests:
                                                 cpu: 100m
                                                 memory: 100Mi
                                         limits:
                                                 cpu: 100m
                                                 memory: 200Mi
                                 ports:
                                 -       name: mysqlport
                                         containerPort: 3306
                                 volumeMounts:
                                      - name: localtime
                                        mountPath: /var/lib/mysql
                         volumes:
                         -       name: localtime
                                 nfs:
                                         server: 10.0.0.99
                                         path: /root/pes/mysql/data
                         restartPolicy: Always
复制代码
 # 如果创建时不使用volumes挂载,则需要将数据导入数据库中
 [root@k8s-master cc]# mysql -h172.16.85.222 -uzhangmin -pzhangmin < ~/project_exam_system.sql
3)创建deployment项目(出现问题)
复制代码
 [root@k8s-master cc]# kubectl create -f mysql-deployment.yaml 
 [root@k8s-master cc]# kubectl get pod
 NAME                                READY   STATUS      RESTARTS       AGE
 mysql-deployment-569c465d84-lrp2j   0/1     OOMKilled   2 (18s ago)    30s

修改资源清单(内存不够,扩大使用内存)

复制代码
                                 resources:
                                         requests:
                                                 cpu: 100m
                                                 memory: 100Mi
                                         limits:
                                                 cpu: 100m
                                                 memory: 1000Mi

重新创建deployment项目(出现问题)

"Permission denied"(权限被拒绝)

复制代码
 [root@k8s-master cc]# kubectl delete -f mysql-deployment.yaml 
 [root@k8s-master cc]# kubectl create -f mysql-deployment.yaml 
 [root@k8s-master cc]# kubectl get pod -o wide
 NAME                                READY   STATUS             RESTARTS       AGE     IP              NODE         NOMINATED NODE   READINESS GATES
 mysql-deployment-6d67955c9d-lcvrn   0/1     Error     3 (75s ago)    3m14s   172.16.85.219   k8s-node01   <none>           <none>
 [root@k8s-master cc]# kubectl logs mysql-deployment-6d67955c9d-lcvrn 
 2024-09-26 11:15:07+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.44-1.el7 started.
 find: '/var/lib/mysql/': Permission denied
 find: '/var/lib/mysql': Permission denied

修改nfs的文件共享权限

复制代码
 [root@nginx assets]# vim /etc/exports
 /root/pes/      *(rw,sync,no_root_squash)
 [root@nginx ~]# systemctl restart rpcbind.service
 [root@nginx ~]# systemctl restart nfs-server

再次创建deployment项目

复制代码
 [root@k8s-master cc]# kubectl delete -f mysql-deployment.yaml 
 [root@k8s-master cc]# kubectl create -f mysql-deployment.yaml 
 [root@k8s-master cc]# kubectl get pod -o wide
 NAME                                READY   STATUS    RESTARTS       AGE     IP              NODE         NOMINATED NODE   READINESS GATES
 cluster-test-66bb44bd88-zdfdf       1/1     Running   41 (39m ago)   14d     172.16.85.200   k8s-node01   <none>           <none>
 java-deployment-6d9c668fc5-6ftrk    1/1     Running   1 (84m ago)    7h42m   172.16.85.202   k8s-node01   <none>           <none>
 java-deployment-6d9c668fc5-crk2p    1/1     Running   0              7h42m   172.16.58.254   k8s-node02   <none>           <none>
 java-deployment-6d9c668fc5-hqxjw    1/1     Running   0              7h42m   172.16.58.255   k8s-node02   <none>           <none>
 mysql-deployment-6d67955c9d-c4kbr   1/1     Running   0              23s     172.16.85.222   k8s-node01   <none>           <none>
 web-deployment-7fd7479d49-6x4nn     1/1     Running   0              8h      172.16.58.251   k8s-node02   <none>           <none>
 web-deployment-7fd7479d49-bxdp9     1/1     Running   0              8h      172.16.85.201   k8s-node01   <none>           <none>
 web-deployment-7fd7479d49-xhjwb     1/1     Running   0              8h      172.16.58.252   k8s-node02   <none>           <none>
4)测试验证
复制代码
 [root@k8s-master cc]# mysql -h172.16.85.224 -p'zhangmin' -uzhangmin
 Welcome to the MariaDB monitor.  Commands end with ; or \g.
 Your MySQL connection id is 4
 Server version: 5.7.44 MySQL Community Server (GPL)
 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 MySQL [(none)]> show databases;
 +---------------------+
 | Database            |
 +---------------------+
 | information_schema  |
 | mysql               |
 | performance_schema  |
 | project_exam_system |
 | sys                 |
 +---------------------+
 5 rows in set (0.08 sec)
5、web-service准备
1)创建资源清单
复制代码
 apiVersion: v1
 kind: Service
 metadata:
         name: webservice
 spec:
         selector:
                 app: web-deployment
         ports:
         -       name: webport
                 port: 80
                 targetPort: 80
                 nodePort: 32000
                 protocol: TCP
         type: NodePort
2)创建service项目
复制代码
 [root@k8s-master cc]# kubectl create -f web-service.yaml 
 service/webservice created
 [root@k8s-master cc]# kubectl get svc
 NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
 kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        15d
 webservice   NodePort    10.96.126.91   <none>        80:32000/TCP   19s
3)测试验证

找不到域名(设置域名)

此时,不能登录的原因是10.0.0.66的8080端口没有开发,也没有映射到java的pod上(也就是未连接后端)

复制代码
 [root@k8s-master cc]# netstat -lntup | grep 8080
6、java-service准备
1)创建资源清单
复制代码
 apiVersion: v1
 kind: Service
 metadata:
         name: javaservice
 spec:
         selector:
                 app: java-deployment
         type: NodePort
         sessionAffinity: None
         sessionAffinityConfig:
                 clientIP:
                         timeoutSeconds: 10800
         ports:
         -       name: javaport
                 protocol: TCP
                 port: 8080
                 targetPort: 8080
                 nodePort: 32100
2)创建service项目
复制代码
 [root@k8s-master cc]# kubectl create -f java-service.yaml 
 [root@k8s-master cc]# kubectl get svc
 NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
 javaservice   NodePort    10.96.83.133   <none>        8080:32100/TCP   12m
 kubernetes    ClusterIP   10.96.0.1      <none>        443/TCP          15d
 webservice    NodePort    10.96.126.91   <none>        80:32000/TCP     13h
3)测试验证

进行前后端连接

7、web与java连接
1)修改web连接java的配置文件

修改nfs服务器pes/web/assets中关于端口请求的文件,将8080端口修改为32100端口

复制代码
 [root@nginx assets]# pwd
 /root/pes/web/src/dist/assets
 [root@nginx assets]# for fn in $(ls *.js) ; do echo $fn ; done
 AdminView-yX0Ltz_1.js
 CategoryView-Ca4t3JNT.js
 ......
 [root@nginx assets]# for fn in $(ls *.js) ; do echo $fn ; cat $fn | grep 8080 ; done
 index-8SnX15u9.js
 http://bu.yuanyu.zhangmin:8080
 # 将8080改为32100
 [root@nginx assets]# vim index-8SnX15u9.js
 "http://bu.yuanyu.zhangmin:32100",
2)测试验证

测试 web服务发送登录请求会发送的32100端口上,就直接可以访问java服务了

前端访问的时候,发现500错误

复制代码
 # 检查java日志,发现连接不到数据库
 [root@k8s-master cc]# kubectl logs  java-deployment-6d9c668fc5-j9dmm 
 Caused by: java.net.NoRouteToHostException: No route to host
     at java.base/sun.nio.ch.Net.pollConnect(Native Method)
8、java与数据库连接
1)修改java连接数据库的配置文件
复制代码
 [root@nginx assets]# vim ~/pes/java/src/application.properties 
 spring.datasource.url=jdbc:mysql://pesmysql:3306/project_exam_system
 # 浏览器访问后查看java日志
 [root@k8s-master cc]# kubectl logs java-deployment-6d9c668fc5-28lvt 
 Caused by: java.net.UnknownHostException: pesmysql
     at java.base/java.net.InetAddress$CachedAddresses.get(InetAddress.java:801)
     at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1532)
     at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1384)
     at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1305)
     at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:130)
     at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:62)
     ... 16 common frames omitted
2)mysql-service资源清单
复制代码
 apiVersion: v1
 kind: Service
 metadata:
         name: pesmysql
 spec:
         selector:
                 app: mysql-deployment
         type: ClusterIP
         sessionAffinity: None
         sessionAffinityConfig:
                 clientIP:
                         timeoutSeconds: 10800
         ports:
         -       name: mysqlport
                 protocol: TCP
                 port: 3306
                 targetPort: 3306
3)创建service项目
复制代码
 [root@k8s-master cc]# kubectl create -f mysql-service.yaml 
 [root@k8s-master cc]# kubectl get svc
 NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
 javaservice   NodePort    10.96.83.133   <none>        8080:32100/TCP   99m
 kubernetes    ClusterIP   10.96.0.1      <none>        443/TCP          15d
 pesmysql      ClusterIP   10.96.62.94    <none>        3306/TCP         20m
 webservice    NodePort    10.96.126.91   <none>        80:32000/TCP     14h
4)测试验证
复制代码
 [root@k8s-master cc]# kubectl exec -it cluster-test-66bb44bd88-zdfdf -- bash
 (02:16 cluster-test-66bb44bd88-zdfdf:/) nslookup pesmysql
 Server:     10.96.0.10
 Address:    10.96.0.10#53
 ​
 Name:   pesmysql.default.svc.cluster.local
 Address: 10.96.62.94
5)查看数据库数据
复制代码
 MySQL [sys]> use project_exam_system
 MySQL [project_exam_system]> show tables;
 | user                          |
 +-------------------------------+
 MySQL [project_exam_system]> select * from user;
 +-----+--------------+----------+--------+---------------------+----------+---------------------+--------+-------+
 | id  | userName     | password | status | createTime          | createOr | editTime            | editOr | isDel |
 +-----+--------------+----------+--------+---------------------+----------+---------------------+--------+-------+
 |   1 | 21001189     | 111111   |      0 | 2024-08-21 09:45:05 | NULL     | 2024-08-22 14:04:44 | NULL   |     0 |
 |   2 | 21001190     | 111111   |      0 | 2024-08-21 09:45:05 | NULL     | 2024-08-21 01:45:05 | NULL   |     0 |
9、最终测试
复制代码
 [root@k8s-master cc]# ls
 java-deployment.yaml  java-service.yaml  mysql-deployment.yaml  mysql-service.yaml  web-deployment.yaml  web-service.yaml
 [root@k8s-master cc]# kubectl get svc
 NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
 javaservice   NodePort    10.96.44.204   <none>        8080:32100/TCP   5h24m
 kubernetes    ClusterIP   10.96.0.1      <none>        443/TCP          15d
 pesmysql      ClusterIP   10.96.129.65   <none>        3306/TCP         16m
 webservice    NodePort    10.96.144.91   <none>        80:32000/TCP     5h25m
 [root@k8s-master cc]# kubectl get pod
 NAME                                READY   STATUS    RESTARTS      AGE
 cluster-test-66bb44bd88-w7hws       1/1     Running   4 (13m ago)   4h18m
 java-deployment-b7857bbf-2zldq      1/1     Running   0             47m
 java-deployment-b7857bbf-zj564      1/1     Running   0             47m
 mysql-deployment-755cb9cbb6-m6qwn   1/1     Running   0             27m
 web-deployment-7b85c4bc87-454jn     1/1     Running   0             55m
 web-deployment-7b85c4bc87-qbc2m     1/1     Running   0             55m

四、优化1(pv部分)

1、web部分
1)web的pv创建

资源清单

复制代码
 apiVersion: v1
 kind: PersistentVolume
 metadata:
   name: pv-nfs
 spec:
   capacity:
     storage: 7Gi
   volumeMode: Filesystem
   accessModes:
     - ReadWriteOnce
   persistentVolumeReclaimPolicy: Recycle
   storageClassName: nfs-slow
   nfs:
     path: /root/pes/web/src/dist
     server: 10.0.0.99

创建

复制代码
 [root@k8s-master cc]# kubectl create -f pv-nfs.yaml 
 persistentvolume/pv-nfs created
 [root@k8s-master cc]# kubectl get pv
 NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
 pv-nfs   7Gi        RWO            Recycle          Available           nfs-slow                84s
2)web的pvc创建

资源清单

复制代码
 apiVersion: v1
 kind: PersistentVolumeClaim
 metadata:
         name: pvc-nfs
 spec:
         storageClassName: nfs-slow
         accessModes:
         - ReadWriteOnce
         resources:
                 requests:
                         storage: 4Gi

创建

复制代码
 [root@k8s-master cc]# kubectl create -f pvc-nfs.yaml 
 persistentvolumeclaim/pvc-nfs created
 [root@k8s-master cc]# kubectl get pvc
 NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
 pvc-nfs   Bound    pv-nfs   7Gi        RWO            nfs-slow       9s
3)修改deployment资源清单
复制代码
                         volumes:
                         -       name: pesdist
                                 persistentVolumeClaim:
                                         claimName: pvc-nfs

重新创建

复制代码
 [root@k8s-master cc]# kubectl delete -f web-deployment.yaml 
 [root@k8s-master cc]# kubectl create -f web-deployment.yaml 
4)测试
复制代码
 [root@k8s-master cc]# curl 172.16.85.236
 <!DOCTYPE html>
 <html lang="en">
   <head>
     <meta charset="UTF-8">
     <link rel="icon" href="/favicon.ico">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Vite App</title>
     <script type="module" crossorigin src="/assets/index-C4kAShR5.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-CSz7ARPP.css">
   </head>
   <body>
     <div id="app"></div>
   </body>
 </html>
2、java部分
1)java的pv创建

资源清单

复制代码
 apiVersion: v1
 kind: PersistentVolume
 metadata:
   name: java-pv-nfs
 spec:
   capacity:
     storage: 7Gi
   volumeMode: Filesystem
   accessModes:
     - ReadWriteOnce
   persistentVolumeReclaimPolicy: Recycle
   storageClassName: nfs-slow
   nfs:
     path: /root/pes/java/src
     server: 10.0.0.99

创建

复制代码
 [root@k8s-master cc]# kubectl create -f java-pv-nfs.yaml 
2)java的pvc创建

资源清单

复制代码
 apiVersion: v1
 kind: PersistentVolumeClaim
 metadata:
         name: java-pvc-nfs
 spec:
         storageClassName: nfs-slow
         accessModes:
         - ReadWriteOnce
         resources:
                 requests:
                         storage: 4Gi

创建

复制代码
 [root@k8s-master cc]# kubectl create -f java-pvc-nfs.yaml
3)修改deployment资源清单
复制代码
                         volumes:
                         -       name: pesjava
                                 persistentVolumeClaim:
                                         claimName: java-pvc-nfs

重新创建

复制代码
 [root@k8s-master cc]# kubectl delete -f java-deployment.yaml 
 [root@k8s-master cc]# kubectl create -f java-deployment.yaml 
4)测试
复制代码
 [root@k8s-master cc]# curl 172.16.85.243:8080
 {"code":20002,"msg":"账号不存在或密码错误"}[root@k8s-master cc]# 
3、mysql部分
1)mysql的pv创建

资源清单

复制代码
 apiVersion: v1
 kind: PersistentVolume
 metadata:
   name: mysql-pv-nfs
 spec:
   capacity:
     storage: 7Gi
   volumeMode: Filesystem
   accessModes:
     - ReadWriteOnce
   persistentVolumeReclaimPolicy: Recycle
   storageClassName: nfs-slow
   nfs:
     path: /root/pes/mysql/data
     server: 10.0.0.99

创建

复制代码
 [root@k8s-master cc]# kubectl create -f mysql-pv-nfs.yaml
2)mysql的pvc创建

资源清单

复制代码
 apiVersion: v1
 kind: PersistentVolumeClaim
 metadata:
         name: mysql-pvc-nfs
 spec:
         storageClassName: nfs-slow
         accessModes:
         - ReadWriteOnce
         resources:
                 requests:
                         storage: 4Gi

创建

复制代码
 [root@k8s-master cc]# kubectl create -f mysql-pvc-nfs.yaml
3)修改deployment资源清单
复制代码
                         volumes:
                         -       name: localtime
                                 persistentVolumeClaim:
                                         claimName: mysql-pvc-nfs

重新创建

复制代码
 [root@k8s-master cc]# kubectl delete -f mysql-deployment.yaml 
 [root@k8s-master cc]# kubectl create -f mysql-deployment.yaml 
4)测试
复制代码
 [root@k8s-master cc]# mysql -h172.16.85.242 -uzhangmin -pzhangmin
 Welcome to the MariaDB monitor.  Commands end with ; or \g.
 Your MySQL connection id is 2
 Server version: 5.7.44 MySQL Community Server (GPL)
 ​
 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
 ​
 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 ​
 MySQL [(none)]> 
4、最终测试
复制代码
 [root@k8s-master cc]# kubectl get pv
 NAME           CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
 java-pv-nfs    7Gi        RWO            Recycle          Bound    default/java-pvc-nfs    nfs-slow                60m
 mysql-pv-nfs   7Gi        RWO            Recycle          Bound    default/mysql-pvc-nfs   nfs-slow                40m
 pv-nfs         7Gi        RWO            Recycle          Bound    default/pvc-nfs         nfs-slow                74m
 [root@k8s-master cc]# kubectl get pvc
 NAME            STATUS   VOLUME         CAPACITY   ACCESS MODES   STORAGECLASS   AGE
 java-pvc-nfs    Bound    java-pv-nfs    7Gi        RWO            nfs-slow       60m
 mysql-pvc-nfs   Bound    mysql-pv-nfs   7Gi        RWO            nfs-slow       40m
 pvc-nfs         Bound    pv-nfs         7Gi        RWO            nfs-slow       74m

五、优化2(ingress部分)

1、创建web的ingress

资源清单

复制代码
 apiVersion: networking.k8s.io/v1
 kind: Ingress
 metadata:
         name: web-ingress
         namespace: default
 spec:
         ingressClassName: nginx
         rules:
         - host: wp-web.com
           http:
                 paths:
                 - path: /
                   pathType: ImplementationSpecific
                   backend:
                         service:
                                 name: web-service
                                 port:
                                         number: 80

创建

复制代码
 [root@k8s-master cc]# kubectl create -f web-ingress.yaml 
2、最终测试
复制代码
 [root@k8s-master cc]# kubectl get ingress
 NAME          CLASS   HOSTS        ADDRESS   PORTS   AGE
 web-ingress   nginx   wp-web.com             80      20m
相关推荐
儿时可乖了25 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
ruleslol27 分钟前
java基础概念37:正则表达式2-爬虫
java
xmh-sxh-131443 分钟前
jdk各个版本介绍
java
天天扭码1 小时前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶1 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺1 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序1 小时前
vue3 封装request请求
java·前端·typescript·vue
Python私教2 小时前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes