簡體   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