DNS为Kubernetes集群内的工作负载提供域名解析服务。本文主要介绍Kubernetes集群中DNS域名解析原理和ACK集群中默认内置的DNS服务器CoreDNS。在Kubernetes集群中,CoreDNS扮演着至关重要的角色,它实现了服务发现的功能,使得集群内部的服务可以通过服务名来互相访问,无需知道具体的IP地址。CoreDNS的强大之处在于其插件化架构,可以根据需求配置不同的插件以实现各种DNS相关的功能

Kubernetes集群中DNS域名解析原理

DNS解析原理图

image

序号

描述

业务Pod(Pod Client)试图访问Nginx服务(Service Nginx)时,先会请求本地DNS配置文件(/etc/resolv.conf)中指向的DNS服务器(nameserver 172.21.0.10,即Service kube-dns)获取服务IP地址,得到解析结果为172.21.0.30的IP地址。

业务Pod(Pod Client)再直接发起往该IP地址的请求,请求最终经过Nginx服务(Service Nginx)转发到达后端的Nginx容器(Pod Nginx-1和Pod Nginx-2)上。

关于集群DNS域名解析原理的详细说明,请参见DNS策略配置和域名解析说明

域名解析配置

ACK集群中kubelet的启动参数有--cluster-dns=<dns-service-ip>--cluster-domain=<default-local-domain>,这两个参数分别被用来设置集群DNS服务器的IP地址和主域名后缀。

ACK集群默认部署了一套CoreDNS工作负载,并通过kube-dns的服务名暴露DNS服务。ACK部署的CoreDNS工作负载后端是两个名为coredns的Pod,集群会根据Pod内的配置,将域名请求发往集群DNS服务器获取结果。Pod内的DNS域名解析配置文件为/etc/resolv.conf,文件内容如下。

nameserver xx.xx.0.10
search kube-system.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

参数

描述

nameserver

定义DNS服务器的IP地址。

search

设置域名的查找后缀规则,查找配置越多,说明域名解析查找匹配次数越多。ACK集群匹配有kube-system.svc.cluster.localsvc.cluster.localcluster.local3个后缀,最多进行8次查询才能得到正确解析结果,因为集群里面进行IPv4和IPv6查询各四次。

options

定义域名解析配置文件选项,支持多个KV值。例如该参数设置成ndots:5,说明如果访问的域名字符串内的点字符数量超过ndots值,则认为是完整域名,并被直接解析;如果不足ndots值,则追加search段后缀再进行查询。

根据上述Pod内的配置,集群会将域名请求(集群内部定义的服务或是集群外部域名)查询发往集群DNS服务器获取结果。

CoreDNS介绍

CoreDNS是Kubernetes集群中负责DNS解析的组件,能够支持解析集群内部自定义服务域名和集群外部域名。CoreDNS具备丰富的插件集,在集群层面支持自建DNS、自定义hosts、CNAME、rewrite等需求。与Kubernetes一样,CoreDNS项目由CNCF托管。关于CoreDNS的更多信息,请参见CoreDNS: DNS and Service Discovery

ACK集群使用CoreDNS负责集群的服务发现,您可以根据不同的使用场景配置CoreDNS以及使用CoreDNS提升集群的DNS QPS性能:

说明

您还可以在ACK集群中部署Node Local DNS提升服务发现的稳定性和性能,Node Local DNS通过在集群节点上作为DaemonSet运行DNS缓存代理来提高集群的DNS性能。关于如何在集群中部署Node Local DNS的具体步骤,请参见使用NodeLocal DNSCache