使用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.com26 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 ~]# lspes
6)启动nfs服务
[root@nginx ~]# systemctl start rpcbind nfs-server
7)测试验证
[root@k8s-master ~]# showmount -e 10.0.0.99Export list for 10.0.0.99:/root/pes *
2、前端web实现
nginx:latest,使用nfs挂载
1)编写deployment清单
apiVersion: apps/v1kind: Deploymentmetadata:name: web-deploymentnamespace: defaultlabels:app: web-deploymentspec:selector:matchLabels:app: web-deploymentreplicas: 3strategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: web-deploymentspec:containers:- name: nginximage: docker.io/library/nginx:latestimagePullPolicy: Neverresources:requests:cpu: 100mmemory: 100Milimits:cpu: 100mmemory: 100Miports:- containerPort: 80volumeMounts:- name: pesdistmountPath: /usr/share/nginx/htmlvolumes:- name: pesdistnfs:server: 10.0.0.99path: /root/pes/web/src/distrestartPolicy: Always
2)创建deployment项目
[root@k8s-master cc]# kubectl create -f web-deployment.yaml deployment.apps/web-deployment created[root@k8s-master cc]# kubectl get podNAME READY STATUS RESTARTS AGEcluster-test-66bb44bd88-zdfdf 1/1 Running 32 (54m ago) 13dweb-deployment-7fd7479d49-6x4nn 1/1 Running 0 8sweb-deployment-7fd7479d49-bxdp9 1/1 Running 0 8sweb-deployment-7fd7479d49-xhjwb 1/1 Running 0 8s
3)测试验证
[root@k8s-master cc]# kubectl get pod -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScluster-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]# lsDockerfile jdk src start.sh[root@nginx java]# docker build -t java:v1 .[root@nginx java]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEjava v1 5dc6610d8a6c 18 hours ago 592MB
2)镜像打包发送到两个节点
[root@nginx ~]# docker save -o java.tar java:v1[root@nginx ~]# lsjava.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 imagesIMAGE TAG IMAGE ID SIZEdocker.io/library/java v1 5dc6610d8a6cc 599MB[root@k8s-node02 ~]# ctr -n k8s.io images import java.tar --platform=linux/amd64[root@k8s-node02 ~]# crictl imagesIMAGE TAG IMAGE ID SIZEdocker.io/library/java v1 5dc6610d8a6cc 599MB
4)创建资源清单
apiVersion: apps/v1kind: Deploymentmetadata:name: java-deploymentnamespace: defaultlabels:app: java-deploymentspec:selector:matchLabels:app: java-deploymentreplicas: 3strategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: java-deploymentspec:containers:- name: javaimage: docker.io/library/java:v1imagePullPolicy: Neverresources:requests:cpu: 100mmemory: 100Milimits:cpu: 100mmemory: 100Miports:- containerPort: 8080volumeMounts:- name: pesjavamountPath: /java/srcvolumes:- name: pesjavanfs:server: 10.0.0.99path: /root/pes/java/srcrestartPolicy: Always
5)创建deployment项目
[root@k8s-master cc]# kubectl create -f java-deployment.yaml deployment.apps/java-deployment created[root@k8s-master cc]# kubectl get podNAME READY STATUS RESTARTS AGEcluster-test-66bb44bd88-zdfdf 1/1 Running 33 (45m ago) 13djava-deployment-7b9f747b8d-9cpsw 1/1 Running 0 7sjava-deployment-7b9f747b8d-j6l22 1/1 Running 0 7sjava-deployment-7b9f747b8d-t4cvb 1/1 Running 0 7sweb-deployment-7fd7479d49-6x4nn 1/1 Running 0 51mweb-deployment-7fd7479d49-bxdp9 1/1 Running 0 51mweb-deployment-7fd7479d49-xhjwb 1/1 Running 0 51m
6)测试验证(出现问题)
“OOMKilled” 是一种在容器化环境或某些操作系统中常见的状态,表示 “Out Of Memory Killed”,即由于内存不足而被终止。
不断重启
[root@k8s-master cc]# kubectl get po -o wide -wNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScluster-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: 100mmemory: 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 GATEScluster-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 mysqldocker.io/library/mysql 5.7.44 5107333e08a87 520MB[root@k8s-node02 ~]# crictl images | grep mysqldocker.io/library/mysql 5.7.44 5107333e08a87 520MB
2)创建资源清单
apiVersion: apps/v1kind: Deploymentmetadata:name: mysql-deploymentlabels:app: mysql-deploymentspec:replicas: 1selector:matchLabels:app: mysql-deploymenttemplate:metadata:labels:app: mysql-deploymentspec:containers:- name: mysqlimage: docker.io/library/mysql:5.7.44imagePullPolicy: Neverresources:requests:cpu: 100mmemory: 100Milimits:cpu: 100mmemory: 200Miports:- name: mysqlportcontainerPort: 3306volumeMounts:- name: localtimemountPath: /var/lib/mysqlvolumes:- name: localtimenfs:server: 10.0.0.99path: /root/pes/mysql/datarestartPolicy: 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 podNAME READY STATUS RESTARTS AGEmysql-deployment-569c465d84-lrp2j 0/1 OOMKilled 2 (18s ago) 30s
修改资源清单(内存不够,扩大使用内存)
resources:requests:cpu: 100mmemory: 100Milimits:cpu: 100mmemory: 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 wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESmysql-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 deniedfind: '/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 wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScluster-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' -uzhangminWelcome to the MariaDB monitor. Commands end with ; or \g.Your MySQL connection id is 4Server 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: v1kind: Servicemetadata:name: webservicespec:selector:app: web-deploymentports:- name: webportport: 80targetPort: 80nodePort: 32000protocol: TCPtype: NodePort
2)创建service项目
[root@k8s-master cc]# kubectl create -f web-service.yaml service/webservice created[root@k8s-master cc]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15dwebservice 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: v1kind: Servicemetadata:name: javaservicespec:selector:app: java-deploymenttype: NodePortsessionAffinity: NonesessionAffinityConfig:clientIP:timeoutSeconds: 10800ports:- name: javaportprotocol: TCPport: 8080targetPort: 8080nodePort: 32100
2)创建service项目
[root@k8s-master cc]# kubectl create -f java-service.yaml [root@k8s-master cc]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEjavaservice NodePort 10.96.83.133 <none> 8080:32100/TCP 12mkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15dwebservice 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 ; doneAdminView-yX0Ltz_1.jsCategoryView-Ca4t3JNT.js......[root@nginx assets]# for fn in $(ls *.js) ; do echo $fn ; cat $fn | grep 8080 ; doneindex-8SnX15u9.jshttp://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 hostat 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: pesmysqlat 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: v1kind: Servicemetadata:name: pesmysqlspec:selector:app: mysql-deploymenttype: ClusterIPsessionAffinity: NonesessionAffinityConfig:clientIP:timeoutSeconds: 10800ports:- name: mysqlportprotocol: TCPport: 3306targetPort: 3306
3)创建service项目
[root@k8s-master cc]# kubectl create -f mysql-service.yaml [root@k8s-master cc]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEjavaservice NodePort 10.96.83.133 <none> 8080:32100/TCP 99mkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15dpesmysql ClusterIP 10.96.62.94 <none> 3306/TCP 20mwebservice 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 pesmysqlServer: 10.96.0.10Address: 10.96.0.10#53Name: pesmysql.default.svc.cluster.localAddress: 10.96.62.94

5)查看数据库数据
MySQL [sys]> use project_exam_systemMySQL [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]# lsjava-deployment.yaml java-service.yaml mysql-deployment.yaml mysql-service.yaml web-deployment.yaml web-service.yaml[root@k8s-master cc]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEjavaservice NodePort 10.96.44.204 <none> 8080:32100/TCP 5h24mkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15dpesmysql ClusterIP 10.96.129.65 <none> 3306/TCP 16mwebservice NodePort 10.96.144.91 <none> 80:32000/TCP 5h25m[root@k8s-master cc]# kubectl get podNAME READY STATUS RESTARTS AGEcluster-test-66bb44bd88-w7hws 1/1 Running 4 (13m ago) 4h18mjava-deployment-b7857bbf-2zldq 1/1 Running 0 47mjava-deployment-b7857bbf-zj564 1/1 Running 0 47mmysql-deployment-755cb9cbb6-m6qwn 1/1 Running 0 27mweb-deployment-7b85c4bc87-454jn 1/1 Running 0 55mweb-deployment-7b85c4bc87-qbc2m 1/1 Running 0 55m
四、优化1(pv部分)
1、web部分
1)web的pv创建
资源清单
apiVersion: v1kind: PersistentVolumemetadata:name: pv-nfsspec:capacity:storage: 7GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: nfs-slownfs:path: /root/pes/web/src/distserver: 10.0.0.99
创建
[root@k8s-master cc]# kubectl create -f pv-nfs.yaml persistentvolume/pv-nfs created[root@k8s-master cc]# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv-nfs 7Gi RWO Recycle Available nfs-slow 84s
2)web的pvc创建
资源清单
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: pvc-nfsspec:storageClassName: nfs-slowaccessModes:- ReadWriteOnceresources:requests:storage: 4Gi
创建
[root@k8s-master cc]# kubectl create -f pvc-nfs.yaml persistentvolumeclaim/pvc-nfs created[root@k8s-master cc]# kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEpvc-nfs Bound pv-nfs 7Gi RWO nfs-slow 9s
3)修改deployment资源清单
volumes:- name: pesdistpersistentVolumeClaim: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: v1kind: PersistentVolumemetadata:name: java-pv-nfsspec:capacity:storage: 7GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: nfs-slownfs:path: /root/pes/java/srcserver: 10.0.0.99
创建
[root@k8s-master cc]# kubectl create -f java-pv-nfs.yaml
2)java的pvc创建
资源清单
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: java-pvc-nfsspec:storageClassName: nfs-slowaccessModes:- ReadWriteOnceresources:requests:storage: 4Gi
创建
[root@k8s-master cc]# kubectl create -f java-pvc-nfs.yaml
3)修改deployment资源清单
volumes:- name: pesjavapersistentVolumeClaim: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: v1kind: PersistentVolumemetadata:name: mysql-pv-nfsspec:capacity:storage: 7GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: nfs-slownfs:path: /root/pes/mysql/dataserver: 10.0.0.99
创建
[root@k8s-master cc]# kubectl create -f mysql-pv-nfs.yaml
2)mysql的pvc创建
资源清单
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: mysql-pvc-nfsspec:storageClassName: nfs-slowaccessModes:- ReadWriteOnceresources:requests:storage: 4Gi
创建
[root@k8s-master cc]# kubectl create -f mysql-pvc-nfs.yaml
3)修改deployment资源清单
volumes:- name: localtimepersistentVolumeClaim: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 -pzhangminWelcome to the MariaDB monitor. Commands end with ; or \g.Your MySQL connection id is 2Server 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 pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEjava-pv-nfs 7Gi RWO Recycle Bound default/java-pvc-nfs nfs-slow 60mmysql-pv-nfs 7Gi RWO Recycle Bound default/mysql-pvc-nfs nfs-slow 40mpv-nfs 7Gi RWO Recycle Bound default/pvc-nfs nfs-slow 74m[root@k8s-master cc]# kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEjava-pvc-nfs Bound java-pv-nfs 7Gi RWO nfs-slow 60mmysql-pvc-nfs Bound mysql-pv-nfs 7Gi RWO nfs-slow 40mpvc-nfs Bound pv-nfs 7Gi RWO nfs-slow 74m
五、优化2(ingress部分)
1、创建web的ingress
资源清单
apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: web-ingressnamespace: defaultspec:ingressClassName: nginxrules:- host: wp-web.comhttp:paths:- path: /pathType: ImplementationSpecificbackend:service:name: web-serviceport:number: 80
创建
[root@k8s-master cc]# kubectl create -f web-ingress.yaml
2、最终测试

