【问题标题】:Cannot connecto to external database from inside kubernetes pod无法从 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

【问题讨论】:

    标签: java mysql spring-boot docker kubernetes


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2020-07-10
    相关资源
    最近更新 更多