k8s集群跨namespace訪問服務


場景:自己有一個java應用部署在test命名空間下,但是一直無法訪問到middleware命名空間下的mysql服務 查找資料發現下面所說的問題

我們通常會把mysql,redis,rabbitmq,mongodb這些公用組件放在一個namespace里,或者每個公用組件都有自己的namespace,而你的業務組件會統一放在自己的namespace里,這時就涉及到了跨namespace的數據通訊問題。

1.同一集群跨namespace訪問

下面是我的應用以及mysql對應的svc

[root@k8s-master jenkins]# kubectl get svc -A|grep 'halo\|mysql'
middleware      mysql                         ClusterIP   10.96.7.67      <none>        3306/TCP               23h
test            halo-svc                      ClusterIP   10.96.2.19      <none>        8090/TCP               23h

java應用連接mysql的配置(如果mysql跟應用在同一個namespace下使用下面配置是沒有問題的)

 driver-class-name: com.mysql.cj.jdbc.Driver
 url: jdbc:mysql://mysql:3306/db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true

修改后的配置

driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql.middleware:3306/db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true

這個就涉及到了k8s集群內布dns解析的問題

/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

例如{服務名}是一級,而{服務名}.{命名空間}為二層,mysql.middleware即為第二層,{服務名}.{命名空間}.svc.cluster.local是第三層,上面的配置一共有5層,同時也開啟了5層,這樣做可以保證最大限度的找到你的服務,但對於解析的性能是有影響的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM