本文是深度解析Kubernetes 1.11新功能系列之一。
介绍
在Kubernetes 1.11中,CoreDNS已经实现了基于DNS的服务发现的GA,可作为kube-dns插件的替代品。这意味着CoreDNS将作为各种安装工具未来发布版本中的一个选项来提供。事实上,kubeadm团队选择将其作为Kubernetes 1.11的默认选项。
使用kube-dns集群插件,基于DNS的服务发现已成为Kubernetes的一部分。这通常很有效,但是对于实施的可靠性、灵活性和安全性存在一些担忧。
CoreDNS是一个通用的、权威的DNS服务器,提供与Kubernetes后向兼容但可扩展的集成。它解决了kube-dns所遇到的问题,并提供了许多独特的功能,可以解决各种各样的用例。
在本文中,你将了解kube-dns和CoreDNS的实施差异,以及CoreDNS提供的一些有用的扩展。
实施差异
在kube-dns中,一个pod内使用了数个容器:kubedns、dnsmasq和sidecar。 kubedns容器监视Kubernetes API并基于Kubernetes DNS规范提供DNS记录,dnsmasq提供缓存和存根域支持,sidecar提供指标和健康检查。
此设置会导致一些问题随着时间的推移而出现。首先,dnsmasq中的安全漏洞导致过去需要发布Kubernetes安全补丁。此外,由于dnsmasq处理存根域,但kubedns处理External Services,因此你无法在外部服务中使用存根域,这非常限制该功能(参阅dns#131)。
在CoreDNS中,所有这些功能都在一个容器中完成——该容器运行用Go编写的进程。启用的不同插件来复制(并增强)kube-dns中的功能。
配置CoreDNS
在kube-dns中,你可以修改ConfigMap以改变服务发现的行为。这允许添加诸如提供服务存根域、修改上游名称服务器以及启用联合之类的功能。
在CoreDNS中,你同样可以修改CoreDNS Corefile的ConfigMap以更改服务发现的工作方式。Corefile配置提供了比kube-dns更多的选项,因为它是CoreDNS用于配置其所有功能(甚至是那些与Kubernetes无关的功能)的主要配置文件。
使用kubeadm从kube-dns升级到CoreDNS时,现有的ConfigMap将用于为你生成自定义Corefile,包括存根域、联合和上游名称服务器的所有配置。有关更多详细信息,请参阅《使用CoreDNS进行服务发现》。