Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

CoreDNS — DNS interne de Kubernetes

14 min de lecture

CoreDNS est le DNS par défaut de Kubernetes depuis la version 1.13. Il permet aux Pods de résoudre les noms de Services (my-service.my-namespace.svc.cluster.local) en adresses IP ClusterIP. Sans DNS fonctionnel, la communication inter-Pods par nom de Service ne fonctionne pas.

Ce guide couvre CoreDNS pour la certification CKA, où le dépannage DNS représente une compétence clé du domaine Troubleshooting (30%).

  • Comment fonctionne la résolution DNS dans Kubernetes
  • La syntaxe des noms de Services (service.namespace.svc.cluster.local)
  • Comment configurer CoreDNS via le Corefile
  • Les techniques de dépannage DNS pour la CKA
  • Les erreurs courantes et leurs solutions
┌─────────────────────────────────────────────────────────────────┐
│ Cluster Kubernetes │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Pod A │ │ Pod B │ │ Pod C │ │
│ │ │ │ │ │ │ │
│ │ /etc/resolv │ │ /etc/resolv │ │ /etc/resolv │ │
│ │ nameserver │ │ nameserver │ │ nameserver │ │
│ │ <DNS_IP> │ │ <DNS_IP> │ │ <DNS_IP> │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ └────────────────────┼────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Service DNS │ │
│ │ kube-dns │ │
│ │ 10.96.0.10:53 │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ CoreDNS Pods │ │
│ │ (Deployment) │ │
│ └─────────────────┘ │
│ │
└───────────────────────────────────────────────────────────────────┘

Quand un Pod veut contacter my-service.default.svc.cluster.local :

  1. Le Pod lit /etc/resolv.confnameserver <IP du Service kube-dns>
  2. La requête DNS part vers le Service kube-dns (souvent 10.96.0.10 sur kubeadm)
  3. CoreDNS reçoit la requête via le plugin kubernetes qui publie les enregistrements DNS à partir des objets Kubernetes (Services, Endpoints)
  4. CoreDNS renvoie l’adresse ClusterIP du Service
  5. Le Pod peut maintenant contacter le Service
Type de nomFormatExemple
FQDN complet<service>.<namespace>.svc.<cluster-domain>nginx.default.svc.cluster.local
Dans le même namespace<service>nginx
Cross-namespace<service>.<namespace>nginx.production

Kubernetes peut publier des enregistrements DNS pour les Pods, mais la résolution exacte dépend du DNS du cluster et de sa configuration. Pour CoreDNS, ce comportement dépend du plugin kubernetes et de ses options (notamment pods insecure).

Format si activé :

<pod-ip-avec-tirets>.<namespace>.pod.cluster.local

Exemple : 10-244-0-5.default.pod.cluster.local

Pour un Service headless (clusterIP: None), CoreDNS renvoie directement les IPs des Pods :

<pod-name>.<service>.<namespace>.svc.cluster.local

Utile pour les StatefulSets : mysql-0.mysql.default.svc.cluster.local

Fenêtre de terminal
kubectl get deployment coredns -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
coredns 2/2 2 2 10d
Fenêtre de terminal
kubectl get pods -n kube-system -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
coredns-5644d7b6d9-abcde 1/1 Running 0 10d
coredns-5644d7b6d9-fghij 1/1 Running 0 10d
Fenêtre de terminal
kubectl get svc kube-dns -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 10d

CoreDNS est configuré via une ConfigMap nommée coredns dans kube-system.

Fenêtre de terminal
kubectl get configmap coredns -n kube-system -o yaml

Le Corefile varie selon la distribution, la version et les personnalisations. Voici un exemple typique sur un cluster kubeadm :

.: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 . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
PluginRôle
errorsLog les erreurs
healthExpose /health sur le port 8080
readyExpose /ready sur le port 8181
kubernetesRésout les noms du cluster Kubernetes
prometheusExpose les métriques sur le port 9153
forwardForwarde les requêtes externes vers les DNS upstream
cacheCache les réponses (TTL 30 secondes)
loopDétecte les boucles de forwarding
reloadRecharge la config quand la ConfigMap change
loadbalanceRépartit les réponses DNS (round-robin)

Pour résoudre *.corp.example.com via un DNS interne d’entreprise :

Fenêtre de terminal
kubectl edit configmap coredns -n kube-system

Ajoutez un bloc avant le bloc principal :

corp.example.com:53 {
errors
cache 30
forward . 10.0.0.53
}
.:53 {
# ... config par défaut
}

Utilisez le plugin hosts pour des résolutions statiques :

.:53 {
errors
health
hosts {
192.168.1.100 legacy.internal
192.168.1.101 oldserver.internal
fallthrough
}
kubernetes cluster.local in-addr.arpa ip6.arpa {
# ...
}
# ...
}
  1. Lancez un Pod de test

    Fenêtre de terminal
    kubectl run dnsutils --image=registry.k8s.io/e2e-test-images/agnhost:2.39 \
    --command -- sleep infinity
  2. Testez la résolution

    Fenêtre de terminal
    kubectl exec -it dnsutils -- nslookup kubernetes.default

    Résultat attendu :

    Server: 10.96.0.10
    Address: 10.96.0.10#53
    Name: kubernetes.default.svc.cluster.local
    Address: 10.96.0.1
  3. Testez un Service spécifique

    Fenêtre de terminal
    kubectl exec -it dnsutils -- nslookup my-service.my-namespace
  4. Nettoyez

    Fenêtre de terminal
    kubectl delete pod dnsutils
