Aller au contenu

Comparaison des solutions DNS

Cette page alimente un ADR (Architecture Decision Record) pour le choix du serveur DNS interne. Méthodologie : voir ADR dans Documenter son code.

Grille de comparaison

Critère CoreDNS BIND 9 PowerDNS Unbound
Licence Apache 2.0 MPL 2.0 GPL 2.0 BSD
Langage Go C C++ C
Rôle principal Autoritatif + resolver Autoritatif + resolver Autoritatif (+ Recursor separe) Resolver uniquement
Protocoles DNS, DoT, DoH, gRPC DNS, DoT, DoH DNS, DoT DNS, DoT, DoH
Architecture plugins Oui (chainable, modulaire) Non (monolithique) Oui (backends) Non (compile-time options)
Integration Kubernetes Natif (cluster DNS par defaut) Non Non Non
API de gestion Plugins (etcd, kubernetes) rndc CLI REST API native unbound-control CLI
Backends de zone Fichier, etcd, Kubernetes, SQL Fichier, DLZ (LDAP, SQL) PostgreSQL, MySQL, SQLite, LDAP, BIND files Fichier (local-zone)
Performance Elevee (Go, async) Elevee (C, optimise) Elevee (C++, threads) Tres elevee (C, optimise resolver)
Empreinte mémoire ~30-50 Mo ~100-200 Mo ~100-150 Mo (autoritatif) ~30-80 Mo
DNSSEC Plugin dnssec Complet (référence) Complet Validation (resolver)
Metriques Prometheus Plugin prometheus natif Via exporters tiers Via exporters tiers Via unbound_exporter
Configuration Corefile (declaratif) named.conf (complexe) Fichier + base de données unbound.conf
Complexité d'opération Basse Haute Moyenne Basse
Maturité 8+ ans (CNCF graduated) 30+ ans (référence historique) 20+ ans 15+ ans
Communauté Large (CNCF, Kubernetes) Large (ISC, historique) Moyenne Moyenne

Analyse détaillée

CoreDNS — Recommande

Forces :

  • DNS par defaut de Kubernetes (projet CNCF graduated)
  • Architecture 100% plugins : on active uniquement ce dont on a besoin
  • Corefile declaratif, simple a versionner dans Git
  • Metriques Prometheus nativement intégrées
  • Leger : un seul binaire Go, pas de dependances
  • Service discovery Kubernetes natif (plugin kubernetes)
  • Extensible : plugins pour etcd, route53, file, forward, cache, etc.

Faiblesses :

  • DNSSEC moins mature que BIND
  • Moins de documentation pour les cas d'usage DNS classiques (hors Kubernetes)
  • Pas de web UI d'administration

Verdict : choix par defaut pour toute infrastructure incluant Kubernetes. Sa simplicité et son ecosysteme de plugins en font le meilleur choix pour un DNS interne moderne.

BIND 9 — Référence historique

Forces :

  • Standard de facto du DNS depuis 30 ans
  • Implementation DNSSEC la plus complète et eprouvee
  • Supporte tous les cas d'usage DNS imaginables
  • Documentation exhaustive, vaste base de connaissances

Faiblesses :

  • Configuration complexe (named.conf verbeux et fragile)
  • Pas d'integration Kubernetes native
  • Empreinte mémoire plus elevee
  • Metriques necessitent des exporters tiers
  • Courbe d'apprentissage raide

Verdict : pertinent pour les environnements legacy avec un existant BIND, ou quand DNSSEC avance est un requis dur. Planifier une migration vers CoreDNS pour les nouveaux déploiements.

PowerDNS — API-first

Forces :

  • API REST native pour la gestion des zones et enregistrements
  • Backends multiples (PostgreSQL, MySQL, LDAP) pour la gestion dynamique
  • Separation propre autoritatif / recursor (deux binaires)
  • Bonne performance avec backend base de données

Faiblesses :

  • Deux composants a déployer et opérer (autoritatif + recursor)
  • Pas d'integration Kubernetes
  • GPL 2.0 (contrainte pour certains usages embarqués)
  • Complexité operationnelle plus elevee que CoreDNS

Verdict : excellent choix si une API REST de gestion des zones est un requis fort (par exemple, provisioning automatise massif via API, integration avec un portail self-service).

Unbound — Resolver optimise

Forces :

  • Resolver recursif le plus performant
  • Tres leger et securise (code audite, sandbox)
  • Excellent support DNSSEC (validation)
  • Configuration simple pour le cas d'usage resolver

Faiblesses :

  • Resolver uniquement : ne sert pas de serveur autoritatif
  • Pas de service discovery
  • Pas d'integration Kubernetes
  • Gestion des zones limitee (local-zone uniquement)

Verdict : a utiliser en complement comme resolver/cache local devant un serveur autoritatif. Ne peut pas etre le DNS interne a lui seul.

Matrice de decision

graph TD
    Besoin["Besoin principal"]
    Besoin --> K8s["Kubernetes"]
    Besoin --> Legacy["Legacy/DNSSEC"]
    Besoin --> API["API REST"]
    K8s --> CoreDNS["CoreDNS<br/>+ Unbound comme<br/>cache local (optionnel)"]
    Legacy --> BIND["BIND 9"]
    API --> PowerDNS
Contexte Solution recommandee
Infrastructure avec Kubernetes CoreDNS (déjà present comme cluster DNS)
Environnement 100% Linux legacy, DNSSEC strict BIND 9 (avec plan de migration CoreDNS)
Besoin d'API REST pour provisioning dynamique PowerDNS autoritatif + recursor
Cache DNS local performant (complement) Unbound devant CoreDNS ou BIND
Nouveau projet, pas de contrainte legacy CoreDNS

Decision recommandee

Pour une DSI orientee développement avec Kubernetes dans le paysage :

Decision : CoreDNS comme serveur DNS interne (autoritatif + forwarder), déployé à la fois comme cluster DNS Kubernetes et comme DNS standalone pour l'infrastructure hors cluster.

Justification : integration Kubernetes native, architecture plugins, metriques Prometheus, simplicité operationnelle, projet CNCF graduated. Unbound peut etre ajoute comme cache local si le volume de requêtes le justifie.

Compatibilité avec l'existant

Si un BIND existant est en place, la migration peut etre progressive : CoreDNS en forward vers BIND pour les zones legacy, puis migration zone par zone. Voir Bonnes pratiques — Migration.