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