作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,这就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP地址的解析。
二、DNS服务在k8s的发展
版本 | DNS服务提供者 | 主要特点 |
1.2 | SkyDNS | 由4个容器组成(kube2sky、skydns、etcd和healthz),使用etcd存储DNS记录。 |
1.4 | KubeDNS | 由3个容器组成(kubedns、dnsmasq和sidecar),去掉了SkyDNS中的etcd存储,将DNS记录直接保存在内存中以提高查询性能。 |
1.11 | CoreDNS | 由go语言实现的高性能、插件式、易于扩展的DNS服务端,解决了KubeDNS的一些问题,如dnsmasq的安全漏洞、externalName不能使用stubDomains进行设置等。 |
三、KubeDNS的组成与原理
1. KubeDNS的组成
kubedns容器:监控Kubernetes中Service资源的变化,根据Service的名称和IP地址生成DNS记录,并将DNS记录保存在内存中。
dnsmasq容器:从kubedns中获取DNS记录,提供DrS缓存,为客户端容器应用提供DNS查询服务。
sidecar容器:提供对kubedns和dnsmasq服务的健康检查功能。
2. KubeDNS的工作原理
域名解析:当一个容器需要解析一个域名时,它会首先查询/etc/resolv.conf文件中配置的nameserver(即DNS服务的IP地址),如果该域名包含少于5个点(.),则会被当作相对域名处理,并依次添加search域中的后缀进行解析。
查询流程:如果Pod和Service不在同一Namespace下,则需要在Service Name之后添加上Service所在的Namespace(例如curl usersvc.beta)。
四、搭建CoreDNS服务
1. 修改每个Node上kubelet的DNS启动参数
需要在每个Node上修改kubelet的启动参数,加上以下两个参数:
clusterdns=169.169.0.100 clusterdomain=cluster.local
然后重启kubelet服务。
2. 部署CoreDNS服务
部署CoreDNS服务时需要创建3个资源对象:1个ConfigMap、1个Deployment和1个Service。
ConfigMap:定义CoreDNS的主配置文件Corefile的内容,其中可以定义各种域名的解析方式和使用的插件。
Deployment:设置CoreDNS容器应用的内容,包括副本数量、自动扩缩容控制器等。
Service:确保集群内的其他Pod能够访问到CoreDNS服务。
五、相关问题与解答
问题1:为什么在Kubernetes集群中需要DNS服务?
答:在Kubernetes集群中,为了实现服务发现机制,需要通过服务名对服务进行访问,这就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP地址的解析,从而确保Pods能够通过服务名相互发现和通信。
问题2:如何避免在Kubernetes集群中访问外部域名时产生不必要的DNS请求?
答:为了避免在Kubernetes集群中访问外部域名时产生不必要的DNS请求,可以在/etc/resolv.conf文件中调整options中的ndots配置项,将ndots的值设置为更大的数字(如15),这样只有当需要lookup的Domain中包含少于这个数字的点时,才会被当作非绝对域名进行处理,这样可以有效减少不必要的DNS请求,提高解析效率。
基于当前可获得的搜索结果整理而成,具体情况可能会随着Kubernetes版本的更新而有所变化。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/62179.html