DNS为Kubernetes集群内的工作负载提供域名解析服务。本文主要介绍Kubernetes集群中DNS域名解析原理和ACK集群中默认内置的DNS服务器CoreDNS。在Kubernetes集群中,CoreDNS扮演着至关重要的角色,它实现了服务发现的功能,使得集群内部的服务可以通过服务名来互相访问,无需知道具体的IP地址。CoreDNS的强大之处在于其插件化架构,可以根据需求配置不同的插件以实现各种DNS相关的功能
Kubernetes集群中DNS域名解析原理
DNS解析原理图
序号 | 描述 |
① | 业务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集群匹配有 |
options | 定义域名解析配置文件选项,支持多个KV值。例如该参数设置成 |
根据上述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集群CoreDNS的详细配置说明,请参见集群CoreDNS配置。
关于如何使用CoreDNS提高ACK集群整体DNS查询性能,请参见DNS最佳实践。
您还可以在ACK集群中部署Node Local DNS提升服务发现的稳定性和性能,Node Local DNS通过在集群节点上作为DaemonSet运行DNS缓存代理来提高集群的DNS性能。关于如何在集群中部署Node Local DNS的具体步骤,请参见使用NodeLocal DNSCache。