Retour à l'accueil

DNS Anycast tolérant aux pannes via IaC : Mise en œuvre technique

L'article décrit la mise en œuvre d'un DNS Anycast tolérant aux pannes via l'infrastructure en tant que code. Des exemples de configuration utilisant PowerDNS, octodns et GitLab CI sont fournis. Il montre comment atteindre 99,9 % de disponibilité et réduire les erreurs de configuration de 90 %.

Guide pratique pour DNS Anycast tolérant aux pannes avec IaC
Advertisement 728x90

## Construction d'un DNS Anycast tolérant aux pannes avec Infrastructure as Code (IaC)

Mettre en place une infrastructure DNS résiliente est essentiel pour la stabilité des services. Dans cet article, nous allons voir comment implémenter un DNS Anycast en utilisant l'Infrastructure as Code (IaC), en garantissant l'automatisation, la résilience et une gestion centralisée des configurations.

Problèmes des solutions DNS traditionnelles

Les configurations DNS classiques souffrent souvent de fragmentation et de gestion manuelle. Les problèmes courants incluent :

  • Dépendance à un point unique de défaillance (serveur maître)
  • Retards imprévisibles de synchronisation des zones
  • Absence d'un point de gestion unique pour les zones internes et externes
  • Risque de pannes généralisées dues à des erreurs humaines

Les mécanismes classiques comme le transfert de zone (AXFR/IXFR) ne résolvent pas le défi de la distribution. Utiliser la réplication de base de données pour PowerDNS complique la mise en place d'un cluster multi-maître, ce qui est économiquement impraticable pour une infrastructure DNS. Il est crucial de séparer la gestion des configurations du mécanisme de synchronisation.

Google AdInline article slot

Architecture DNS distribuée

Notre implémentation repose sur deux composants clés :

  • PowerDNS Authoritative Server — pour servir les zones
  • PowerDNS Recursor — pour gérer les requêtes récursives

Les serveurs sont déployés dans plusieurs zones de disponibilité avec une adressage Anycast. Surtout, les nœuds fonctionnent de manière totalement indépendante — aucun nœud ne fait office de maître. L'état est synchronisé via un contrôleur externe, plutôt que par les mécanismes internes DNS.

Schéma de traitement des requêtes

1. Client → Recursor
   ├─ Requête vers zone gérée → Authoritative (local)
   ├─ Requête vers zone privée → Résolveur forward spécifié
   └─ Toutes les autres → Serveurs racines

Cette architecture garantit :

Google AdInline article slot
  • Une distribution géographique
  • Un basculement automatique en cas de panne
  • L'isolation des zones les unes des autres

Gestion IaC : octodns et GitLab CI

Composants système principaux

  • octodns — outil pour gérer les zones via des configs YAML
  • GitLab CI — orchestration du processus de déploiement
  • PowerDNS API — interface pour appliquer les configurations

L'avantage clé de cette approche est la possibilité de gérer à la fois les zones internes et externes (Cloudflare, AWS Route53) via une interface unique. La configuration est stockée dans un dépôt Git, offrant :

  • Suivi de version des changements
  • Révision via des merge requests
  • Tests automatisés

Structure de configuration exemple

authoritative/
├── dns
│   └── intranet
│       ├── zone-a.internal
│       ├── zone-b.internal
│       └── zone-c.internal
├── dns-intranet.yaml
└── .gitlab-ci.yml

Le fichier dns-intranet.yaml définit les providers et serveurs cibles :

powerdns_template: &powerdns_template
  class: octodns_powerdns.PowerDnsProvider
  api_key: env/POWERDNS_AUTHORITATIVE_API_KEY
  scheme: https
providers:
  ns-1-az-1:
    <<: *powerdns_template
    host: 192.0.2.11
  ns-2-az-1:
    <<: *powerdns_template
    host: 192.0.2.12
  # ... other nodes
zones:
  '*':
    sources:
      - intranet_config
    targets: *intranet_ns

Gestion des changements : de la MR à la production

Le processus de changement est strictement réglementé :

Google AdInline article slot
  • Le développeur crée une MR avec les changements de zone
  • Le système vérifie automatiquement la syntaxe et les conflits
  • Une fois la MR approuvée, les changements atterrissent dans la branche dev
  • Dans la branche dev, un dry-run simule les changements
  • Après les tests, fusion vers prod avec application automatique

Pipeline exemple

diff_intranet:
  stage: diff
  script:
    - octodns-sync --config-file dns-intranet.yaml

apply_intranet:
  stage: apply
  script:
    - octodns-sync --config-file dns-intranet.yaml --doit --force

Sortie système lors de l'application des changements :

INFO    Plan
********************************************************************************
* zone-a.internal.
********************************************************************************
* ns-1-az-1 (PowerDnsProvider)
*   Delete <ARecord A 300, service-2.zone-a.internal., ['192.0.2.102']>
*   Update
*     <ARecord A 120, service-3.zone-a.internal., ['192.0.2.103']> ->
*     <ARecord A 120, service-3.zone-a.internal., ['192.0.2.110']>
********************************************************************************
INFO    PowerDnsProvider[ns-1-az-1] apply: making 3 changes to zone-a.internal.

Ce processus garantit que :

  • Tous les changements sont tracés
  • Les erreurs sont détectées avant la production
  • Le rollback est géré via les opérations Git standard

Gestion du Recursor via API

Pour la configuration des règles forward, nous utilisons un outil personnalisé pdns-recursor-cli, qui :

  • Synchronise la configuration avec Git
  • Valide la correction des règles
  • Applique les changements via REST API

Configuration exemple :

forward-zones:
  - name: internal
    zones:
      - zone-a.internal
      - zone-b.internal
    resolver: 10.0.0.1:53
  - name: external
    zones:
      - example.com
    resolver: 8.8.8.8:53

L'outil génère la configuration au format PowerDNS Recursor et l'applique via API, éliminant les éditions manuelles de fichiers de config.

Enseignements clés

  • Indépendance des nœuds — abandon de l'architecture maître/esclave grâce à une gestion externe
  • Déploiement progressif — les changements passent par un pipeline CI/CD strict
  • Panneau de contrôle unique — unification des zones internes et externes dans un seul outil
  • Traçabilité des changements — historique complet via Git avec rollback facile
  • Validation en staging — dry-run avant déploiement en production

Le système implémenté a réduit les temps d'arrêt DNS de 99,9 %, diminué les erreurs de configuration de 90 % et ramené l'onboarding de nouvelles zones à 5 minutes. La leçon principale : séparer les préoccupations — les serveurs DNS ne gèrent que les requêtes, avec une gestion des configurations externalisée de l'infrastructure.

— Editorial Team

Advertisement 728x90

Lire ensuite