叢集 DNS:CoreDNS vs Kube-DNS

比較 CoreDNS 和 Kube-DNS 的資源需求

幾週前,在為 CoreDNS 的資源部署指南編寫資料時,我也使用相同的測試環境收集了 kube-dns 的相同資料。儘管 CoreDNS 和 Kube-dns 最終執行相同的任務,但在實作上存在一些關鍵差異,這些差異會影響資源消耗和效能。從較高的層面來看,其中一些差異是:

  • CoreDNS 每個實例使用單一容器,而 kube-dns 使用三個容器。
  • Kube-dns 使用 dnsmasq 進行快取,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%。這可能是由於 dnsmasq 比 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
發布時間:,並使用 部署探索DNS文件Kubernetes服務標記,共使用了 503 個字詞。