場景:自己有一個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層,這樣做可以保證最大限度的找到你的服務,但對於解析的性能是有影響的。