[root@k8s-master cc]# kubectl get ingressNAME CLASS HOSTS ADDRESS PORTS AGEweb-ingress nginx wp-web.com 80 20m
相关文章:
使用k8s部署java前后端服务
一、项目架构 前端、后端、数据库 1)前端 静态的资源:img css html js文件 js:axios、ajax 2)后端 提供数据:根据web前端发送的请求,从数据库中获取数据 请求都是无状态的,如何保持会话 …...
使用docker创建zabbix服务器
首先保证服务器已正常安装docker,然后执行下面这几个容器创建命令: #创建MySQL容器 docker run --name mysql-server -t --restartunless-stopped -e MYSQL_DATABASE"zabbix" -e MYSQL_USER"zabbix" -e MYSQL_PASSWORD"zabbix_…...
nodejs 016: javascript语法——解构赋值({ a, b, c } = {})=>{console.log(“Hello“);}
在 JavaScript 中,函数参数 { a, b, c } {} 的含义是在函数定义时提供一个默认的对象参数。这个对象包含了三个可选的属性 a, b, 和 c。如果没有传递参数或者传递的参数是一个非对象类型的值,那么函数内部将使用一个空对象 {} 作为参数。 示例 const …...
【人人都能看懂的大模型原理】(一)
前言 当前大模型的学习资源呈现爆发趋势,各种角色的人都用自己的视角参与到大模型的讨论。但是我发现这些学习资源都有几个特点:只摆事实而不讲道理;只讲应用可能而不提实现代价;只讲可能性而缺乏实操经验分享;洞察材…...
JMeter源码解析之JMeter命令行新增命令
JMeter源码解析之JMeter命令行新增命令 需求描述 需要新增一条命令,能够在JMeter命令行中能够展示输入对应的JMeter命令,能够展示对应的命令信息 查看命令效果如下: apache-jmeter-5.1\bin>jmeter --? Copyright © 1999-2024 The …...
YOLOv8 Windows c++推理
#添加一个**yolov8\_。onx **和/或**yolov5\_。Onnx **模型(s)到ultralytics文件夹。 #编辑**main.cpp**来改变**projectBasePath**来匹配你的用户。#请注意,默认情况下,CMake文件将尝试导入CUDA库以与opencv dnn (cuDNN) GPU推理一起使用。 #如果你的Op…...
一文读懂Python中的Popen函数
目录 1. 基本知识2. Demo 1. 基本知识 在Python中,Popen 是 subprocess 模块中的一个函数,它用于创建一个子进程并与其进行通信 subprocess.Popen():Popen 类用于创建和管理子进程 与 os.system() 或 os.popen() 相比,Popen 提供…...
07-阿里云镜像仓库
07-阿里云镜像仓库 注册阿里云 先注册一个阿里云账号:https://www.aliyun.com/ 进入容器镜像服务控制台 工作台》容器》容器服务》容器镜像服务 实例列表》个人实例 仓库管理》镜像仓库》命名空间》创建命名空间 仓库管理》镜像仓库》镜像仓库》创建镜像仓库 使…...
net core mvc 数据绑定 《2》
mvc core 模型绑定 控制绑定名称 》》》Bind 属性可以用来指定 模型应该 绑定的前缀 public class MyController : Controller {[HttpPost]public ActionResult Create([Bind(Prefix "MyModel")] Ilist<MyModel> model){// 模型绑定将尝试从请求的表单数据中…...
文件服务器FastDFS 消息队列中间件RabbitMQ
新标签页 (chinaunix.net) FastDFS - Browse Files at SourceForge.net 一、FastDFS Tracker和Storage: tracker用来管理所有的storage,只是管理服务器,负责负载均衡。 storage是存储服务器,每一个storage服务器都是一个单独的个…...
工作纪实58-Idea打jar包
有时候需要配合算法使用spark定时DP,调用java相关的jar包做数据处理 idea打jar包有以下三种场景 SpringBoot的Maven项目【Maven打包即可】非SpringBoot的Maven项目【添加maven打包参数,使用Maven打包】 借助maven的配置进行打包,新增以下配置…...
ELK-03-skywalking监控linux系统
文章目录 前言一、下载node_exporter二、启动node_exporter三、下载OpenTelemetry Collector四、启动OpenTelemetry Collector4.1 将配置文件下载到同级目录4.2 启动 五、查看总结 前言 skywalking安装完成后,开始我们的第一个监控-监控linux系统。 参考官方文档&a…...
HEITRONICS TC13红外辐射高温计CT13 INFRARED RADIATION PYROMETER CT13
HEITRONICS TC13红外辐射高温计CT13 INFRARED RADIATION PYROMETER CT13...
开源图像降噪算法与项目介绍【持续更新】
Intel Open Image Denoise 介绍:Intel Open Image Denoise(OIDN)是一个开源库,它提供了一系列高性能、高质量的去噪滤镜,专门用于光线追踪渲染的图像。这个库是Intel Rendering Toolkit的一部分,并且是在宽…...
RealSense、ZED 和奥比中光Astra几款主流相机介绍及应用
以下是英特尔 RealSense、Stereolabs ZED 和奥比中光Astra几款相机的详细对比,包括参数、性能以及二次开发等支持,附带代码示例。 详细信息对比和二次开发示例 1. 英特尔 RealSense (例如 D435/D455) 深度技术:立体视觉 红外投影分辨率&a…...
启动 Ntopng 服务前需先启动 redis 服务及 Ntopng 常用参数介绍
启动Ntopng服务之前需要先启动redis服务,因为Ntopng服务依赖于redis服务的键值存储。 服务重启 服务启动 Ntopng常用参数: -d 将 Ntopng 进程放入后台执行。默认情况下,Ntop 在前台运行。 -u 指定启动Ntopng执行的用户,默认为…...
vector的模拟实现以及oj题(2)
前言 上篇博客介绍了大部分vector的接口,其中包括begin()、end()、const begin()、 const end()、size、capacity、reserve、empty、push_back、pop_back、insert、operator[],这篇博客将介绍剩下的部分接口,以及一些oj题解法和思路。 vect…...
数据技术进化史:从数据仓库到数据中台再到数据飞轮的旅程
随着大数据时代的到来,数据已经成为企业的核心资产之一。在过去几十年间,数据技术也随之不断演进,从早期的数据仓库到近年来热门的数据中台,再到正在快速发展的数据飞轮概念,每一步都是技术革新的体现。 一、数据仓库&…...
JAVA JDK华为云镜像下载,速度很快
直达下载地址 https://repo.huaweicloud.com/java/jdk/ https://repo.huaweicloud.com/java/jdk/欢迎各位收藏享用!!!...
【RKNN系列】官方函数:querystring
querystring 函数 功能 查询获取当前芯片平台RGA硬件版本与功能支持信息,以字符串的形式返回。 语法 std::string querystring(int query_type);参数 query_type: 要查询的 RGA 信息类型(整数) 描述 这个函数用于获取特定类型的 RGA 信…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
