如何解决K8s Spring 应用无法连接Mysql DB
我想尝试在 kubernetes 上部署我的 Spring Boot 应用程序。我使用 microk8s(dns、storage、ingress enabled)设置了一个测试环境,它由一个运行应用程序本身的 pod 和一个带有 MysqL 数据库的 pod 组成。每个 pod 都有自己的服务,并在相同的默认命名空间上运行。 yaml 文件可以在下面看到:
apiVersion: apps/v1
kind: Deployment
Metadata:
name: myapp-deployment
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
Metadata:
labels:
app: myapp
spec:
containers:
- name: test-app
image: myImage
ports:
- containerPort: 8080
imagePullPolicy: Always
env:
- name: SPRING_APPLICATION_JSON
valueFrom:
configMapKeyRef:
name: spring-config
key: app-config.json
应用服务:
apiVersion: v1
kind: Service
Metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- port: 8080
targetPort: 8080
MysqL 部署:
apiVersion: apps/v1
kind: Deployment
Metadata:
name: MysqL-server
labels:
# app: MysqL
app: MysqL
spec:
replicas: 1
selector:
matchLabels:
app: MysqL
template:
Metadata:
labels:
app: MysqL
spec:
volumes:
- name: MysqL-persistent-volume-storage
persistentVolumeClaim:
claimName: MysqL-pvc-claim
containers:
- name: MysqL
image: MysqL
volumeMounts:
- name: MysqL-persistent-volume-storage
mountPath: /var/lib/MysqL
subPath: MysqL-server
env:
- name: MysqL_ROOT_PASSWORD
value: pass_root
- name: MysqL_USER
value: user
- name: MysqL_PASSWORD
value: pass
- name: MysqL_DATABASE
value: test
ports:
- containerPort: 3306
MysqL 服务:
apiVersion: v1
kind: Service
Metadata:
name: db-service
spec:
selector:
app: MysqL
ports:
- port: 3306
targetPort: 3306
com.MysqL.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at com.MysqL.cj.jdbc.exceptions.sqlError.createCommunicationsException(sqlError.java:174) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
at com.MysqL.cj.jdbc.exceptions.sqlExceptionsMapping.translateException(sqlExceptionsMapping.java:64) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
at com.MysqL.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:833) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
at com.MysqL.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:453) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
at com.MysqL.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
at com.MysqL.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:121) ~[HikariCP-4.0.3.jar!/:na]
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar!/:na]
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar!/:na]
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar!/:na]
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar!/:na]
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar!/:na]
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar!/:na]
.......
application.yml:
db:
datasource:
url: jdbc:MysqL://ip/test
user: user
password: pass
---
spring:
datasource:
url: ${db.datasource.url}
username: ${db.datasource.user}
password: ${db.datasource.password}
driver-class-name: com.MysqL.cj.jdbc.Driver
jpa:
database-platform: org.hibernate.dialect.MysqLDialect
mvc:
view:
suffix: .html
thymeleaf:
cache: false
allowPublicKeyRetrieval: true
hibernate:
show_sql: true
logging:
level:
org:
hibernate:
sql: debug
我尝试从运行 MysqL 的命名空间上的另一个 pod 访问该服务,因为它预先安装了 MysqL-client,并从主机访问。两者都可以访问数据库。我还在运行该应用程序的 pod 上 ping 通。它发现该服务没有任何问题。
然后我尝试使用 NodePort 而不是 ClusterIP。什么都没有改变。
我确保凭据正确。
最后,我尝试在 application.yml 中删除和添加端口。
我完全被卡住了,我不知道是什么问题。任何帮助将不胜感激。
解决方法
我发现您的配置中有两个问题:您的 mysql 部署中的用户名/密码与您的 application.yaml 中的值不匹配。
另一个是你使用了一个 spring boot 默认不使用的属性,我假设你没有特殊的逻辑来处理:“spring.data.url”应该是“spring.datasource.url”。
注意它应该是 "spring.datasource.username" ,而不是 "user" 。
在 YAML 中参考您的“db”部分:一般而言,我不建议为数据库凭据设置单独的部分并使用变量引用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。