0

当我启动mysql-service和我的应用程序服务(user-service)时,用户服务抛出以下错误。但在码头集装箱中服务工作良好。

com.mysql.cj.jdbc.exceptions。通信异常:通信链路故障

最后一个成功发送到服务器的数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。网址>com.mysql.cj.jdbc.exceptions。SQLError.createCommunicationsException(SQLError.java:175)~[mysql-connector-j-8.0.33.jar!/:8.0.33]网址>com.mysql.cj.jdbc.exceptions。SQLExceptionsMapping.translateException(SQLException Mapping.java:64)~[mysql-connector-j-8.0.33.jar!/:8.0.33]请访问com.mysql.cj.jdbc。ConnectionImpl.createNewIO(ConnectionImple.java:825)~[mysql-connector-j-8.0.33.jar!/:8.0.33]请访问com.mysql.cj.jdbc。连接实施。(ConnectionImpl.java:446)~[mysql-connector-j-8.0.33.jar!/:8.0.33]请访问com.mysql.cj.jdbc。ConnectionImpl.getInstance(ConnectionImple.java:239)~[mysql-connector-j-8.0.33.jar!/:8.0.33]请访问com.mysql.cj.jdbc。非注册驱动程序.connect(NonRegisteringDriver.java:188)~[mysql-connector-j-8.0.33.jar!/:8.0.33]位于com.zaxxer.hikari.util。DriverDataSource.getConnection(DriverDataSource.java:138)~[HikariCP-5.0.1.jar!/:na]在com.zaxxer.hikari.pool。PoolBase.newConnection(PoolBase.java:359)~[HikariCP-5.0.0.1.jar!/:na]在com.zaxxer.hikari.pool。PoolBase.newPoolEntry(PoolBase.java:201)~[HikariCP-5.0.1.jar!/:na]在com.zaxxer.hikari.pool。HikariPool.createPoolEntry(HikariPool.java:470)~[HikariCP-5.0.1.jar!/:na]在com.zaxxer.hikari.pool。HikariPool.checkFailFast(HikariPool.java:561)~[HikariCP-5.0.1.jar!/:na]在com.zaxxer.hikari.pool。HikariPool公司。(HikariPool.java:100)~[HikariCP-5.0.1.jar!/:na]位于com.zaxxer.hikari.HikariDataSource.getConnection(HikariData Source.java:112)~[HikariCP-5.0.1.jar!/:na]在org.hibernate.engine.jdbc.connections.internal上。数据源连接提供者Impl.getConnection(DatasourceConnectionProviderImpl.java:122)~[hibernate-core-6.2.6.Final.jar!/:6.2.6.Final]网址:org.hibernate.engine.jdbc.env.internal。JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess。获取连接(JdbcEnvironmentInitiator.java:316)~[hibernate-core-6.2.6.Final.jar!/:6.2.6.Final]

这是我的配置文件docker-compose.yml公司

版本:“3”服务:mysqldb-docker:图片:mysql:8.0容器名称:mysqldb网络:-app-mysql应用程序环境:-MYSQL_ROOT_PASSWORD=根-MYSQL_DATABASE=航班预订端口:- "3306:3306"卷:- ./数据库:/var/lib/mysql用户服务:图片:用户服务:1.0内部版本:上下文:/用户服务container_name:用户服务端口:- "8081:8080"网络:-app-mysql应用程序依赖(_O):-mysqldb-docker环境:-SPRING_DATASOURCE_DB_HOST=mysqldb-docker-SPRING_DATASOURCE_URL=数据库:mysql://mysqldb-service:3306/flight_booking?createDatabaseIfNotExist=true-SPRING_DATASOURCE_USERNAME=根-SPRING_DATASOURCE_PASSWORD=根#卷卷:mysqldb-docker:网络:app-mysql:

mysqldb-部署.yaml

#mysqldb-部署.yamlapi版本:apps/v1种类:部署元数据:名称:mysqldb-deployment规格:副本:1选择器:匹配标签:应用程序:mysqldb模板:元数据:标签:应用程序:mysqldb规格:容器:-名称:mysqldb图片:mysql:8.0端口:-集装箱港口:3306名称:mysqldb环境:-名称:MYSQL_ROOT_PASSWORD值:root-名称:MYSQL_DATABASE值:flight_booking卷装载:-name:mysqldb-persistent-storage#引用PVC名称装载路径:/var/lib/mysql卷:-name:mysqldb-persistent-storage#定义卷名persistentVolume索赔:claimName:mysqldb-pvc#引用您之前创建的pvc名称

