【发布时间】:2022-01-16 23:29:29
【问题描述】:
我尝试将本地 Spring Boot 应用程序与 k8-cluster 中的内部 mysql-db 连接。 我在docker桌面本地使用了k8集群。
我的部署.yml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kazi-db
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql/mysql-server:8.0
name: mysql
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: kazi-db-secret
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
- name: mysql-initdb
configMap:
name: kazi-initdb
我的 service.yml:
apiVersion: v1
kind: Service
metadata:
name: kazi-db
spec:
ports:
- port: 3306
selector:
app: kazi-db
type: LoadBalancer
服务说明:
kubectl get services kazi-db
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kazi-db LoadBalancer 10.107.75.107 localhost 3306:31627/TCP 3d
我的 spring-boot application.yml
## JDBC part
spring:
config:
activate:
on-profile: local
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/kazi?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username: emo
password: 123qwe
jpa:
show-sql: true
database-platform: org.hibernate.dialect.MySQL8Dialect
hibernate:
ddl-auto: update
liquibase:
change-log: classpath:liquibase/changelog.xml
我使用 localhost 是因为 k8 有一个 localhost 作为 externalIp 定义的。
kubectl describe services kazi-db
Name: kazi-db
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=kazi-db
Type: LoadBalancer
IP Families: <none>
IP: 10.107.75.107
IPs: <none>
LoadBalancer Ingress: localhost
Port: <unset> 3306/TCP
TargetPort: 3306/TCP
NodePort: <unset> 31627/TCP
Endpoints: <none>
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Type 10m service-controller ClusterIP -> LoadBalancer
我也有一个本地 mysql-db,我可以毫无问题地连接应用程序。
我可以使用kubectl exec -it kazi-db-554bd6d787-2gb88 -- /bin/bash 连接到 db-cluster 并创建一些表,但应用程序不能。
当我启动 spring-boot 应用程序时:
java.sql.SQLSyntaxErrorException: Unknown database 'kazi'
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.18.jar:8.0.18]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.18.jar:8.0.18]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.18.jar:8.0.18]
虽然 db kazi 存在于 db-cluster 中。
但是我必须如何连接到内部 k8 集群数据库?
我正在使用 docker desktop v20.10.11 和 k8s v1.22.4。我也用minikube version: v1.24.0 试过了。两者中,我有同样的问题。
【问题讨论】:
-
Unknown database 'kazi'- 在您尝试连接的 mysql 实例中没有这样的数据库? -
问题不在于数据库,而在于连接。数据库存在于mysql集群k8中,但是如何将本地spring boot与k8集群中的mysql连接起来。
-
等一下,把数据源从url:jdbc:mysql://
localhost:3306改成url:jdbc:mysql://localhost:31627 -
@gohm'c 完成但
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure -
使用此命令获取 minikube IP 和服务 NodePort:
minikube service --url kazi-db。然后把数据源改成这个url。
标签: spring-boot kubernetes minikube