在Kubernetes中,为了通过名称而不是IP地址进行通信,DNS名称被分配给Pod和Service。集群内用于DNS解析的默认域名是
cluster.local
,如果需要,可以进行自定义。Service的DNS名称遵循<service-name>.<namespace>.svc.cluster.local
的格式,而Pod的DNS名称遵循< pod-ip-address-replace-dot-with-hyphen >.<namespace>.pod.cluster.local
的格式。CoreDNS基于一个名为"Corefile"的配置文件运行,该文件指定了DNS服务器应如何运行和响应传入的请求。
DNS解析
在Kubernetes中,为Pod和Service分配的DNS名称用于集群内的名称解析,使得Pod和Service可以通过名称而不是IP地址进行通信。
默认域名:cluster.local
在Kubernetes中, cluster.local
是集群内部用于DNS解析的默认域名。当在同一命名空间内对服务或Pod进行DNS查询时,Kubernetes DNS服务会在名称后附加命名空间和 cluster.local
后缀,形成一个完全合格的域名(FQDN)。尽管它是默认的域名,但如果需要,可以自定义使用不同的域名。
服务的DNS名称
Kubernetes中服务的DNS名称遵循以下格式:
<service-name>.<namespace>.svc.cluster.local
service-name
指的是服务的名称,而 namespace
表示服务所在的命名空间。
例如,如果在 my-namespace
命名空间中运行一个名为 my-service
的服务,则相应的DNS名称将是:
my-service.my-namespace.svc.cluster.local
Pods的DNS名称
Kubernetes中Pod的DNS名称遵循以下格式:
<pod-ip-address-replace-dot-with-hyphen>.<namespace>.pod.cluster.local
pod-ip-address-replace-dot-with-hyphen
是Kubernetes分配给Pod的IP地址,其中的点被连字符替换。而 namespace
是Pod所在的命名空间。
例如,如果一个具有IP地址 10.1.2.3
的Pod正在 my-namespace
命名空间中运行,它的DNS名称将是:
10-1-2-3.my-namespace.pod.cluster.local
在同一命名空间中的Pods和Services
当Pods和Services在同一个命名空间中时,您可以使用服务名称而不是完全限定域名(FQDN)通过查询访问Services。
在同一命名空间中的Pods和Services
不同命名空间中的Pods和Services
当Pod和Service在Kubernetes中位于不同的命名空间时,您需要同时指定Service的名称和命名空间,以便从Pod中访问该Service。
不同命名空间中的Pods和Services
CoreDNS
在引入CoreDNS之前,Kubernetes使用kube-dns作为默认的DNS解决方案。DNS服务器处理集群中服务和Pod的DNS请求。根据官方的Kubernetes文档,在1.11版本开始,推荐使用CoreDNS作为默认的DNS解决方案,并且默认与kubeadm一起安装。
配置文件:Corefile
Corefile是一个文本文件,用于指定DNS服务器的操作方式和对传入请求的响应方式。
核心文件示例:
{
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
在Kubernetes插件配置中,集群的顶级域名被指定为"cluster.local"。该插件还配置了使用in-addr.arpa和ip6.arpa域来处理IPv4和IPv6地址的反向DNS查找。