15分钟了解K8S新引入的CoreDNS

从Kubernetes 1.11版本开始,CoreDNS将会取代kube-dns成为默认的DNS服务插件,这对于kubernetes中使用DNS为基础的服务发现机制来说,提供了更多的扩展性和更高的安全性。

CoreDNS is a general-purpose, authoritative DNS server that provides a backwards-compatible, but extensible, integration with Kubernetes. It resolves the issues seen with kube-dns, and offers a number of unique features that solve a wider variety of use cases.

显然K8S社区对它充满了期望。

CoreDNS vs kube-dns的实现差异

在kube-dns中,是将多个容器kubedns、dnsmasq、sidecar放入同一个POD中来实现,其中kubedns容器监听Kubernetes API指令并把符合Kubernetes DNS specification的DNS记录返回,而dnsmasq提供了缓存和stub domain的功能支持,sidecar提供了监控指标和健康检查的实现。

这种实现在使用过程中可能会导致如下问题:

  • 安全问题。在过去,dnsmasq的安全缺陷已经导致过K8S需要发布安全补丁来修复了。
  • 由于dnsmasq实现的stub domian,但External Service是由kubedns来实现的,所以你就不能在External Service中使用stub domain,这是一种巨大的限制

如果对stub domain和externnal service或者说DNS服务工作原理不清楚的话,请参考这篇文档https://jpmens.net/2010/10/29/alternative-dns-servers-the-book-as-pdf/

而在CoreDNS的实现中,上述一切都将会在一个容器中由Go语言编写的单个进程实现,不同的插件组合起来将实现你再kube-dns中找到的一切功能。

CoreDNS vs kube-dns使用差异

在kube-dns中,你可以用过修改ConfigMap来改变服务发现的机制,比如提供stub domain、修改上游的nameserver以及开启聚合。而在CoreDNS的使用过程,同样可以通过修改ConfigMap使得CoreDNS的配置文件Corefile发生改变进而修改服务发现的机制。

同时需要注意的是,原来kube-dns分离的监控度量数据(kubednsdnsmasq)同样也被组合成一个了,毕竟变成单个进程了:)

CoreDNS的增强特性

尽管CoreDNS的设计配置目标是为了兼容之前kube-dns提供的功能特性,同时它也带来了更多的新特性。毕竟CoreDNS不是专为K8S设计的DNS Server实现,它还能做更多超出K8S DNS specification的事情

POD确认模式 Pods verified mode

在kube-dns中,pod的名称记录name record是伪造的(比如:'a-b-c-d.namespace.pod.cluster.local'这样的IP查询会返回a.b.c.d)。在某些场合下,这种模式会削弱TLS提供的身份认证体系。所以CoreDNS提供了一种pods verified的模式,这种模式只会当pod在指定namespace中才返回IP

endpoints 名称依赖pod名称

dnstools# host -t srv headless
headless.default.svc.cluster.local has SRV record 0 25 443 headless-65bb4c479f-qv84p.headless.default.svc.cluster.local.
headless.default.svc.cluster.local has SRV record 0 25 443 headless-65bb4c479f-zc8lx.headless.default.svc.cluster.local.
headless.default.svc.cluster.local has SRV record 0 25 443 headless-65bb4c479f-q7lf2.headless.default.svc.cluster.local.
headless.default.svc.cluster.local has SRV record 0 25 443 headless-65bb4c479f-566rt.headless.default.svc.cluster.local.

其他kubernetes专有的特性

可以使用标准的DNS Zone transfer来导出所有的DNS记录,这对于调试来说非常有帮助。

同时你可以使用namsepace或则label选择器来过滤不同CoreDNS实例,这样就可以把特定的CoreDNS实例暴露给指定有限的服务

扩展性

CoreDNS通过编写插件来实现自定义的DNS Server。比如 redisc plugin可以使多个CoreDNS实例来共享一个2级缓存,使用 pdsql plugin可以允许server直接查询数据库中记录的记录。kubermetai plugin插件可以使单个CoreDNS服务实例来连接多个Kubernetes 集群并为他们提供跨集群的服务发现机制