场景:自己有一个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层,这样做可以保证最大限度的找到你的服务,但对于解析的性能是有影响的。
 
                    
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号