Spring 通过 VPC 对等连接到 RDS 时启动 UnknownHostException
Spring Boot UnknownHostException while connecting to RDS throgh VPC peering
我在尝试将 Spring Boot 应用程序部署到 K8s 时收到 UnknownHostException AWS EKS.
中的集群
场景:
- 我在 VPC (A) 上有一个 AWS EKS 集群 运行,RDS 在 VPC (B) 上 运行。
- 我已经在两个 VPC 之间创建了 VPC 对等连接,启用 DNS 解析并相应地配置路由表。
- 我还创建了一个映射外部 RDS 端点的 K8s 服务。
如果我尝试使用这样的 busybox 从 EKS 集群 连接到 RDS 实例:
$ kubectl run -i --tty --rm debug --image=busybox --restart=Never -- sh
使用以下任一选项,有效:
/ # nc mysql-service 3306
/ # nc mysql-service.default.svc.cluster.local 3306
/ # nc xxxxxxx.xxxxxxx.us-east-1.rds.amazonaws.com 3306
但是当我部署我的 Spring 引导应用程序时它不起作用。
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:54)
at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:93)
at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:133)
at com.mysql.cj.core.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:149)
at com.mysql.cj.mysqla.io.MysqlaSocketConnection.connect(MysqlaSocketConnection.java:83)
at com.mysql.cj.mysqla.MysqlaSession.connect(MysqlaSession.java:144)
at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:1676)
... 58 common frames omitted
Caused by: java.net.UnknownHostException: mysql-service
有什么建议吗?
谢谢!
我想通了!整个 VPC 对等配置正在运行。 K8s 外部服务也正常工作。问题出在我的 Spring 引导应用程序中。
我用导致错误的环境变量配置了数据源 URL。出于某种原因,Spring 没有解析配置了环境变量的主机。
我刚刚更改了 spring 配置:
spring:
datasource:
url: jdbc:mysql://${DB_HOST}:3306/db_name
至:
spring:
datasource:
url: jdbc:mysql://mysql-service:3306/db_name
现在可以使用了!
我在尝试将 Spring Boot 应用程序部署到 K8s 时收到 UnknownHostException AWS EKS.
中的集群场景:
- 我在 VPC (A) 上有一个 AWS EKS 集群 运行,RDS 在 VPC (B) 上 运行。
- 我已经在两个 VPC 之间创建了 VPC 对等连接,启用 DNS 解析并相应地配置路由表。
- 我还创建了一个映射外部 RDS 端点的 K8s 服务。
如果我尝试使用这样的 busybox 从 EKS 集群 连接到 RDS 实例:
$ kubectl run -i --tty --rm debug --image=busybox --restart=Never -- sh
使用以下任一选项,有效:
/ # nc mysql-service 3306
/ # nc mysql-service.default.svc.cluster.local 3306
/ # nc xxxxxxx.xxxxxxx.us-east-1.rds.amazonaws.com 3306
但是当我部署我的 Spring 引导应用程序时它不起作用。
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:54)
at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:93)
at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:133)
at com.mysql.cj.core.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:149)
at com.mysql.cj.mysqla.io.MysqlaSocketConnection.connect(MysqlaSocketConnection.java:83)
at com.mysql.cj.mysqla.MysqlaSession.connect(MysqlaSession.java:144)
at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:1676)
... 58 common frames omitted
Caused by: java.net.UnknownHostException: mysql-service
有什么建议吗?
谢谢!
我想通了!整个 VPC 对等配置正在运行。 K8s 外部服务也正常工作。问题出在我的 Spring 引导应用程序中。
我用导致错误的环境变量配置了数据源 URL。出于某种原因,Spring 没有解析配置了环境变量的主机。
我刚刚更改了 spring 配置:
spring:
datasource:
url: jdbc:mysql://${DB_HOST}:3306/db_name
至:
spring:
datasource:
url: jdbc:mysql://mysql-service:3306/db_name
现在可以使用了!