当前位置: 首页 > 知识库问答 >
问题:

K8s Spring应用程序无法连接到Mysql数据库

司徒良哲
2023-03-14
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
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
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:
  data:
    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上tring ping。它发现服务有任何问题。

然后我尝试使用NodePort而不是ClusterIP。什么都没变。

我完全卡住了,不知道出了什么问题。如有任何帮助,不胜感激。

共有1个答案

东郭骁
2023-03-14

我发现您的配置中有两个问题:mysql部署中的用户名/密码与Application.yaml中的值不匹配。

另一个是使用spring boot默认情况下不使用的属性,我假设您没有特殊的逻辑来处理它:“spring.data.url”应该是“spring.datasource.url”。

注意,它应该是“spring.datasource.username”,而不是“user”。

 类似资料:
  • 我在将 rails 2.3.5 应用程序连接到远程数据库时遇到问题。 在我的数据库.yml中,我有: 我得到的错误是: 无法通过套接字连接到本地 MySQL 服务器 (2) 我知道问题不在权限或用户设置上,因为当我使用相同的mysqlgem运行一个简单的ruby脚本时,它会起作用。此外,我的python脚本可以连接,我可以通过CLI与连接 我似乎无法让rails使用192.168.1.113而不是

  • 我想做的是,从我的spring boot应用程序连接到Docker中的mysql数据库。每个都在各自的容器中。 但是我一定有什么问题,因为我做不到。 为了保持简单: 应用程序属性: MySQL的docker组合: 很简单,对吧?数据库我从开始: 到目前为止,一切似乎都很顺利。 现在我已经启动了db,对于应用程序来说,这是它的docker组件。yml: 对于它的Dockerfile,我使用Linux

  • 我已经在一个实例中安装了opsmanager数据库,并在其他实例中安装了应用程序 > 在应用程序数据库服务器中,i时显示127.0.0.1:27017运行mongod 当我用sudo服务mongodb-mms启动时,会出现以下错误 uri=mongoDb://db_instance_publicip:27017/?maxpoolsize=150}错误:在等待连接时超时30000 ms后.....

  • 我的grails 2.1.0应用程序是在cloudfoundry中部署和运行的,使用mysql服务,昨天我做了一些更改,更新后无法再次运行。我没有对数据源进行任何更改。 通过查看tomcat日志,看起来数据库设置在部署时没有被覆盖,如文档中所述,并且存在一个异常消息“无法为连接URL“JDBC:h2:prodDb;MVCC=TRUE”创建类为“com.mysql.JDBC.driver”的JDBC

  • 问题内容: 我正在研究将由学校使用的应用程序。每所学校将建立自己的数据库。每个学校都会为应用程序提供自己的“设置”文件。设置文件将包含创建设置文件的特定学校的数据库URL。这样一来,使用该应用程序的学生如果想连接到其他数据库,就只能加载其他设置文件。 我的问题是,如何保护用于连接数据库的用户名和密码?因此,只有应用程序具有对数据库的读写访问权限。应用程序仅具有该特定学校的读写权限吗? 如果您需要更

  • 问题内容: 我已经在尝试 开发的JSF Web应用程序中连接到数据库。使用Windows 7,NetBeans 6.9.1,SQLServer 2008,Glassfish 3.3。 我正在使用从 成功连接到SQLServer 2005的XP系统复制的sqljdbc4.jar驱动程序 。 我已验证SQLServer 2008在我的系统上运行,并且可以 使用要在应用程序中 使用的用户名和 密码通过S