幾週前,在為 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 實例所需的估計記憶體。
上述資料的來源來自 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)。