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%).
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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
Comment fonctionne le DNS Kubernetes
Section intitulée « Comment fonctionne le DNS Kubernetes »Architecture DNS
Section intitulée « Architecture DNS »┌─────────────────────────────────────────────────────────────────┐│ 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) │ ││ └─────────────────┘ ││ │└───────────────────────────────────────────────────────────────────┘Flux de résolution
Section intitulée « Flux de résolution »Quand un Pod veut contacter my-service.default.svc.cluster.local :
- Le Pod lit
/etc/resolv.conf→nameserver <IP du Service kube-dns> - La requête DNS part vers le Service
kube-dns(souvent10.96.0.10sur kubeadm) - CoreDNS reçoit la requête via le plugin
kubernetesqui publie les enregistrements DNS à partir des objets Kubernetes (Services, Endpoints) - CoreDNS renvoie l’adresse ClusterIP du Service
- Le Pod peut maintenant contacter le Service
Format des noms DNS
Section intitulée « Format des noms DNS »Services
Section intitulée « Services »| Type de nom | Format | Exemple |
|---|---|---|
| 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.localExemple : 10-244-0-5.default.pod.cluster.local
Headless Services
Section intitulée « Headless Services »Pour un Service headless (clusterIP: None), CoreDNS renvoie directement les IPs des Pods :
<pod-name>.<service>.<namespace>.svc.cluster.localUtile pour les StatefulSets : mysql-0.mysql.default.svc.cluster.local
Vérifier que CoreDNS fonctionne
Section intitulée « Vérifier que CoreDNS fonctionne »État du Deployment
Section intitulée « État du Deployment »kubectl get deployment coredns -n kube-systemNAME READY UP-TO-DATE AVAILABLE AGEcoredns 2/2 2 2 10dÉtat des Pods
Section intitulée « État des Pods »kubectl get pods -n kube-system -l k8s-app=kube-dnsNAME READY STATUS RESTARTS AGEcoredns-5644d7b6d9-abcde 1/1 Running 0 10dcoredns-5644d7b6d9-fghij 1/1 Running 0 10dService kube-dns
Section intitulée « Service kube-dns »kubectl get svc kube-dns -n kube-systemNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 10dConfiguration CoreDNS (Corefile)
Section intitulée « Configuration CoreDNS (Corefile) »CoreDNS est configuré via une ConfigMap nommée coredns dans kube-system.
Afficher la configuration actuelle
Section intitulée « Afficher la configuration actuelle »kubectl get configmap coredns -n kube-system -o yamlExemple courant de Corefile (kubeadm)
Section intitulée « Exemple courant de Corefile (kubeadm) »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}Explication des plugins
Section intitulée « Explication des plugins »| Plugin | Rôle |
|---|---|
errors | Log les erreurs |
health | Expose /health sur le port 8080 |
ready | Expose /ready sur le port 8181 |
kubernetes | Résout les noms du cluster Kubernetes |
prometheus | Expose les métriques sur le port 9153 |
forward | Forwarde les requêtes externes vers les DNS upstream |
cache | Cache les réponses (TTL 30 secondes) |
loop | Détecte les boucles de forwarding |
reload | Recharge la config quand la ConfigMap change |
loadbalance | Répartit les réponses DNS (round-robin) |
Personnaliser CoreDNS
Section intitulée « Personnaliser CoreDNS »Ajouter un DNS externe personnalisé
Section intitulée « Ajouter un DNS externe personnalisé »Pour résoudre *.corp.example.com via un DNS interne d’entreprise :
kubectl edit configmap coredns -n kube-systemAjoutez un bloc avant le bloc principal :
corp.example.com:53 { errors cache 30 forward . 10.0.0.53}.:53 { # ... config par défaut}Ajouter des entrées statiques
Section intitulée « Ajouter des entrées statiques »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 { # ... } # ...}Dépannage DNS (compétence CKA)
Section intitulée « Dépannage DNS (compétence CKA) »Test rapide avec un Pod de debug
Section intitulée « Test rapide avec un Pod de debug »-
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 -
Testez la résolution
Fenêtre de terminal kubectl exec -it dnsutils -- nslookup kubernetes.defaultRésultat attendu :
Server: 10.96.0.10Address: 10.96.0.10#53Name: kubernetes.default.svc.cluster.localAddress: 10.96.0.1 -
Testez un Service spécifique
Fenêtre de terminal kubectl exec -it dnsutils -- nslookup my-service.my-namespace -
Nettoyez
Fenêtre de terminal kubectl delete pod dnsutils
Vérifier /etc/resolv.conf dans un Pod
Section intitulée « Vérifier /etc/resolv.conf dans un Pod »kubectl exec <pod-name> -- cat /etc/resolv.confContenu attendu :
nameserver 10.96.0.10search default.svc.cluster.local svc.cluster.local cluster.localoptions ndots:5Problèmes courants et solutions
Section intitulée « Problèmes courants et solutions »Le Pod ne résout aucun nom
Section intitulée « Le Pod ne résout aucun nom »Symptôme :
kubectl exec mypod -- nslookup google.com# timeout ou "server can't find"Diagnostic :
# 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 CoreDNSkubectl logs -n kube-system -l k8s-app=kube-dnsSolutions 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
Résolution interne OK, externe KO
Section intitulée « Résolution interne OK, externe KO »Symptôme :
kubectl exec mypod -- nslookup kubernetes.default# OK
kubectl exec mypod -- nslookup google.com# timeoutDiagnostic :
# Vérifiez le forward dans le Corefilekubectl get configmap coredns -n kube-system -o yaml | grep forwardSolution :
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.4Résolution très lente (timeout 5s)
Section intitulée « Résolution très lente (timeout 5s) »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 :
# 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: v1kind: Podmetadata: name: fast-dnsspec: dnsConfig: options: - name: ndots value: "2" containers: - name: app image: nginxConfigurer le DNS des Pods
Section intitulée « Configurer le DNS des Pods »dnsPolicy
Section intitulée « dnsPolicy »Le champ dnsPolicy contrôle la configuration DNS du Pod :
| Valeur | Comportement |
|---|---|
ClusterFirst (défaut) | Utilise CoreDNS pour tout |
Default | Utilise le resolv.conf du nœud |
ClusterFirstWithHostNet | Pour les Pods avec hostNetwork: true |
None | Aucune config, à définir via dnsConfig |
Exemple avec dnsConfig personnalisé
Section intitulée « Exemple avec dnsConfig personnalisé »apiVersion: v1kind: Podmetadata: name: custom-dnsspec: 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: nginxMétriques et monitoring
Section intitulée « Métriques et monitoring »CoreDNS expose des métriques Prometheus sur le port 9153 :
kubectl port-forward -n kube-system svc/kube-dns 9153:9153curl http://localhost:9153/metricsMétriques importantes :
| Métrique | Description |
|---|---|
coredns_dns_requests_total | Nombre total de requêtes |
coredns_dns_responses_total | Réponses par code (NOERROR, NXDOMAIN, SERVFAIL) |
coredns_dns_request_duration_seconds | Latence des requêtes |
coredns_cache_hits_total | Hits du cache |
Scaling CoreDNS
Section intitulée « Scaling CoreDNS »Pour les grands clusters, augmentez le nombre de replicas :
kubectl scale deployment coredns -n kube-system --replicas=4Ou utilisez l’Autoscaler DNS :
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: coredns namespace: kube-systemspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: coredns minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70Commandes CKA essentielles
Section intitulée « Commandes CKA essentielles »# Vérifier l'état de CoreDNSkubectl get deployment,pods,svc -n kube-system -l k8s-app=kube-dns
# Voir la configurationkubectl get configmap coredns -n kube-system -o yaml
# Logs CoreDNSkubectl 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 CoreDNSkubectl rollout restart deployment coredns -n kube-systemAller plus loin : NodeLocal DNSCache
Section intitulée « Aller plus loin : NodeLocal DNSCache »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.
À retenir
Section intitulée « À retenir »- CoreDNS est le DNS par défaut de Kubernetes depuis la v1.13
- Service kube-dns expose CoreDNS (IP variable selon le Service CIDR, souvent
10.96.0.10sur kubeadm) - Format DNS :
<service>.<namespace>.svc.cluster.local - Corefile dans la ConfigMap
corednsdu namespacekube-system - Plugin forward gère les requêtes DNS externes
- Test rapide avec l’image
agnhostou un Pod dnsutils - ndots:5 peut ralentir les requêtes externes (ajouter un
.final) - hostNetwork nécessite
ClusterFirstWithHostNetpour résoudre les Services