我正在尝试将kubernetes容器中的spring-boot api连接到外部数据库(单独的机器,但是在本地网络中),但是在运行时,出现SQLNonTransientConnectionException,UknownHostException:mysql-svc,该api无法连接到数据库,但是每当我使用kubectl exec -it从pod内部ping主机中的数据库地址时,我都能成功ping到任何遇到与我相同的错误的人吗?
这是我的application.properties连接uri和kubernetes对象:
spring.datasource.url=jdbc:mysql://mysql-svc/test?autoReconnect=true
---
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
spec:
type: ClusterIP
ports:
- port: 3306
targetPort: 3306
---
apiVersion: v1
kind: Endpoints
metadata:
name: mysql-svc
subsets:
- addresses:
- ip: 10.0.123.28
ports:
- port: 3306
name: mysql-svc
答案 0 :(得分:0)
您的服务不是“无头”服务。将IP设置为“无”:
spec:
clusterIP: None
ports:
- port: 3306
targetPort: 3306
https://kubernetes.io/docs/concepts/services-networking/service/#headless-services
答案 1 :(得分:0)
如果我对您的理解正确,则需要一个ExternalName service type。
ExternalName:将服务映射到 外部名称字段(例如foo.bar.example.com),方法是返回CNAME 记录其值。没有设置任何代理。
这里是一个例子:
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com
在查找主机
my-service.prod.svc.cluster.local
时, 群集DNS服务返回带有值的CNAME记录my.database.example.com
。访问我的服务的工作方式与 其他服务,但区别在于重定向 发生在DNS级别,而不是通过代理或转发。
请让我知道是否有帮助。
答案 2 :(得分:0)
经过数小时的挖掘和重新配置后,由于kubernetes组的Xenwar指出了externalIP属性,我终于使它开始工作了,事实证明,我需要将我的应用程序指向一个外部ip,在这种情况下是数据库,这是服务对象:
apiVersion: v1
kind: Service
metadata:
name: db-con
spec:
selector:
app: api2
ports:
- name: http
protocol: TCP
port: 3306
targetPort: 3306
externalIPs:
- 10.0.123.28