几周前,我在为 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 的单个实例所需的估计内存。
以上数据来源是 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)。