K8S中,Pod如果想也另外一个Pod通信,通常不会直接基础此Pod的IP(动态的),也不会记住此Pod形成的Service的IP(相对比较稳定,但也是动态的), 因为IP不好记,通常情况是通过其对应的Service名字来访问的。那么就需要一个服务,能够把Service的名字翻译为IP,此服务就是kube-dns。


目前K8S的kube-dns通常使用 CoreDNS, 运行在Master Node上。CoreDNS解析所有的Service的名字到期Service IP。CoreDNS本身有一个ClusterIP的Service,其后有多个Backend的pod。如下图:

kubedns service discovery



1、kubernetes的 Service Name被解析成其ClusterIP(是服务网络中的IP,是内部的,不是Node的外部地址)。

2、每个K8s网络在安装的时候指定一个Cluster Domain, 默认是:cluster.local

3、K8S中每个namespace对应一个子域


例如,默认的container的 /etc/resolv.conf:

# cat /etc/resolv.conf 
nameserver <kube-dns ClusterIP>
search <namespace>.svc.<cluster_domain> svc.<cluster_domain> <cluster_domain> <additional ...>
options ndots:5
CODE


如果搜索一个服务名字,例如account-service, 会自动带上<namespace>.svc.<cluster_domain>, 这样就会默认搜索和自己再同一个namespace里面的服务名字。 如果你知道你的服务在不同的namespace里面,就可以加上namespace,例如搜索  account-service.prod,会搜索prod下的account-service. 

kubedns with namespace