无法从Kubernetes Pod内部连接到外部数据库

时间:2019-10-02 15:56:53

标签: java mysql spring-boot docker kubernetes

我正在尝试将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

3 个答案:

答案 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