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.confverbeux 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.