k8s~跨namespace的service相互访问

在k8s里,你能够经过服务名去访问相同namespace里的服务,而后服务能够解析到对应的pod,从而再由pod转到对应的容器里,咱们能够认为这个过程有两个port的概念,service port 就是服务的port,在k8s配置文件里用port表示,还有一个是pod和容器的port,用targetPort表示,其中pod和容器的port你能够认为它是一个。mysql

多namespace的service场景

咱们一般会把mysql,redis,rabbitmq,mongodb这些公用组件放在一个namespace里,或者每一个公用组件都有本身的namespace,而你的业务组件会统一放在本身的namespace里,这时就涉及到了跨namespace的数据通信问题。redis

k8s的服务名DNS解析

Kubernetes 目前使用的kube-dns来实现集群内部的service dns记录解析。默认状况下/etc/resolv.conf里,它的内容是统一的格式。spring

/ # more /etc/resolv.conf
nameserver 172.19.0.10
search saas.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

search doamin列表默认状况下,它只包含本地域名。这能够经过在search关键字后面列出所需的域搜索路径来添加。kubernetes为每一个容器配置默认是${namespace}.svc.cluster.local svc.cluster.local cluster.local。在一次dns域名查询时,将会尝试使用每一个search doamin依次搜索少于ndots点(默认值为1)的解析器查询,直到找到匹配项。对于具备多个子域的环境,建议调整选项ndots:n,以免man-in-the-middle攻击和root-dns-servers的没必要要通讯。sql

noots:5

这个咱们能够把它理解成服务名dns解析的层次,例如{服务名}是一级,而{服务名}.{命名空间}为二层,{服务名}.{命名空间}.svc.cluster.local是第三层,上面的配置一共有5层,同时也开启了5层,这样作能够保证最大限度的找到你的服务,但对于解析的性能是有影响的。mongodb

请注意,若是搜索域对应的服务器不是本地的,那么这个查询过程可能会很慢,而且会产生大量的网络流量。若是其中一个搜索域域没有可用的服务器,则查询将超时。服务器

同一集群跨namespace访问

若是你要链接namespace是redis的,服务名是redis-master的服务,你能够这样去配置你的链接:网络

spring:
  profiles: redis-prod
  redis:
    host: redis-master.redis 
    port: 6379
    password: 123456
    database: 1

它采用了服务名+命名空间的格式,若是是相同的namespace,能够直接使用服务名来解析。性能

相关文章
相关标签/搜索