CoreDNS, ağ, ilke veya çekirdek kaynaklı sorunlardan kaynaklanan ACK kümelerindeki DNS arızalarını teşhis edin ve düzeltin.
DNS çözümleme nasıl çalışır
Bir uygulama podu bir DNS sorgusu gönderdiğinde süreç şu yolu izler:
Pod, genellikle kube-dns Hizmet IP'si olan
/etc/resolv.confdosyasındaki adrese bir DNS sorgusu gönderir.kube-dns, sorguyu
kube-systemad alanındaki bir CoreDNS poduna iletir.Sonu
.cluster.localile biten dahili etki alanı adları için CoreDNS, üst sunucularla iletişime geçmeden önbelleğinden çözümleme yapar.Harici etki alanı adları için CoreDNS, yapılandırmasında belirtilen üst DNS sunucularına sorguyu iletir. Varsayılan üst sunucular, her ikisi de sanal özel cloud (VPC) içinde konuşlandırılmış olan
100.100.2.136ve100.100.2.138adresleridir.
NodeLocal DNSCache kullanıldığında, sorgular öncelikle yerel önbelleğe (169.254.20.10) gider ve yalnızca çözümlenememesi durumunda kube-dns'e geri döner.
Temel kavramlar
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Adım 1: Hata iletinizi belirleyin
Olası arıza kategorisini belirlemek için hata iletinizi eşleştirin.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Domain does not exist → Etki alanı adının doğru olup olmadığını kontrol edin. Yalnızca harici etki alanları başarısız oluyorsa bkz. Harici etki alanı adı çözümlenemiyor.
DNS server unreachable → Adım 2 bölümüne ilerleyin.
Adım 2: DNS ilkesini ve sunucu adresini kontrol edin
Pod'un DNS sunucusu olarak CoreDNS'i kullandığını doğrulayın.
DNS ilkesini ve yapılandırmayı alın:
# View the pod's DNS policy
kubectl get pod <pod-name> -o yaml
# Log in to the pod and inspect the DNS configuration
kubectl exec -it <pod-name> -- cat /etc/resolv.conf
dnsPolicy alanını ve /etc/resolv.conf dosyasındaki nameserver girdilerini kontrol edin.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Pod CoreDNS kullanmıyorsa (nameserver, kube-dns Hizmet IP'si değil), pod aşırı yüklenmiş olabilir veya conntrack tablosu dolu olabilir. Bkz. İstemci aşırı yüklü ve Conntrack tablosu dolu.
Pod NodeLocal DNSCache kullanıyorsa (nameserver 169.254.20.10), bkz. NodeLocal DNSCache çalışmıyor ve Alibaba Cloud DNS PrivateZone adları çözümlenemiyor.
Pod CoreDNS kullanıyorsa, Adım 3'e devam edin.
Adım 3: CoreDNS pod durumunu kontrol edin
CoreDNS podlarını inceleyin:
# View CoreDNS pod status and placement
kubectl -n kube-system get pod -o wide -l k8s-app=kube-dns
Beklenen çıktı:
NAME READY STATUS RESTARTS AGE IP NODE
coredns-xxxxxxxxx-xxxxx 1/1 Running 0 25h 172.20.6.53 cn-hangzhou.192.168.0.198
# View real-time CPU and memory usage
kubectl -n kube-system top pod -l k8s-app=kube-dns
Beklenen çıktı:
NAME CPU(cores) MEMORY(bytes)
coredns-xxxxxxxxx-xxxxx 3m 18Mi
Pods not in Running state → Nedeni belirlemek için
kubectl -n kube-system describe pod <CoreDNS-pod-name>komutunu çalıştırın. Bkz. CoreDNS podları normal çalışmıyor.CPU or memory near the limit → Bkz. CoreDNS podları aşırı yüklü.
CPU usage uneven across pods → Bkz. DNS sorguları eşit dağıtılmıyor.
Adım 4: CoreDNS işlem günlüklerini kontrol edin
kubectl -n kube-system logs -f --tail=500 --timestamps <coredns-pod-name>
|
|
|
|
|
|
|
|
|
|
|
|
Bilinen sorunlarla eşleşen hata desenlerini arayın. DNS sorgu düzeyi günlükleri için önce CoreDNS log eklentisini etkinleştirin. Bkz. DNS çözümlemeyi yapılandırma.
Log eklentisi etkinleştirildiğinde, çözümlenen her sorgu aşağıdakine benzer bir giriş oluşturur:
[INFO] 172.20.2.25:44525 - 36259 "A IN redis-master.default.svc.cluster.local. udp 56 false 512" NOERROR qr,aa,rd 110 0.000116946s
Yaygın yanıt kodları:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DNS yanıt kodları RFC 1035 standardında tanımlanmıştır.
Adım 5: Hatayı yeniden üretin ve nedeni izole edin
Hata tutarlı şekilde oluşuyorsa:
Hatalı yanıt kodları için DNS sorgu günlüğünü kontrol edin. Bkz. Harici etki alanı adı çözümlenemiyor.
Uygulama podları ile CoreDNS arasındaki ağ bağlantısını test edin. Bkz. Uygulama podları ile CoreDNS arasındaki ağ bağlantısını test etme.
Konteyner ağını teşhis edin. Bkz. Konteyner ağını teşhis etme.
Hata aralıklı olarak oluşuyorsa:
Kanıt toplamak için paket yakalama yapın. Bkz. Paket yakalama.
Tanılama yöntemleri
Uygulama podları ile CoreDNS arasındaki ağ bağlantısını test etme
Aşağıdaki yöntemlerden birini kullanarak uygulama podunun ağ ad alanına girin:
Yöntem 1 (önerilen): Poda girmek için
kubectl exec -it <pod-name> -- bashkomutunu çalıştırın.Yöntem 2: Düğüme giriş yapın,
ps aux | grep <application-process-name>ile işlem kimliğini bulun ve ardındannsenter -t <pid> -n bashile ağ ad alanına girin.-
Yöntem 3 (sık yeniden başlatılan podlar için):
Düğüme giriş yapın.
Sandbox konteyner kimliklerini (adları
k8s_POD_ile başlar) bulmak içindocker ps -a | grep <application-container-name>komutunu çalıştırın./var/run/docker/netns/xxxxyolundaki ağ ad alanı yolunu bulmak içindocker inspect <sandboxed-container-ID> | grep netnskomutunu çalıştırın.Ad alanına girmek için
nsenter -n bashkomutunu çalıştırın. > Note:-nile<netns-path>arasında boşluk bırakmayın.
Pod'un ağ ad alanından bağlantıyı test edin:
# Test connectivity to the kube-dns Service
dig <domain> @<kube-dns-svc-ip>
# Test Internet Control Message Protocol (ICMP) connectivity to the CoreDNS pod
ping <coredns-pod-ip>
# Test DNS query directly to the CoreDNS pod
dig <domain> @<coredns-pod-ip>
<kube-dns-svc-ip> yerine kube-system ad alanındaki kube-dns Hizmet IP'sini ve <coredns-pod-ip> yerine bir CoreDNS podunun IP adresini yazın.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CoreDNS ağ bağlantısını test etme
CoreDNS podunun çalıştığı düğüme giriş yapın.
CoreDNS işlem kimliğini almak için
ps aux | grep corednskomutunu çalıştırın.CoreDNS ağ ad alanına girmek için
nsenter -t <pid> -n bashkomutunu çalıştırın.-
Bağlantıyı test edin:
# Test connectivity to the Kubernetes API server telnet <apiserver_clusterip> 6443 # apiserver_clusterip is the ClusterIP of the kubernetes Service in the default namespace. # Test connectivity to upstream DNS servers dig <domain> @100.100.2.136 dig <domain> @100.100.2.138
|
|
|
|
|
|
|
|
|
|
|
|
Konteyner ağını teşhis etme
ACK konsoluACK konsolu üzerinde giriş yapın.
Clusters sayfasında, kümenizin adına tıklayın veya Actions sütununda Details seçeneğine tıklayın.
Sol gezinme bölmesinde Operations > Cluster Check seçeneğini belirleyin.
Container Intelligence Service sayfasında Cluster Check > Diagnosis seçeneğini belirleyin.
Diagnosis sayfasında Network Diagnosis sekmesine tıklayın.
Source address alanını uygulama podu IP'sine, Destination address alanını kube-dns Hizmet IP'sine ve Destination port alanını
53olarak ayarlayın. Enable packet tracing ve I know and agree seçeneklerini işaretleyin, ardından Create diagnosis seçeneğine tıklayın.Tanılama listesinde, kaydınız için Diagnosis details seçeneğine tıklayın.
Sonuçlar, belirlenen hata nedenleriyle birlikte Diagnosis result, Packet paths ve All possible paths bilgilerini gösterir. Bkz. Küme sorunlarını gidermek için küme tanılama özelliğini kullanma.
Paket yakalama
Hatalar aralıklı olduğunda ve yeniden üretilmesi zor olduğunda paket yakalamayı kullanın.
Uygulama podlarının ve CoreDNS podunun çalıştığı düğümlere giriş yapın.
-
Her ECS örneğinde DNS trafiğini yakalayın:
tcpdump -i any port 53 -C 20 -W 200 -w /tmp/client_dns.pcapBu komut, her biri 20 MB boyutunda en fazla 200 dosya arasında döngü yaparak 53 numaralı bağlantı noktasındaki tüm trafiği yakalar.
Hatayı yeniden üretin ve arıza zaman diliminden paketleri analiz edin. Kesin zaman damgaları için uygulama günlüklerini kontrol edin.
Paket yakalamanın hizmet üzerindeki etkisi ihmal edilebilir düzeydedir; yalnızca CPU kullanımında ve disk G/Ç'sinde hafif bir artışa neden olur.
Bilinen sorunlar
Daha derinlemesine araştırma yapmadan önce bu ortama özgü sorunları kontrol edin.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SSS
Harici etki alanı adı çözümlenemiyor
Yanıt kodunu görmek için CoreDNS sorgu günlüğünü kontrol edin. Henüz etkinleştirilmemişse log eklentisini etkinleştirin (bkz. DNS çözümlemeyi yapılandırma), ardından başarısız olan etki alanını arayın. NXDOMAIN kodu, etki alanının üst sunucuda mevcut olmadığı anlamına gelir; bu durum genellikle geçersiz bir tam nitelikli etki alanı adı (FQDN) oluşturan bir arama sonekinin eklenmesinden kaynaklanır. SERVFAIL veya REFUSED kodları, üst sunucuda bir sorun olduğunu gösterir; CoreDNS yapılandırmasını ve 100.100.2.136 ile 100.100.2.138 adreslerine bağlantıyı kontrol edin.
Headless Hizmetlerin etki alanı adları çözümlenemiyor
1.7.0 öncesi CoreDNS sürümlerinde, API sunucusu ağ dalgalanmaları CoreDNS'in çıkmasına neden olarak headless Hizmet kayıtlarının güncellenmesini durdurabilir. 1.7.0 veya sonraki bir sürüme güncelleyin. Bkz. [\[Bileşen Güncellemeleri\] CoreDNS'i güncelleme](t1964489.dita#task_1964489).
StatefulSet podlarının etki alanı adları çözümlenemiyor
StatefulSet pod şablonunda serviceName alanı headless Hizmet adına ayarlanmalıdır. Bu ayar yapılmazsa, Hizmet düzeyindeki ad (örneğin, headless-svc.ns.svc.cluster.local) çalışsa bile pod başına DNS adları (örneğin, pod.headless-svc.ns.svc.cluster.local) çözümlenemez. StatefulSet spesifikasyonunda serviceName alanını ayarlayın.
DNS sorguları güvenlik grubu kuralları veya ağ ACL'leri tarafından engelleniyor
Güvenlik grubu kuralları veya ağ erişim denetim listeleri (ACL'ler) UDP 53 numaralı bağlantı noktasını engelleyerek etkilenen düğümlerde DNS arızalarına neden olur. Gelen ve giden UDP 53 numaralı bağlantı noktası trafiğine izin verin.
Konteyner ağ bağlantısı hataları DNS arızalarına neden oluyor
Konteyner ağ hataları UDP 53 numaralı bağlantı noktasını engeller. Bozuk yolu ve kök nedeni belirlemek için Ağ Tanılama özelliğini kullanın.
CoreDNS podları aşırı yüklü
Sorgu hacmi CoreDNS çoğaltma kapasitesini aştığında gecikme süresi artar ve arızalar oluşur. CPU ve bellek kullanımının limite yakın olup olmadığını kontrol edin (kubectl -n kube-system top pod -l k8s-app=kube-dns).
İki çözüm:
Sorguları yerel olarak karşılamak ve CoreDNS üzerindeki yükü azaltmak için NodeLocal DNSCache dağıtın. Bkz. NodeLocal DNSCache'i yapılandırma.
Pod başına tepe CPU kullanımı düğümün mevcut CPU'sunun çok altında kalacak şekilde CoreDNS çoğaltmalarını yatay olarak ölçeklendirin.
DNS sorguları CoreDNS podları arasında eşit dağıtılmıyor
Dengesiz pod zamanlaması veya kube-dns üzerinde bir sessionAffinity ayarı, sorgu dağılımının dengesiz olmasına neden olabilir. Belirti: CoreDNS podları arasında belirgin şekilde farklı CPU kullanımı.
İki çözüm:
CoreDNS podlarını ölçeklendirin ve farklı düğümlere yayın.
kube-dns Hizmetinden
sessionAffinityayarını kaldırın. Bkz. kube-dns Hizmetini yapılandırma.
CoreDNS podları normal çalışmıyor
Yanlış yapılandırılmış YAML veya ConfigMap, CoreDNS'in başlamasını engelleyebilir veya çökmelere neden olabilir. Belirtiler: podların Running durumunda olmaması, yeniden başlatma sayısının artması veya günlük hataları.
Aşağıdaki yaygın hatalar için CoreDNS günlüğünü kontrol edin:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
İstemci aşırı yüklü olduğu için DNS çözümlemeleri başarısız oluyor
ECS örneği tamamen yüklendiğinde, UDP paketleri CoreDNS'e ulaşmadan önce düşebilir. İzleme verilerinde anormal ağ arabirimi denetleyicisi (NIC) yeniden iletim oranı ve yüksek CPU kullanımı arayın.
Düğümler arası DNS trafiğini azaltmak için NodeLocal DNSCache dağıtın. Bkz. NodeLocal DNSCache'i yapılandırma.
Conntrack tablosu dolu
Conntrack tablosu dolduğunda yeni UDP ve TCP bağlantıları düşer. Bu durum genellikle yoğun saatlerde DNS arızalarına neden olur ve yoğun olmayan saatlerde düzelir. Onaylamak için, etkilenen düğümde dmesg -H komutunu çalıştırın ve arıza penceresi sırasında conntrack full mesajını arayın.
Conntrack tablosundaki maksimum giriş sayısını artırın. Bkz. Linux çekirdeğinin conntrack tablosundaki izlenen maksimum bağlantı sayısını nasıl artırırım?
autopath eklentisi normal çalışmıyor
Bilinen bir autopath eklenti hatası, harici etki alanları için aralıklı çözümleme arızalarına veya yanlış IP'lere neden olur. Dahili etki alanları doğru şekilde çözülür. Sorun, yüksek konteyner oluşturma oranına sahip kümelerde daha da kötüleşir.
Autopath eklentisini devre dışı bırakın:
kubectl -n kube-system edit configmap corednskomutuyla CoreDNS ConfigMap'i düzenleyin.autopath @kubernetessatırını silin. Kaydedip çıkın.CoreDNS günlüklerinde
reloadmesajını kontrol ederek yapılandırmanın yüklendiğini doğrulayın.
Eşzamanlı A ve AAAA kayıt sorguları nedeniyle DNS çözümlemeleri başarısız oluyor
Bazı Linux dağıtımları, aynı bağlantı noktası üzerinden eşzamanlı olarak A ve AAAA sorguları gönderir; bu durum UDP paketlerinin düşmesine neden olan conntrack çakışmalarını tetikler.
Belirtiler: Aralıklı çözümleme arızaları; paket yakalama aynı kaynak bağlantı noktasından eşzamanlı A ve AAAA sorguları gösterir.
Çözümler görüntü temelınıza bağlıdır:
CentOS veya Ubuntu: DNS çözücü yapılandırmasına
options timeout:2 attempts:3 rotate single-request-reopenseçeneğini ekleyin.Alpine Linux: Alpine tabanlı görüntüyü başka bir işletim sistemi tabanlı bir görüntüyle değiştirin. Bkz. Alpine uyarıları.
cURL ile PHP: Yalnızca IPv4 çözümlemesini zorlamak için
CURL_IPRESOLVE_V4seçeneğini ekleyin. Bkz. cURL işlevleri.Tüm ortamlar: Yarış durumunu hafifleten NodeLocal DNSCache'i dağıtın. Bkz. NodeLocal DNSCache'i yapılandırma.
IPVS hataları nedeniyle DNS çözümlemeleri başarısız oluyor
CentOS veya Alibaba Cloud Linux 2 (çekirdeği 4.19.91-25.1.al7.x86_64 sürümünden önce) ile IPVS modunda, UDP arka uç podlarının kaldırılması paketlerin düşmesine neden olan kaynak bağlantı noktası çakışmalarına yol açar. Düğüm veya CoreDNS ölçeklendirme olayları sırasında DNS arızaları yaklaşık 5 dakika sürer.
İki çözüm:
DNS sorguları için IPVS yolunu atlamak üzere NodeLocal DNSCache dağıtın. Bkz. NodeLocal DNSCache'i yapılandırma.
IPVS modunda UDP oturumu zaman aşımını kısaltın. Bkz. IPVS modunda UDP zaman aşımı süresini değiştirme.
NodeLocal DNSCache çalışmıyor
Aşağıdaki koşullardan biri geçerli olduğunda DNS sorguları NodeLocal DNSCache'i bypass eder:
dnsConfiguygulama podlarına enjekte edilmediğinden podlar hala kube-dns Hizmet IP'sini işaret ediyor.Podlar bir Alpine Linux temel görüntüsü kullanıyor; bu görüntü, doğrudan CoreDNS dahil olmak üzere tüm nameserver'ları eşzamanlı olarak sorgular.
İlk durum için otomatik dnsConfig enjeksiyonunu etkinleştirin. Bkz. NodeLocal DNSCache'i yapılandırma. Alpine görüntüleri için başka bir işletim sistemi üzerine oluşturulmuş bir görüntü kullanın. Bkz. Alpine uyarıları.
Alibaba Cloud DNS PrivateZone adları çözümlenemiyor
Alibaba Cloud DNS PrivateZone TCP yerine UDP gerektirir. NodeLocal DNSCache ile PrivateZone etki alanları, vpc-proxy API uç noktaları veya diğer etki alanı adları çözümlenemeyebilir veya yanlış IP'lere çözülebilir.
Üst sorgular için UDP'yi zorlamak amacıyla CoreDNS yapılandırmasına prefer_udp seçeneğini ekleyin. Bkz. CoreDNS'i yapılandırma.