CoreDNS “Loop Detected” Hatası ve Pratik Çözümü
    Kubernetes üzerinde çalışan herkes, DNS altyapısında zaman zaman beklenmedik hatalarla karşılaşabilir. Ben de yakın zamanda, CoreDNS pod’larımda şu tipte bir hata ile yüzleştim:
[FATAL] plugin/loop: Loop (169.254.25.10:43652 -> 169.254.25.10:53) detected for zone ".", see https://coredns.io/plugins/loop#troubleshooting.
Eğer siz de böyle bir uyarı alıyorsanız, büyük ihtimalle CoreDNS’iniz kendi kendine sorgu döngüsüne girmiş demektir. Neyse ki çözümü oldukça basit!
Hatanın Sebebi
Bu hatanın asıl nedeni, CoreDNS’in forward . /etc/resolv.conf ayarını kullanıyor olması. Kulağa mantıklı gelse de, eğer sistemin resolv.conf dosyası tekrar CoreDNS’i gösteriyorsa, DNS sorguları tekrar kendine dönüyor ve sonsuz bir döngü başlıyor. Sonuçta CoreDNS, kendisine tekrar tekrar sorgu yönlendiriyor ve sonunda pes edip “loop detected” hatasını veriyor.
Doğru CoreDNS Ayarı Nasıl Olmalı?
Çözüm çok basit: forward . satırında /etc/resolv.conf yerine doğrudan gerçek DNS sunucularınızın IP adreslerini kullanmanız gerekiyor. Örneğin:
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . 192.0.2.11 192.0.2.12
        cache 30
        loop
        reload
        loadbalance
    }
Buradaki192.0.2.11ve192.0.2.12adresleri örnektir, kendi ortamınızda dışarıya çıkabilen DNS sunucularınızın IP’lerini yazmalısınız.
Adım Adım Çözüm
- forward . satırını gerçek DNS IP’leriyle değiştir:
/etc/resolv.confyerine kendi DNS sunucularınızı yazın. 
CoreDNS ConfigMap’i Düzenle:
kubectl -n kube-system edit configmap coredns
Pod’ları Yeniden Başlat:
kubectl -n kube-system rollout restart deployment coredns
Son Kontrol
Değişikliği yaptıktan sonra CoreDNS pod’larının sağlıklı çalışıp çalışmadığını kontrol edebilirsiniz:
kubectl -n kube-system get pods -l k8s-app=kube-dns
Bir pod üzerinde DNS çözümleme test etmek için:
kubectl run -i --tty dns-test --image=busybox --restart=Never -- sh
# Sonrasında pod içinde
nslookup google.com
Kubernetes’te DNS çözümleme döngüsüne düşmek hiç hoş bir deneyim değil, ama bu sorunun çözümü gerçekten kolay. Yeter ki forward . satırında asla /etc/resolv.conf kullanmayın; onun yerine dış DNS sunucularınızın IP adreslerini verin.