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:5Ré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 versweb-service.default.svc.cluster.localdb.data: résout versdb.data.svc.cluster.localapi.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 configsConfiguration CoreDNS (Corefile)
kubectl get configmap coredns -n kube-system -o yamlLe 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 (
hostsplugin)
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