通过VPC对等连接到RDS时出现Spring Boot UnknownHostException

2020年5月15日 39点热度 0条评论

我在尝试将Spring Boot应用程序部署到AWS EKS中的K8s集群时遇到UnknownHostException。

场景:

我有一个在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 Boot应用程序时,它不起作用。

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对等配置正在运行。 K8的外部服务也正在运行。问题出在我的Spring Boot应用程序中。

我已经使用导致该错误的环境变量配置了数据源URL。由于某种原因,Spring无法解析配置了环境变量的主机。

我只是从以下更改了弹簧配置:

spring:
    datasource:
        url: jdbc:mysql://${DB_HOST}:3306/db_name

至:

spring:
    datasource:
        url: jdbc:mysql://mysql-service:3306/db_name

现在就可以了!