CoreDNS “Loop Detected” Hatası ve Pratik Çözümü

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
    }
Buradaki 192.0.2.11 ve 192.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

  1. 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.

Read more

Systemd ile Kendi Servisini Yaz: Flask ve Yedekleme Script’i Üzerinden Uygulamalı Rehber

Systemd ile Kendi Servisini Yaz: Flask ve Yedekleme Script’i Üzerinden Uygulamalı Rehber

Linux’ta çalışan bir script ya da uygulamayı sürekli aktif halde tutmak, hata durumunda yeniden başlatmak veya sistemi yeniden başlattığınızda otomatik olarak ayağa kaldırmak istiyorsanız systemd tam aradığınız şey. Bu rehberde hem bir Flask uygulamasını, hem de günlük çalışan basit bir yedekleme script’ini systemd servislerine dönüştüreceğiz. Gereksiz terimler yok,