【问题标题】:Access internal database in cluster with local application使用本地应用程序访问集群中的内部数据库
【发布时间】: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


【解决方案1】:

我通过端口转发解决它:kubectl port-forward &lt;pod-name&gt; 3306:3306 -n default

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2023-03-20
    • 2021-04-17
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多