繁体   English   中英

无法从 kubernetes pod 内部连接到外部数据库

[英]Cannot connecto to external database from inside kubernetes pod

I am trying to connect my spring-boot api inside a kubernetes pod to an external database (a separate machine but within the local network), however when running, I get SQLNonTransientConnectionException, UknownHostException: mysql-svc, the api cannot connect to the database but whenever我使用 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

经过数小时的挖掘和重新配置,我终于让它工作了,感谢 kubernetes 组的 Xenwar 指出了 externalIP 属性,结果我需要将我的应用程序指向一个外部 ip,在这种情况下是数据库,这里是服务 object:

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

您的服务不是“无头”服务。 将 IP 设置为无:

spec:
  clusterIP: None
  ports:
   - port: 3306
     targetPort: 3306

https://kubernetes.io/docs/concepts/services-networking/service/#headless-services

如果我理解正确,您需要一个 ExternalName 服务类型

ExternalName :通过返回带有其值的 CNAME 记录,将服务映射到 externalName 字段的内容(例如 foo.bar.example.com)。 没有设置任何类型的代理。

这是一个例子:

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 访问 my-service 的工作方式与其他服务相同,但关键区别在于重定向发生在 DNS 级别,而不是通过代理或转发。

请让我知道这是否有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM