数週間前、CoreDNSのリソースデプロイメントガイドのデータをまとめる際に、同じテスト環境を使用してkube-dnsのデータも収集しました。CoreDNSとKube-dnsは最終的には同じタスクを実行しますが、実装にはいくつかの重要な違いがあり、リソース消費とパフォーマンスに影響します。概要としては、これらの違いには次のようなものがあります。
- CoreDNSはインスタンスごとに1つのコンテナですが、kube-dnsは3つのコンテナを使用します。
- Kube-dnsはキャッシングにdnsmasqを使用します。これはシングルスレッドのC言語で記述されています。CoreDNSはマルチスレッドのGo言語で記述されています。
- CoreDNSはデフォルトのデプロイメントでネガティブキャッシングを有効にします。Kube-dnsは有効にしません。
これらの違いは、さまざまな形でパフォーマンスに影響します。 kube-dnsでは、インスタンスあたりのコンテナ数が多いほど、基本メモリ要件が増加し、パフォーマンスのオーバーヘッドも増加します(リクエスト/レスポンスをコンテナ間でやり取りする必要があるため)。 kube-dnsの場合、dnsmasqはC言語で高度に最適化されている可能性がありますが、シングルスレッドであるため、インスタンスごとに1つのコアしか使用できません。 CoreDNSはネガティブキャッシングを有効にしており、外部名検索の処理に役立ちます。
メモリ
CoreDNSとkube-dnsはどちらも、クラスター内のすべてのサービスとエンドポイントのローカルキャッシュを保持します。そのため、サービスとエンドポイントの数が増加するにつれて、各DNS Podのメモリ要件も増加します。デフォルト設定では、CoreDNSはkube-dnsよりも少ないメモリを使用することが想定されます。これは、kube-dnsで使用される3つのコンテナのオーバーヘッドに対して、CoreDNSでは1つのコンテナのみであることが原因の一部です。
以下のチャートは、サービスとエンドポイントの数に基づいて、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 | 平均レイテンシ(ms) |
---|---|---|---|
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 | 平均レイテンシ(ms) |
---|---|---|---|
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))を参照してください。