Fenêtre de terminal
kubectl exec <pod-name> -- cat /etc/resolv.conf

Contenu attendu :

nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

Symptôme :

Fenêtre de terminal
kubectl exec mypod -- nslookup google.com
# timeout ou "server can't find"

Diagnostic :

Fenêtre de terminal
# 1. CoreDNS fonctionne ?
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 2. Service kube-dns existe ?
kubectl get svc kube-dns -n kube-system
# 3. Logs CoreDNS
kubectl logs -n kube-system -l k8s-app=kube-dns

Solutions possibles :

  • Redémarrez CoreDNS : kubectl rollout restart deployment coredns -n kube-system
  • Vérifiez les NetworkPolicies bloquant le port 53
  • Vérifiez que le CNI est installé et fonctionnel

Symptôme :

Fenêtre de terminal
kubectl exec mypod -- nslookup kubernetes.default
# OK
kubectl exec mypod -- nslookup google.com
# timeout

Diagnostic :

Fenêtre de terminal
# Vérifiez le forward dans le Corefile
kubectl get configmap coredns -n kube-system -o yaml | grep forward

Solution : Vérifiez que /etc/resolv.conf du nœud contient des DNS valides, ou configurez un forward explicite :

forward . 8.8.8.8 8.8.4.4

Cause fréquente : Le paramètre ndots:5 fait essayer plusieurs suffixes avant la requête finale.

Solution : Pour une application qui fait beaucoup de requêtes externes, ajoutez un point final :

Fenêtre de terminal
# Lent (essaie google.com.default.svc.cluster.local, etc.)
nslookup google.com
# Rapide (requête directe)
nslookup google.com.

Ou configurez le Pod avec un dnsConfig personnalisé :

apiVersion: v1
kind: Pod
metadata:
name: fast-dns
spec:
dnsConfig:
options:
- name: ndots
value: "2"
containers:
- name: app
image: nginx

Le champ dnsPolicy contrôle la configuration DNS du Pod :

ValeurComportement
ClusterFirst (défaut)Utilise CoreDNS pour tout
DefaultUtilise le resolv.conf du nœud
ClusterFirstWithHostNetPour les Pods avec hostNetwork: true
NoneAucune config, à définir via dnsConfig
apiVersion: v1
kind: Pod
metadata:
name: custom-dns
spec:
dnsPolicy: "None"
dnsConfig:
nameservers:
- 8.8.8.8
- 8.8.4.4
searches:
- ns1.svc.cluster.local
- my.dns.search.suffix
options:
- name: ndots
value: "2"
- name: edns0
containers:
- name: app
image: nginx

CoreDNS expose des métriques Prometheus sur le port 9153 :

Fenêtre de terminal
kubectl port-forward -n kube-system svc/kube-dns 9153:9153
curl http://localhost:9153/metrics

Métriques importantes :

MétriqueDescription
coredns_dns_requests_totalNombre total de requêtes
coredns_dns_responses_totalRéponses par code (NOERROR, NXDOMAIN, SERVFAIL)
coredns_dns_request_duration_secondsLatence des requêtes
coredns_cache_hits_totalHits du cache

Pour les grands clusters, augmentez le nombre de replicas :

Fenêtre de terminal
kubectl scale deployment coredns -n kube-system --replicas=4

Ou utilisez l’Autoscaler DNS :

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: coredns
namespace: kube-system
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: coredns
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Fenêtre de terminal
# Vérifier l'état de CoreDNS
kubectl get deployment,pods,svc -n kube-system -l k8s-app=kube-dns
# Voir la configuration
kubectl get configmap coredns -n kube-system -o yaml
# Logs CoreDNS
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=50
# Test DNS rapide (image officielle de debug)
kubectl run test-dns --rm -it --restart=Never \
--image=registry.k8s.io/e2e-test-images/agnhost:2.39 \
-- /agnhost dns-lookup kubernetes.default
# Redémarrer CoreDNS
kubectl rollout restart deployment coredns -n kube-system

Pour les grands clusters ou les applications sensibles à la latence DNS, Kubernetes propose NodeLocal DNSCache. Il place un cache DNS sur chaque nœud via un DaemonSet, réduisant la charge sur CoreDNS et les temps de résolution.

Consultez la documentation NodeLocal DNSCache pour la mise en place.

  1. CoreDNS est le DNS par défaut de Kubernetes depuis la v1.13
  2. Service kube-dns expose CoreDNS (IP variable selon le Service CIDR, souvent 10.96.0.10 sur kubeadm)
  3. Format DNS : <service>.<namespace>.svc.cluster.local
  4. Corefile dans la ConfigMap coredns du namespace kube-system
  5. Plugin forward gère les requêtes DNS externes
  6. Test rapide avec l’image agnhost ou un Pod dnsutils
  7. ndots:5 peut ralentir les requêtes externes (ajouter un . final)
  8. hostNetwork nécessite ClusterFirstWithHostNet pour résoudre les Services

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn