Pod作为集群中提供具体服务的实体,也可以像Service一样设置DNS域名。另外,系统为客户端应用Pod需要使用的DNS策略提供了多种选择。
对Pod来说,Kubernetes会为其设置一个<pod-ip>.<namespace>.pod.<cluster-domain>格式的DNS域名,其中Pod IP部分需要用“-”替换“.”符号,例如下面Pod的IP地址为10.0.95.63:

系统为这个Pod设置的DNS域名为10-0-95-63.default.pod.cluster.local,用nslookup进行验证,便可以成功解析该域名的IP地址为10.0.95.63:

对于以Deployment或Daemonset类型创建的Pod,Kubernetes会为每个Pod都以其IP地址和控制器名称设置一个DNS域名,格式为<pod-ip>.<deployment/daemonset-name>.<namespace>.svc.<cluster-domain>,其中Pod IP地址段字符串需要用“-”替换“.”符号,例如下面Pod的IP地址为10.0.95.48:

系统为这个Pod设置的DNS域名为10-0-95-48.demo-app.default.svc.cluster.local,用nslookup进行验证,便可以成功解析该域名的IP地址为10.0.95.48:

在默认情况下,Pod的名称将被系统设置为容器环境内的主机名称(hostname),但通过副本控制器创建的Pod名称会有一段随机后缀名,无法固定,此时可以通过在Pod yaml配置中设置hostname字段定义容器环境的主机名。同时,可以设置subdomain字段定义容器环境的子域名。
通过下面的Pod定义,将会在Pod容器环境中设置主机名为“webapp-1”,子域名为“mysubdomain”:


创建这个Pod:

查看Pod的IP地址:

在Pod创建成功之后,Kubernetes系统为其设置的DNS域名(FQDN)为“webapp-1.mysubdomain.default.svc.cluster.local”,可以通过登录Pod“webapp1”查看/etc/hosts文件的记录:

为了使集群内的其他应用能够访问Pod的DNS域名,还需要部署一个Headless Service,其服务名称为Pod的子域名(subdomain),这样系统就会在DNS服务器中自动创建相应的DNS记录。
Headless Service的定义如下,名称(name)被设置为Pod的子域名“mysubdomain”:


创建该Headless Service:

查看该Service的详情,可见其Endpoint为Pod的IP:

此时,其他应用就可以通过Pod的DNS域名“webapp-1.mysubdomain.default.svc.cluster.local”访问Pod的服务了:

Kubernetes可以在Pod级别通过dnsPolicy字段设置DNS策略。目前支持的DNS策略如下。
◎ Default:继承Pod所在宿主机的域名解析设置。
◎ ClusterFirst:优先使用Kubernetes环境的DNS服务(如CoreDNS提供的域名解析服务),将无法解析的域名转发到系统配置的上游DNS服务器。
◎ ClusterFirstWithHostNet:适用于以hostNetwork模式运行的Pod。
◎ None:忽略Kubernetes集群的DNS配置,需要手工通过dnsConfig自定义DNS配置。这个选项在Kubernetes 1.9版本中开始引入,到Kubernetes 1.10版本时升级为Beta,到Kubernetes 1.14版本时达到稳定版本。自定义DNS配置详见下节的说明。
下面是一个使用了hostNetwork的Pod,其dnsPolicy设置为“ClusterFirstWithHostNet”:

在默认情况下,系统会自动为Pod配置好域名服务器等DNS参数,此外Kubernetes也提供在Pod定义中由用户自定义DNS相关配置的方法。这可以通过在Pod定义中设置dnsConfig字段进行DNS相关配置。该字段是可选字段,在dnsPolicy为任意策略时都可以设置,但是当dnsPolicy="None"时必须设置。该特性在Kubernetes的1.9版本中被提出,在1.10版本时达到Beta阶段并被默认启用,到1.14版本时达到Stable阶段。
自定义DNS可以设置以下内容。
◎ nameservers:用于域名解析的DNS服务器列表,最多可以设置3个。当Pod的dnsPolicy="None"时,该nameserver列表必须包含至少一个IP地址。配置的nameserver列表会与系统自动设置的nameserver进行合并和去重。
◎ searches:用于域名搜索的DNS域名后缀,最多可以设置6个,也会与系统自动设置的search列表进行合并和去重。
◎ options:配置其他可选DNS参数,例如ndots、timeout等,以name或name/value对的形式表示,也会与系统自动设置的option列表进行合并和去重。
以下面的dnsConfig为例:

在Pod成功创建后,容器内DNS配置文件/etc/resolv.conf的内容将被系统设置如下:

在IPv6环境中,Pod内/etc/resolv.conf文件中nameserver的IP地址也会以IPv6格式进行表示,例如:
