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.11
ve192.0.2.12
adresleri ö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.conf
yerine 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.