集群 DNS:CoreDNS vs Kube-DNS

CoreDNS 与 Kube-DNS 资源需求比较

几周前,我在为 CoreDNS 资源部署指南 汇编数据时,我还使用相同的测试环境收集了 kube-dns 的相同数据。虽然 CoreDNS 和 Kube-dns 最终执行相同的任务,但在影响资源消耗和性能的实现方面存在一些关键差异。总体而言,其中一些差异是

  • CoreDNS 每实例是一个容器,而 kube-dns 使用三个。
  • Kube-dns 使用 dnsmasq 进行缓存,它是一个单线程 C。CoreDNS 是多线程 Go。
  • CoreDNS 在默认部署中启用负向缓存。Kube-dns 则没有。

这些差异以多种方式影响性能。kube-dns 中每个实例的容器数量较多,这增加了基础内存要求,还会增加一些性能开销(因为请求和响应需要在容器之间来回传递)。对于 kube-dns,dnsmasq 在 C 中可能会得到高度优化,但它也是单线程,因此每个实例只能使用一个核心。CoreDNS 启用负向缓存,这有助于处理外部名称搜索。

内存

CoreDNS 和 kube-dns 都维护集群中所有服务和端点的本地缓存。因此,随着服务和端点数的增加,每个 DNS Pod 的内存要求也随之增加。在默认设置下,预期 CoreDNS 使用的内存比 kube-dns 少。这部分是由于 kube-dns 使用的三个容器的开销,而 CoreDNS 仅使用一个容器。

下表根据服务和端点数显示运行 CoreDNS 或 Kube-dns 的单个实例所需的估计内存。

CoreDNS vs Kube-DNS estimated memory at scale

以上数据来源是 Kubernetes e2e 扩展测试以及小型集群 QPS 负载测试。Kubernetes e2e 扩展测试对非常大的集群进行测试,但不会应用任何 QPS 负载。为了在处理 QPS 负载时考虑所需的附加内存,下图增加了在 CPU 测试期间(如下所示)应用最大 QPS 负载时观察到的内存差异。对于 kube-dns,差异大约为 58Mi,对于 CoreDNS,差异为 5Mi。

CPU

在 CPU 性能方面,CoreDNS 在外部名称(例如 infoblox.com)时的性能要好得多,而在内部名称(例如 kubernetes)时的性能稍微差一些。

DNS 服务器 查询类型 QPS 平均延迟(毫秒)
CoreDNS 外部 6733 12.02
CoreDNS 内部 33669 2.608
Kube-dns 外部 2227 41.585
Kube-dns 内部 36648 2.639

得出结论

  • 对于内部域名,Kube-dns 的性能要好大约 10%。这可能是因为 dnsmaq 比 CoreDNS 内置的缓存进行了更佳的优化。
  • 对于外部域名,CoreDNS 的性能要好约 3 倍。这部分原因是负面响应未缓存于 kube-dns 部署中。然而,在 kube-dns 部署中启用负面缓存并没有明显改变结果,因此大部分性能提升来自其他方面。
DNS 服务器 查询类型 QPS 平均延迟(毫秒)
Kube-dns + 负面缓存 外部 2552 36.665
Kube-dns + 负面缓存 内部 28971 3.385

更多

在这些测试中使用的 kube-dns 版本和默认配置是在 Kubernetes 1.12 中发布的那些版本和配置。

有关测试环境的更多详细信息,请参阅:[在 Kubernetes 集群中扩展 CoreDNS] (https://github.com/coredns/deployment/blob/master/kubernetes/Scaling_CoreDNS.md)

Chris O'Haver
发布:并通过 503 个单词标记部署发现DNS文档Kubernetes服务