🐥

Nodelocal DNS Cache の導入と成果

に公開

概要

本記事では、NodeLocal DNS Cache (NDC) を導入した際の目的や成果を整理します。
システムの規模感や特徴によって原因や対処方法が異なりますので、その点ご了承ください。

導入の目的

NDC 導入前は、CoreDNS Pod のスケール時に DNS Lookup Failedi/o timeoutが発生していました。
一時的な対応として ndot = 1 を設定し改善は見られましたが、完全に解消できませんでした。

そのため、NDC を導入することで DNS Lookup Failed をほぼゼロにすることを目的としました。
また、その他のメリットとして、以下のことが考えられます。

  • CoreDNS へのリクエストを削減
  • CoreDNS 依存度が低下
  • CoreDNS 障害時にも各サービスへの影響を最小化可能

Nodelocal DNS Cache とは

クラスターノード上で DaemonSet として DNS キャッシュエージェントを実行することにより、DNSパフォーマンスの向上を目的として作成された OSS。
パフォーマンス向上やキャッシュ統計、その他のメトリクスを可視化する機能の追加を実現できる。

アーキテクチャの変化

NDC を導入した際のアーキテクチャです。
NDC が各ノードで動作し、kube-dns(CoreDNS) と Client Pod の間に挟まり DNS をキャッシュすることで様々なメリットがあります。

ndc-arch

引用元: https://kubernetes.io/ja/docs/tasks/administer-cluster/nodelocaldns/

CoreDNS 障害時における NDC のカバー範囲

CoreDNS の障害時、NDC でカバーできる範囲はありますが、すべてをカバーできません。

NDC でカバーできる不具合

  • CoreDNS の QPS 制限やスケール問題
  • CoreDNS Pod の一時的ダウン(RollingUpdate / OOMKill)

NDC でカバーできない不具合

  • ConfigMap の設定ミスやプラグインの誤設定
  • 外部 DNS サーバとの接続障害
  • TTL による古いキャッシュ保持
  • CoreDNS 内部バグ(クラッシュ・メモリリークなど)

アップグレード手法

アップグレード時の課題がありました。

バージョンアップなどで発生する Rollout restart による Pod 再作成時、DNS timeoutが発生してしまい、クラスター全体にその影響が発生していました。
DaemonSet の GracefulTerminationSeconds などの調整やNodeLocal DNSCache の設定を参考に設定してもその状態は改善しませんでした。
ただし、kubectl drain による Node 終了ではエラーが発生しないことは確認できたため、それを軸に手法を検討しました。

そのため、RollingUpdate より時間はかかりますが、安全性を優先し、以下の戦略を採用しました。

  • UpdateStrategy を OnDelete に設定
  • Karpenter の drift 機能で Node を入れ替え

詳細な内容についは、https://zenn.dev/johnn26/articles/2025-09-22-nodelocal-dns-cache-update で紹介しましたので、よろしければ見てみてください。

効果

8月上旬に NDC の導入が完了

DNS Lookup Failed の解消

現在、DNS 関連のエラーをメトリクスで出力できているマイクロサービスは多くはないですが、NDC の導入前後でエラーがなくなりました。

deploy-ndc

i/o timeout の減少

また別のサービスでは、i/o timeout 数を以下のように削減できました。

  • エンドポイントA
    • 7月:176件 → 8月:95件
    • 46% 削減に成功
  • エンドポイントB
    • 7月:159件 → 8月:78件
    • 51% 削減に成功

Appendix

本番導入前の検証でレイテンシ改善を確認できたのですが、本番環境では大きな改善は見られませんでした。

まとめ

  • NDC 導入により DNS Lookup Failed や i/o timeout を大幅に削減
  • システムの安定性向上に貢献
  • CoreDNS 障害の一部をカバー可能だが、根本的な問題は引き続き CoreDNS 側の対策が必要
GitHubで編集を提案

Discussion