在Kubernetes集群中,Pod访问Service或集群外的服务时使用的是域名,但是域名需要被解析为IP地址才可访问。DNS(Domain Name System)就用于这个场景,它保存了名称与IP地址的对应关系。通过本文,您可了解DNS的基础知识、ACK中的DNS组件以及DNS配置。
DNS域名解析原理
虽然互联网设备通过IP地址互相通信,但是域名本身包含了语义,比起IP地址更容易记忆。因此,绝大多数情况下,客户端会通过域名发起请求。下图展示了客户端向example.com发送请求时的流程:
服务器向DNS服务器注册自身的IP地址与域名,DNS服务器会保存对应的记录。
客户端向DNS服务器询问example.com对应的IP地址。
DNS服务器根据保存的记录将IP返回给客户端。
客户端使用IP地址访问目标服务器。
集群中的DNS组件
在ACK托管集群中,有两个负责DNS的组件,CoreDNS与NodeLocal DNSCache。在您了解它们的作用之前,请您阅读下方的内容,了解集群中DNS的基础知识。
在大多数情况下,Service只会显示一个简短的名称。但在进行DNS查询时,会使用Service的完整域名,格式为“<servicename>.<namespace>.svc.<ClusterDomain>”。其中<ClusterDomain>
为集群本地顶级域名,默认为cluster.local
,支持自定义配置。例如,在default
命名空间中,名为database-svc
的Service,它的完整域名为database-svc.default.svc.cluster.local
。
在Pod创建时,节点上的kubelet会为Pod配置/etc/resolv.conf
配置文件,Pod进行DNS查询时会参考此文件中的配置。
CoreDNS
CoreDNS是Kubernetes集群中负责DNS解析的组件,能够支持解析集群内部自定义服务域名和集群外部域名。CoreDNS项目由CNCF托管。关于CoreDNS的更多信息,请参见CoreDNS: DNS and Service Discovery。
与开源Kubernetes标准相同,ACK集群默认安装CoreDNS作为DNS服务器。CoreDNS以Deployment的方式部署在了集群的kube-system命名空间下。kube-dns则是CoreDNS所属的ClusterIP类型的Service。CoreDNS的配置方法,请参见CoreDNS配置说明。
下面的示例中,处于default
命名空间的Pod尝试访问database-svc
,经历了以下流程:
Pod查看
/etc/resolv.conf
配置文件,确定了DNS服务器的IP为172.0.XX.X
,这是kube-dns的ClusterIP。Pod向kube-dns发起DNS查询,它会以
search
中的值作为后缀发起查询,即依次尝试查询:database-svc.default.svc.cluster.local
(与Pod同一命名空间的Service)database-svc.svc.cluster.local
(其他命名空间的Service)database-svc.cluster.local
(集群范围内的域名)database-svc
(集群外域名)
CoreDNS Pod返回结果,对应的IP为
172.4.XX.X
。Pod使用此IP访问目标服务
database-svc
。
NodeLocal DNSCache
NodeLocal DNSCache会在每个Worker节点配置DNS缓存,可以降低CoreDNS的压力,提升集群DNS的稳定性和可用性。 我们总是建议您在集群下安装该组件,提升DNS 解析的稳定性。您可参见使用NodeLocal DNSCache安装并使用组件。
下面的示例中,在安装了NodeLocal DNSCache且给default
命名空间打上node-local-dns-injection: "enabled"
标签后,处于default
命名空间的Pod尝试访问database-svc
,经历了以下流程:
Pod会首先查看所在节点的DNS缓存。
根据节点DNS缓存是否命中,此时会分为两种情况:
缓存命中,即节点DNS缓存中有
database-svc
记录,则缓存返回结果,Pod使用结果访问服务。缓存未命中,即节点DNS缓存中没有
database-svc
记录,则仍旧通过CoreDNS获取结果。从CoreDNS获取的结果将同步到节点DNS缓存以便后续使用。
集群DNS配置
集群中的DNS配置可分为下列三个维度,它们分别作用于不同的范围。
集群配置(全局)
ClusterDomain
是每个节点的kubelet配置,但是在整个集群内所有节点的kubelet中都应保持一致,否则会出现网络错误。
ClusterDomain
ClusterDomain是集群本地顶级域名,即集群中所有Service完整域名的默认后缀,默认为
cluster.local
。ClusterDomain配置通常用于区分集群内网络与集群外网络。在创建集群时,您可对ClusterDomain自定义,请注意不要与您常用的外部域名重合。
节点配置
resolveConf
resolveConf
指定节点上 DNS 配置文件的路径。当 Pod 的dnsPolicy
为Default
时,kubelet 会将resolveConf
指定的文件(默认/etc/resolv.conf
)复制到 Pod 的/etc/resolv.conf
中。
Pod配置
每个Pod都有两个配置:
dnsPolicy
及dnsConfig
,您可通过它们为Pod自定义DNS策略。dnsPolicy定义Pod的DNS解析策略,dnsConfig 用于自定义 DNS 服务器和搜索域。请参见DNS策略配置和域名解析说明,了解如何结合场景使用dnsPolicy
与dnsConfig
。