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

Posted

技术标签:

【中文标题】无法从 kubernetes pod 内部连接到外部数据库【英文标题】:Cannot connecto to external database from inside kubernetes pod 【发布时间】:2020-01-31 22:43:47 【问题描述】:

我正在尝试将 kubernetes pod 内的 spring-boot api 连接到外部数据库(一台单独的机器,但在本地网络中),但是在运行时,我得到 SQLNonTransientConnectionException, UknownHostException: mysql-svc, api cannot connect到数据库,但是每当我使用 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

【问题讨论】:

【参考方案1】:

经过数小时的挖掘和重新配置,我终于让它工作了,感谢 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

【讨论】:

您是否更改了 EndPoints 对象?我有点困惑,因为服务不同。你能告诉我你的完整代码吗? 它也对我有用,但我无法使用端点来做到这一点。困惑。 你能分享你的部署 yml 吗?【参考方案2】:

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

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

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

【讨论】:

我得到无效值值:spec.clusterIP:无效值:“无”:字段是不可变的 也许它不允许您在创建 IP 后更改它。尝试删除该服务并重新创建它。 我已经这样做了,我也删除了类型条目,但无济于事,我仍然无法访问数据库。【参考方案3】:

如果我理解正确,您需要一个 ExternalName service type。

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

如果有帮助,请告诉我。

【讨论】:

仍然收到此错误:原因:java.net.UnknownHostException: mysql-svc,我想知道问题是否在我的 application.properties 文件中.. 这种情况请看here

以上是关于无法从 kubernetes pod 内部连接到外部数据库的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core pod 无法连接到 Kubernetes 中的 SQL Server pod

如何从 kubernetes pod 连接到本地网络

无法从 GKE 中的 pod 内部连接到 Postgres SQL 实例

Kubernetes Python客户端:使用Autobahn websocket连接到pod /服务/使用bearer token连接

kubernetes常见故障

Kubernetes - 机器上已经存在容器镜像