Passer au contenu principal

Réseau (Kubernetes)

CoreDNS et service discovery

CoreDNS est le serveur DNS du cluster. Il résout les noms de Services et de pods en adresses IP, permettant aux applications de se découvrir par nom plutôt que par IP. Comprendre son fonctionnement est essentiel pour diagnostiquer les problèmes de résolution de noms, fréquents dans les clusters sous charge.

Fonctionnement de base

CoreDNS est déployé comme Deployment dans kube-system. Il est exposé par un Service ClusterIP (en général 10.96.0.10). Chaque pod est configuré automatiquement pour utiliser CoreDNS comme résolveur DNS (/etc/resolv.conf injecté par kubelet).

# Depuis l'intérieur d'un pod
cat /etc/resolv.conf
# nameserver 10.96.0.10
# search default.svc.cluster.local svc.cluster.local cluster.local
# options ndots:5

Résolution de noms

Format complet : <service>.<namespace>.svc.<cluster-domain>

Grâce aux domaines de recherche dans /etc/resolv.conf, depuis un pod dans le namespace default :

  • web-service : résout vers web-service.default.svc.cluster.local
  • db.data : résout vers db.data.svc.cluster.local
  • api.external.com : si 5 points ou plus, requête directe sans search

L'option ndots:5 signifie que les noms avec moins de 5 points passent par les domaines de recherche en premier. Sur des noms externes (ex. api.github.com), cela génère 3 requêtes DNS inutiles avant la résolution finale. Pour y remédier, utiliser le FQDN (api.github.com. avec point final) ou ajuster dnsConfig.

dnsPolicy et dnsConfig

spec:
  dnsPolicy: ClusterFirst         # Défaut : CoreDNS d'abord, puis DNS du noeud
  # Autres valeurs : None, Default, ClusterFirstWithHostNet
  dnsConfig:
    options:
    - name: ndots
      value: "2"                  # Réduit les requêtes inutiles pour les FQDN externes
    - name: single-request-reopen # Évite les race conditions ndots sur certaines configs

Configuration CoreDNS (Corefile)

kubectl get configmap coredns -n kube-system -o yaml

Le Corefile par défaut gère le domaine cluster.local et forward les autres requêtes vers le DNS du noeud. On peut le modifier pour :

  • Ajouter des zones DNS internes (pour des services hors-cluster)
  • Changer le serveur de forward upstream
  • Activer le cache plus agressif
  • Ajouter des enregistrements statiques (hosts plugin)
data:
  Corefile: |
    .:53 {
        errors
        health { lameduck 5s }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
            pods insecure
            fallthrough in-addr.arpa ip6.arpa
            ttl 30
        }
        prometheus :9153
        forward . 8.8.8.8 1.1.1.1 {   # Upstream DNS
            max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }
    # Zone interne supplémentaire
    internal.company.com:53 {
        forward . 192.168.1.53
    }

Debugging DNS

# Vérifier que CoreDNS tourne
kubectl get pods -n kube-system -l k8s-app=kube-dns

# Logs CoreDNS (activer le plugin log pour le debug)
kubectl logs -n kube-system -l k8s-app=kube-dns

# Tester la résolution depuis un pod éphémère
kubectl run dnstest --image=busybox:1.36 --rm -it -- sh
# nslookup kubernetes.default
# nslookup web-service.production.svc.cluster.local
# dig @10.96.0.10 web-service.production.svc.cluster.local

Sources