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层,这样做可以保证最大限度的找到你的服务,但对于解析的性能是有影响的。

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/244746.html

(0)
上一篇 2022年4月17日
下一篇 2022年4月17日

相关推荐

发表回复

登录后才能评论