mysqldb-service.yaml

api版本:v1种类:服务元数据:名称:mysqldb-service规格:选择器:应用程序:mysqldb端口:-端口:3306

mysqldb-pv.yaml

apiVersion版本:v1种类:持久卷元数据:名称:mysqldb-pv规格:容量:storage:5Gi#设置所需的存储大小访问模式:-ReadWriteOnce#根据您的用例进行调整persistentVolumeReclaimPolicy:保留storageClassName:standard#设置适当的存储类主机路径:path:/path/to/host/mysqldb-data#将主机路径调整到所需位置

mysqldb-pvc.yaml

api版本:v1kind:PersistentVolumeClaim(永久卷声明)元数据:名称:mysqldb-pvc规格:访问模式:-ReadWriteOnce#必须与PV中的访问模式匹配资源:请求:存储:5Gi#必须与PV中的存储大小匹配

用户服务部署.yaml

api版本:apps/v1种类:部署元数据:name:用户服务部署规格:replicas:1#设置所需的副本数量选择器:匹配标签:应用程序:用户服务模板:元数据:标签:应用程序:用户服务规格:容器:-名称:用户服务图片:sweetyrv/flight_booking:用户服务图像拉动策略:IfNotPresent端口:-集装箱港口:8081环境:-名称:MYSQL_DATABASE值:飞行预订-名称:MYSQL_ROOT_PASSWORD值:root-名称:SPRING_DATASOURCE_DB_HOST值:mysqldb-service-名称:SPRING_DATASOURCE_URL值:jdbc:mysql://mysqldb-service:3306/flight_booking?createDatabaseIfNotExist=true-名称:SPRING_DATASOURCE_USERNAME值:根-名称:SPRING_DATASOURCE_PASSWORD值:root

用户服务.yaml

api版本:v1种类:服务元数据:名称:user-service规格:选择器:应用程序:用户服务端口:-协议:TCP端口:8081目标端口:8081

我尝试过检查网络策略、主机名解析,甚至MySQL服务器配置。这种配置在Docker设置中有效,但在Kubernetes中无效,这一事实令人困惑。

如果您能提供任何关于导致此问题的原因以及解决方法的见解,我将不胜感激。如果您需要任何其他详细信息,请告诉我。谢谢您!

1
  • 数据库实际启动了吗?(确实如此库贝特尔拿到吊舱说它在里面正在运行状态?)我觉得手动PersistentVolume/Claim有问题;我通常希望数据库使用StatefulSet,它将自动创建PVC,而集群将自动创建底层PV。在我看来,URL/Service/Pod的连接是正确的,假设所有这些部分都在同一名称空间中。 评论 2023年10月31日19:35

1答案1

重置为默认值
1

这可能是由于您试图使用主机名从服务连接到数据库造成的,请点击此处:

环境:-名称:SPRING_DATASOURCE_DB_HOST值:mysqldb-service-名称:SPRING_DATASOURCE_URL值:jdbc:mysql://mysqldb-service:3306/flight_booking?createDatabaseIfNotExist=true-名称:SPRING_DATASOURCE_USERNAME

它应该切换到kubernetes地址,因此mysqldb服务可能mysqldb-service.default.svc.cluster本地(假设您使用违约命名空间和群集.本地作为群集域,因此:

环境:-名称:SPRING_DATASOURCE_DB_HOST值:mysqldb-service.default.svc.cluster.local-名称:SPRING_DATASOURCE_URL值:jdbc:mysql://mysqldb-service.default.svc.cluster.local:3306/flight_booking?createDatabaseIfNotExist=true-名称:SPRING_DATASOURCE_USERNAME

集群地址的模式是服务名称。名称牌。SVC。集群_DOMAIN,因此您可能需要使用不同的值NAMESPACE公司和/或集群域

1
  • 这不应该有什么区别:只要Pods和Services位于同一命名空间中.namespace.svc.cluster本地将被注入到默认的DNS搜索路径中。 评论 2023年10月31日19:30

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.