Kubernetes为集群内的Pod和Service提供了DNS服务,它会自动配置kubelet以告知各个容器使用DNS服务的IP来解析集群内的DNS名称。集群中定义的每个Service服务(包括DNS服务器本身)都会分配一个DNS名称。 默认情况下,客户端Pod的DNS搜索列表将包含Pod自己的namespace和集群的默认域(默认是cluster.local)。所以同namespace内的Servie和Pod的DNS记录查询,可以省略namespace和默认域。

Service

A记录

  • 正常Service(非Headless Service)会以如下这种名字的形式被指派一个DNS A记录。此记录会解析成此Service的Cluster IP。
1
my-svc.my-namespace.svc.cluster.local
  • my-svc:你定义的Serive名

  • my-namespace:你定义的命名空间

  • Headless Service(没有Cluster IP)也会以如上相同命名的形式被指派一个DNS A记录。不同的是它会解析成该Service下所有Pod的IP组。如果客户端无法使用这一组IP,就会使用标准的round-robin策略从这一组IP中返回随机一个。

SRV记录

可以为Service(包含Headless Service)命名(绑定)的端口需要创建SRV记录。对每个命名端口,SRV记录形式如下:

1
_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local
  • my-port-name:你命名(绑定)的port
  • my-port-protocol:port的协议,例如tcp/udp

对于普通的Service,这会被解析成端口号和CNAME:my-svc.my-namespace.svc.cluster.local。 对于Headless Service,这会被解析成一组结果:Service对应的每个后端Pod各一个,包含auto-generated-name.my-svc.my-namespace.svc.cluster.local这种形式Pod的端口号和CNAME。

Pod

A记录

  • 当创建pod时,其主机名是Pod的metadata.name值。

  • Pod规范有一个可选的主机名字段,可用于指定Pod的主机名。指定后,它优先于Pod的名称作为pod的主机名。

  • Pod规范还有一个可选的子域字段,可用于指定其子域。例如,在命名空间“my-namespace”中,主机名设置为“foo”,子域设置为“bar”的Pod将具有完全限定的域名(FQDN)“foo.bar.my-namespace.svc。集群cluster.local”

  • 如果在与pod相同的命名空间中存在无头服务且与子域名称相同,则集群的KubeDNS服务器还会返回Pod的完全限定主机名的A记录。 例如,给定主机名设置为“busybox-1”且子域设置为“default-subdomain”的Pod,以及同一名称空间中名为“default-subdomain”的无头服务,该pod将看到自己的FQDN为 “Busybox的1.default-subdomain.my-namespace.svc.cluster.local”。 DNS以该名称提供A记录,指向Pod的IP。pod“busybox1”和“busybox2”都可以拥有不同的A记录。