DNS, Kubernetes kümelerinde kritik bir hizmettir. İstemci yapılandırmalarının hatalı olması veya büyük ölçekli kümeler gibi belirli koşullar altında DNS çözümleme zaman aşımları ve hataları yaşanabilir. Bu konu, bu sorunları önlemenize yardımcı olmak için Kubernetes kümelerindeki DNS en iyi uygulamalarını sunar.
Notlar
Bu konu, CoreDNS'in yönetilen sürümüne veya Auto Mode etkinleştirilmiş ACK kümelerine uygulanmaz. CoreDNS'in yönetilen sürümü, yük temelinde otomatik olarak ölçeklenir ve manuel ayarlama gerektirmez.
Bu konunun içeriği
DNS en iyi uygulamaları hem istemci tarafı hem de sunucu tarafı optimizasyonlarını kapsar:
-
İstemci tarafında, uygun konteyner görüntüleri, düğüm işletim sistemleri ve NodeLocal DNSCache kullanarak alan adı çözümleme isteklerini optimize edebilir, gecikme süresini azaltabilir ve çözümleme hatalarını en aza indirebilirsiniz.
-
CoreDNS sunucu tarafında, CoreDNS çalışma durumunu izleyerek DNS istisnalarını tespit edebilir ve kök nedenlerini hızla bulabilirsiniz. Ayrıca yüksek kullanılabilirliği ve saniye başına sorgu (QPS) aktarım hızını artırmak için CoreDNS dağıtımını ayarlayabilirsiniz.
CoreDNS hakkında daha fazla bilgi için resmi CoreDNS belgelerine bakın.
Alan adı çözümleme isteklerini optimize edin
DNS çözümleme, bir Kubernetes kümesindeki en sık yapılan ağ işlemlerinden biridir. Bu isteklerin çoğu optimize edilebilir veya önlenebilir; böylece DNS altyapısındaki gecikme süresi ve yük azaltılır. Alan adı çözümleme isteklerini aşağıdaki yollarla optimize edebilirsiniz:
(Önerilir) Bağlantı havuzları kullanın: Konteyner uygulamanız başka bir hizmeti sık sık istediğinde, upstream hizmetlere yönelik aktif bağlantıları bellekte önbelleğe almak için bir bağlantı havuzu kullanın. Bu, her istek için DNS çözümlemesi ve TCP el sıkışması ek yükünü ortadan kaldırır.
Bir alan adı için IP adreslerini elde etmek üzere eşzamansız veya uzun oylama (long-polling) modu kullanın.
-
DNS önbellekleme kullanın:
(Önerilir) Uygulamanız bağlantı havuzu kullanacak şekilde değiştirilemiyorsa, uygulama tarafında DNS çözümleme sonuçlarını önbelleğe almayı düşünün. Daha fazla bilgi için bkz. NodeLocal DNSCache kullanın.
NodeLocal DNSCache kullanamıyorsanız, konteynerlerinizde yerleşik Name Service Cache Daemon (NSCD) önbelleğini kullanabilirsiniz. Daha fazla bilgi için bkz. Kubernetes kümelerinde NSCD kullanma.
resolv.conf dosyasını optimize edin: resolv.conf dosyasındaki ndots ve search parametrelerinin mekanizmaları nedeniyle, bir konteynerde alan adlarını yazma biçiminiz çözümleme verimliliğini belirler. ndots ve search parametrelerinin mekanizmaları hakkında daha fazla bilgi için bkz. DNS İlkesi Yapılandırması ve Alan Adı Çözümleme.
-
Alan adı yapılandırmalarını optimize edin: Bir konteynerdeki bir uygulama bir alan adına eriştiğinde, çözümleme denemelerini en aza indirmek ve çözümleme gecikme süresini azaltmak için şu şekilde yapılandırın.
Bir pod'dan aynı ad alanındaki bir Service'e erişmek için
<service-name>kullanın; buradaservice-nameService'in adıdır.Bir pod'dan farklı bir ad alanındaki bir Service'e erişmek için
<service-name>.<namespace-name>kullanın; buradanamespace-nameService'in bulunduğu ad alanıdır.-
Bir pod harici bir alan adına eriştiğinde,
searchlistesinden alan adlarının eklenmesi nedeniyle oluşan birden çok geçersiz DNS aramasını önlemek için sonunda nokta (.) bulunan Tam Nitelikli Alan Adı (FQDN) kullanın. Örneğin, www.aliyun.com adresine erişmek için FQDN'si olan www.aliyun.com. kullanın.-
Kubernetes 1.22 veya sonraki sürümleri çalıştıran kümelerde, benzer bir etki elde etmek için arama alanını tek bir nokta (.) olarak yapılandırabilirsiniz (bkz. Issue 125883):
dnsPolicy: None dnsConfig: nameservers: ["192.168.0.10"] ## Replace with the actual ClusterIP of your CoreDNS Service. searches: - . - default.svc.cluster.local ## Note: Replace default with the actual namespace. - svc.cluster.local - cluster.localYukarıdaki yapılandırmayı uyguladıktan sonra, pod'daki /etc/resolv.conf dosyası aşağıdaki gibi yapılandırılır:
search . default.svc.cluster.local svc.cluster.local cluster.local nameserver 192.168.0.10İlk arama alanı "." şeklindedir; bu, çözücünün hedef alan adını FQDN olarak ele almasını sağlar. Çözücü, gereksiz arama alanı genişletmelerini atlayarak önce alan adını olduğu gibi çözümlemeye çalışır.
ÖnemliYukarıdaki yapılandırmanın etkili olması için
dnsPolicydeğeriniNoneolarak ayarlamanız gerekir.
-
Konteynerlerdeki DNS yapılandırmalarını anlayın
Farklı DNS çözücüleri, uygulama farklılıkları nedeniyle farklı davranışlar sergileyebilir.
dig <domain>komutunun başarılı olduğu ancakping <domain>komutunun başarısız olduğu durumlarla karşılaşabilirsiniz.-
Temel görüntü olarak Alpine kullanmaktan kaçının. Bunun yerine Debian veya CentOS gibi diğer temel görüntüleri kullanın. Alpine konteyner görüntülerine yerleşik olan
musl libckitaplığı, standart glibc ile karşılaştırıldığında birkaç uygulama farkına sahiptir; bu durum aşağıdakilerle sınırlı olmayan sorunlara yol açabilir:TCP geri dönüşü: Alpine 3.18 ve önceki sürümler, kesilmiş (TC) bayrağı döndürüldüğünde TCP'ye geri düşmeyi desteklemez.
Arama alanları: Alpine 3.3 ve önceki sürümler search parametresini desteklemez; bu durum hizmet keşfini bozar.
Optimizasyon çakışmaları: Alpine, /etc/resolv.conf içinde yapılandırılan tüm DNS sunucularına eşzamanlı olarak sorgu gönderir; bu durum NodeLocal DNSCache optimizasyonlarını bypass edip geçersiz kılabilir.
Conntrack yarış durumu koşulları: Aynı soketi kullanan eşzamanlı A ve AAAA kaydı istekleri, eski Linux çekirdeklerinde conntrack kaynak bağlantı noktası çakışmalarını tetikleyebilir ve bu da paket kaybına neden olur.
Bu sorunlar hakkında daha fazla bilgi için bkz. musl libc.
Go uygulaması kullanıyorsanız, CGO ve Pure GO uygulamalarındaki DNS çözücüleri arasındaki farklılıklara dikkat edin.
IPVS hatalarından kaynaklanan DNS zaman aşımlarından kaçının
Bir küme kube-proxy yük dengeleme modu olarak IPVS kullandığında, CoreDNS ölçeği indirildiğinde veya yeniden başlatıldığında olasılıksal DNS çözümleme zaman aşımlarıyla karşılaşabilirsiniz. Bu sorun, topluluk Linux çekirdeğindeki bir hatadan kaynaklanır. Daha fazla bilgi için bkz. IPVS.
IPVS hatasının etkisini azaltmak için aşağıdaki yöntemlerden birini kullanabilirsiniz:
NodeLocal DNSCache kullanın. Daha fazla bilgi için bkz. NodeLocal DNSCache kullanın.
kube-proxy içindeki IPVS UDP oturum kalıcılığı için zaman aşımı süresini değiştirin. Daha fazla bilgi için bkz. kube-proxy içindeki IPVS UDP oturum kalıcılığı için zaman aşımı süresini nasıl değiştiririm?.
NodeLocal DNSCache kullanın
CoreDNS aşağıdaki sorunları yaşayabilir:
Nadir durumlarda, eşzamanlı A ve AAAA sorguları paket kaybına neden olabilir ve bu da DNS çözümleme hatalarına yol açar.
Bir düğümdeki dolu bir
conntracktablosu paket kaybına neden olabilir ve bu da DNS çözümleme hatalarına yol açar.
Kümenizdeki DNS kararlılığını ve performansını artırmak için NodeLocal DNSCache bileşenini yükleyin. Her küme düğümünde bir DNS önbelleği çalıştırarak küme DNS performansını artırır. NodeLocal DNSCache ve bunun bir ACK kümesine nasıl dağıtılacağı hakkında daha fazla bilgi için bkz. NodeLocal DNSCache bileşenini kullanma.
NodeLocal DNSCache'i yükledikten sonra, DNS önbellek yapılandırmasını pod'larınıza eklemeniz gerekir. Belirli bir ad alanına etiket eklemek için aşağıdaki komutu çalıştırabilirsiniz. Bu ad alanında oluşturulan yeni pod'lara DNS önbellek yapılandırması otomatik olarak eklenir. Diğer ekleme yöntemleri hakkında daha fazla bilgi için önceki paragrafta referans verilen belgelere bakın.
kubectl label namespace default node-local-dns-injection=enabled
Uygun bir CoreDNS sürümü kullanın
CoreDNS, Kubernetes sürümleriyle iyi bir geriye dönük uyumluluk sunar. CoreDNS'i en son kararlı sürüme güncel tutun. ACK konsolundaki Add-ons sayfası CoreDNS'i yüklemenize, yükseltmenize ve yapılandırmanıza olanak tanır. Add-ons sayfasında CoreDNS bileşeninin durumunu kontrol edin. Yükseltme mevcutsa, yükseltmeyi yoğun olmayan saatlerde planlayın.
CoreDNS'i nasıl yükselteceğiniz hakkında daha fazla bilgi için bkz. Yönetilmeyen CoreDNS için otomatik yükseltme.
CoreDNS sürüm notları için bkz. CoreDNS.
v1.7.0 öncesi CoreDNS sürümleri, aşağıdakiler dahil olmak üzere birkaç potansiyel risk taşır:
CoreDNS ile API sunucusu arasındaki bağlantı anormal olduğunda (örneğin API sunucusu yeniden başlatmaları, geçişler veya ağ dalgalanmaları nedeniyle), CoreDNS hata günlüklerini yazamadığı için yeniden başlatılabilir. Daha fazla bilgi için bkz. Set klog's logtostderr flag.
CoreDNS başlangıçta ekstra bellek tüketir. Varsayılan bellek sınırı, büyük ölçekli kümelerde bellek yetersizliği (OOM) sorunlarını tetikleyebilir. Ağır durumlarda bu, CoreDNS pod'larının yeniden başlatma döngüsüne girmesine ve kurtulamamasına neden olabilir. Daha fazla bilgi için bkz. CoreDNS uses a lot memory during initialization phase.
CoreDNS, headless Service alan adlarının ve küme dışı alan adlarının çözümlemesini etkileyebilecek birkaç soruna sahiptir. Daha fazla bilgi için bkz. plugin/kubernetes: handle tombstones in default processor ve Data is not synced when CoreDNS reconnects to kubernetes api server after protracted disconnection.
Bir küme düğümü anormal hale gelirse, bazı eski CoreDNS sürümlerindeki varsayılan tolerasyon ilkesi CoreDNS pod'larının anormal düğüme zamanlanmasına neden olabilir. Bu pod'lar otomatik olarak tahliye edilemez ve bu durum DNS çözümleme hatalarına yol açar.
Önerilen minimum CoreDNS sürümü, kümenin Kubernetes sürümüne bağlı olarak değişir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CoreDNS çalışma durumunu izleyin
Ölçümler
CoreDNS, çözümleme sonuçları dahil olmak üzere sağlık ölçümlerini standart bir Prometheus arayüzü aracılığıyla sunar. Bu, CoreDNS sunucusundaki ve hatta upstream DNS sunucularındaki anormallikleri tespit etmeye yardımcı olur.
Managed Service for Prometheus CoreDNS için yerleşik ölçüm izleme panoları ve uyarı kuralları sağlar. Prometheus ve pano özelliklerini ACK konsolunda etkinleştirebilirsiniz. Daha fazla bilgi için bkz. CoreDNS bileşenini izleme.
Kubernetes kümenizi izlemek için kendi kendine yönetilen bir Prometheus örneği kullanıyorsanız, ilgili ölçümleri Prometheus'ta gözlemleyebilir ve önemli göstergeler için uyarılar ayarlayabilirsiniz. Daha fazla bilgi için bkz. Prometheus için resmi CoreDNS belgeleri.
Günlükler
Bir DNS anormalliği durumunda, CoreDNS günlükleri kök nedeni hızlı bir şekilde teşhis etmenize yardımcı olabilir. CoreDNS alan adı çözümleme günlüğünü etkinleştirmenizi ve günlüklerinizi Log Service ile toplamanızı öneririz. Daha fazla bilgi için bkz. CoreDNS günlüklerini analiz etme ve izleme.
Kubernetes olay iletimi
CoreDNS v1.9.3.6-32932850-aliyun ve sonraki sürümlerde, kritik CoreDNS günlüklerini Kubernetes olayları olarak Event Center'a iletmek için k8s_event eklentisini etkinleştirebilirsiniz. k8s_event eklentisi hakkında daha fazla bilgi için bkz. k8s_event.
Bu özellik, yeni CoreDNS dağıtımlarında varsayılan olarak etkindir. Daha eski bir sürümden CoreDNS v1.9.3.6-32932850-aliyun veya sonraki bir sürüme yükseltiyorsanız, bunu etkinleştirmek için yapılandırma dosyasını manuel olarak değiştirmeniz gerekir.
-
CoreDNS yapılandırma dosyasını açmak için aşağıdaki komutu çalıştırın.
kubectl -n kube-system edit configmap/coredns -
kubeapi ve k8s_event eklentilerini ekleyin.
apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } // Start of addition (ignore other differences). kubeapi k8s_event { level info error warning // Deliver critical logs with info, error, and warning statuses. } // End of addition. kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } // ... (remaining content omitted) } CoreDNS pod'larının çalışma durumunu ve günlüklerini kontrol edin. Günlüklerde
reloadkelimesi varsa, değişiklik başarılı olmuştur.
CoreDNS yüksek kullanılabilirliğini sağlayın
CoreDNS, küme için yetkili DNS'tir. CoreDNS'teki bir arıza, küme içindeki Service erişiminin başarısız olmasına ve potansiyel olarak yaygın hizmet kullanılamazlığına neden olabilir. CoreDNS'in yüksek kullanılabilirliğini sağlamak için aşağıdaki önlemleri alabilirsiniz:
CoreDNS bileşeni baskısını değerlendirin
Bileşen baskısını değerlendirmek için kümede bir DNS stres testi gerçekleştirebilirsiniz. DNSPerf dahil olmak üzere birçok açık kaynak araç bu konuda size yardımcı olabilir. Kümenizdeki DNS baskısını doğru bir şekilde değerlendiremiyorsanız aşağıdaki önerileri izleyin.
CoreDNS pod sayısını her zaman en az 2 olarak ayarlayın ve tek bir pod için en az 1 çekirdek ve 1 GiB kaynak sınırı belirleyin.
CoreDNS'in alan adı çözümleme QPS değeri CPU tüketimiyle pozitif korelasyona sahiptir. NodeLocal DNSCache etkinleştirildiğinde, her CPU çekirdeği 10.000'den fazla QPS'yi destekleyebilir. Alan adı istekleri için QPS talebi, farklı hizmet türleri arasında önemli ölçüde değişir. Her CoreDNS pod'unun tepe CPU kullanımını gözlemleyebilirsiniz. Bir pod yoğun saatlerde bir CPU çekirdeğinden fazla kullanıyorsa, CoreDNS çoğaltmalarını ölçeklendirmenizi öneririz. Tepe CPU kullanımını belirleyemiyorsanız, pod'lar ile küme düğümleri arasında konservatif olarak 1:8 oranını kullanabilirsiniz. Yani, eklediğiniz her 8 küme düğümü için bir CoreDNS pod'u ekleyin.
CoreDNS pod sayısını ayarlayın
CoreDNS pod sayısı, CoreDNS'in kullanabileceği hesaplama kaynaklarını doğrudan belirler. Değerlendirmenize göre CoreDNS pod sayısını ayarlayabilirsiniz.
UDP paketlerinde yeniden iletim mekanizmasının olmaması nedeniyle, IPVS UDP hatası nedeniyle küme düğümlerinde paket kaybı riski varsa, CoreDNS pod'larının ölçeğinin indirilmesi veya yeniden başlatılması beş dakikaya kadar küme genelinde DNS çözümleme zaman aşımlarına veya istisnalara neden olabilir. IPVS hatasından kaynaklanan çözümleme istisnalarına yönelik çözümler için bkz. DNS çözümleme sorunlarını giderme.
-
Önerilen ilkeye göre otomatik olarak ayarlama
Aşağıdaki
dns-autoscaleröğesini dağıtabilirsiniz. Bu araç, önerilen ilkeye (pod'lar ile küme düğümleri arasında 1:8 oranı) göre CoreDNS pod sayısını gerçek zamanlı olarak otomatik ayarlar. Pod sayısı şu formül kullanılarak hesaplanır: replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica)) vemaxveminparametreleriyle sınırlıdır. -
Manuel olarak ayarlama
CoreDNS pod sayısını manuel olarak ayarlamak için aşağıdaki komutu çalıştırabilirsiniz.
kubectl scale --replicas={target} deployment/coredns -n kube-system # Replace {target} with the desired number of pods. -
İş yükü otomatik ölçeklendirmeyi kullanmayın
Horizontal Pod Autoscaler (HPA) ve CronHPA gibi iş yükü otomatik ölçeklendirme özellikleri pod sayısını otomatik olarak ayarlayabilse de, bunlar sık ölçeklendirme işlemleri gerçekleştirir. Pod'ların ölçeği indirildiğinde oluşan çözümleme istisnaları nedeniyle, CoreDNS pod sayısını kontrol etmek için iş yükü otomatik ölçeklendirmeyi kullanmayın.
CoreDNS pod teknik özelliklerini ayarlayın
CoreDNS kaynaklarını ayarlamanın bir diğer yolu da pod teknik özelliklerini değiştirmektir. Bir ACK yönetilen Pro kümesinde, CoreDNS pod'ları için varsayılan bellek sınırı 2Gi olup CPU sınırı yoktur. CPU sınırını en az 1024m olacak şekilde 4096m olarak ayarlayın. CoreDNS pod yapılandırmasını konsolda ayarlayabilirsiniz.
CoreDNS pod'larını zamanlayın
Hatalı bir zamanlama yapılandırması, CoreDNS pod'larının dağıtılmasını engelleyerek CoreDNS arızasına yol açabilir. Bu işlemi gerçekleştirmeden önce zamanlama konusunda bilgili olduğunuzdan emin olun.
Tek düğüm veya tek kullanılabilirlik alanı arızalarından kaçınmak için CoreDNS pod'larını farklı kullanılabilirlik alanlarına ve küme düğümlerine dağıtmanızı öneririz. v1.8.4.3 öncesi CoreDNS bileşen sürümleri, düğüm düzeyinde varsayılan bir yumuşak anti-affinity ilkesine sahiptir; bu durum, kaynaklar yetersiz kaldığında bazı veya tüm pod'ların aynı düğüme dağıtılmasına neden olabilir. Böyle bir durumda, pod'ları silerek yeniden zamanlamayı tetikleyin veya bileşeni en son sürüme yükseltin. v1.8 öncesi CoreDNS bileşen sürümleri artık bakımı yapılmamaktadır ve mümkün olan en kısa sürede yükseltilmelidir.
CoreDNS'in çalıştığı küme düğümlerinin CPU veya belleği tamamen kullanılmamalıdır, çünkü bu durum alan adı çözümlemesinin QPS değerini ve yanıt gecikme süresini etkiler. Küme düğümü koşulları izin verdiğinde, stabil bir alan adı çözümleme hizmeti sağlamak için özel parametreler kullanarak CoreDNS'i özel küme düğümlerine zamanlamayı düşünün.
CoreDNS yapılandırmalarını optimize edin
ACK, CoreDNS için varsayılan bir yapılandırma sağlar. CoreDNS'in iş konteynerleriniz için uygun DNS hizmetleri sağlayabilmesini sağlamak için bu parametreleri gözden geçirmeli ve optimize etmelisiniz. CoreDNS yapılandırması son derece esnektir. Daha fazla bilgi için bkz. DNS ilkelerini yapılandırma ve alan adlarını çözümleme ve resmi CoreDNS belgeleri.
Daha eski Kubernetes küme sürümleriyle dağıtılan varsayılan CoreDNS yapılandırmalarında bazı riskler olabilir. Bunları aşağıdaki gibi kontrol edin ve optimize edin:
Ayrıca Container Intelligence Service'in planlı inceleme ve arıza tanılama özelliklerini kullanarak CoreDNS yapılandırma dosyalarını kontrol edebilirsiniz. Container Intelligence Service'in inceleme sonucu bir CoreDNS ConfigMap yapılandırma istisnası gösteriyorsa, yukarıdaki her maddeyi kontrol edin.
CoreDNS, yapılandırmasını yenilerken ekstra bellek tüketebilir. Bir CoreDNS ConfigMap'i değiştirdikten sonra pod durumunu gözlemleyin. Bir pod bellek yetersizliği yaşıyorsa, CoreDNS Deployment'ındaki konteyner bellek sınırını hemen artırın. Bellek sınırını 2 GB olarak ayarlayın.
kube-dns için oturum bağlılığını devre dışı bırakın
Oturum bağlılığı, CoreDNS çoğaltmaları arasında önemli yük dengesizliklerine yol açabilir. Aşağıdaki adımları izleyerek bunu devre dışı bırakın:
Console
ACK konsoluna giriş yapın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.
Clusters sayfasında kümenizin adına tıklayın. Sol gezinme bölmesinde seçeneğine tıklayın.
-
kube-system ad alanında, kube-dns Hizmetinin sağındaki Edit YAML seçeneğine tıklayın.
sessionAffinity alanı
Noneolarak ayarlanmışsa, başka bir işlem yapmanız gerekmez.sessionAffinity alanı
ClientIPolarak ayarlanmışsa, aşağıdaki adımlarla devam edin.
-
sessionAffinity ve sessionAffinityConfig alanlarını ve tüm alt anahtarlarını silin ve ardından Update seçeneğine tıklayın.
# Delete all of the following content. sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 kube-dns hizmetinin sağındaki Edit YAML seçeneğine tekrar tıklayın ve sessionAffinity alanının
Noneolarak ayarlandığını doğrulayın.Nonedeğeri, Kube-DNS hizmetinin başarıyla değiştirildiğini gösterir.
CLI
-
kube-dns Hizmetinin yapılandırma bilgilerini görüntülemek için aşağıdaki komutu çalıştırın.
kubectl -n kube-system get svc kube-dns -o yamlsessionAffinity alanı
Noneolarak ayarlanmışsa, başka bir işlem yapmanız gerekmez.sessionAffinity alanı
ClientIPolarak ayarlanmışsa, aşağıdaki adımlarla devam edin.
-
kube-dns adlı Hizmeti açıp düzenlemek için aşağıdaki komutu çalıştırın.
kubectl -n kube-system edit service kube-dns -
sessionAffinity ile ilgili ayarları (sessionAffinity, sessionAffinityConfig ve tüm alt anahtarlarını) silin ve ardından kaydedip çıkın.
# Delete all of the following content. sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 -
Değişiklik tamamlandıktan sonra, sessionAffinity alanının
Noneolarak ayarlanıp ayarlanmadığını kontrol etmek için aşağıdaki komutu tekrar çalıştırın. DeğerNoneise, Kube-DNS hizmetindeki değişiklik başarılı olmuştur.kubectl -n kube-system get svc kube-dns -o yaml
autopath eklentisini devre dışı bırakın
CoreDNS'in bazı eski sürümleri autopath eklentisini etkinleştirmiştir; bu durum bazı uç durumlarda çözümleme hatalarına neden olabilir. Etkin olup olmadığını kontrol edin ve devre dışı bırakmak için yapılandırma dosyasını düzenleyin. Daha fazla bilgi için bkz. Autopath.
autopath eklentisini devre dışı bıraktıktan sonra, istemci tarafı QPS üç kata kadar artabilir ve tek bir alan adının çözülmesi için gereken süre de üç kata kadar uzayabilir. CoreDNS yükünü ve iş üzerindeki etkisini izleyin.
CoreDNS yapılandırma dosyasını açmak için
kubectl -n kube-system edit configmap corednskomutunu çalıştırın.autopath @kubernetessatırını silin ve dosyayı kaydedin.CoreDNS pod'larının çalışma durumunu ve günlüklerini kontrol edin. Günlüklerde
reloadkelimesi varsa, değişiklik başarılı olmuştur.
Sorunsuz kapatmayı yapılandırın
lameduck, CoreDNS'te sorunsuz kapatmayı sağlayan bir mekanizmadır. CoreDNS'in durması veya yeniden başlaması gerektiğinde, devam eden isteklerin ani bir şekilde kesilmeden tamamlanmasını garanti eder. lameduck şu şekilde çalışır:
Bir CoreDNS işlemi sonlanmak üzereyken Lameduck moduna girer.
lameduckmodunda, CoreDNS yeni istekleri kabul etmeyi durdurur ancak mevcut isteklerin tümü tamamlanana veyalameduckzaman aşımı süresi dolana kadar işlemeye devam eder.
Console
ACK konsoluna giriş yapın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.
Clusters sayfasında kümenizin adına tıklayın. Sol gezinme bölmesinde seçeneğine tıklayın.
kube-system ad alanında, coredns ConfigMap'inin sağındaki Edit YAML seçeneğine tıklayın.
CoreDNS yapılandırma dosyasında, health eklentisinin etkin olduğundan emin olun ve lameduck zaman aşımını
15solarak ayarlayın. Ardından OK seçeneğine tıklayın.
.:53 {
errors
# The health plugin may have different settings in different CoreDNS versions.
# Scenario 1: The health plugin is not enabled by default.
# Scenario 2: The health plugin is enabled, but no lameduck duration is set.
# health
# Scenario 3: The health plugin is enabled, and the lameduck duration is set to 5s.
# health {
# lameduck 5s
# }
# For all three scenarios, modify the configuration as follows to set the lameduck parameter to 15s.
health {
lameduck 15s
}
# Other plugins do not need to be modified and are omitted here.
}
CoreDNS pod'ları normal çalışıyorsa, değişiklik başarılı olmuştur. Bir CoreDNS pod'u anormal hale gelirse, olaylarını ve günlüklerini görüntüleyerek nedeni belirleyebilirsiniz.
CLI
CoreDNS yapılandırma dosyasını açmak için aşağıdaki komutu çalıştırın.
Corefile'da,
healtheklentisinin etkin olduğundan emin olun ve lameduck parametresini15solarak ayarlayın.CoreDNS yapılandırma dosyasını değiştirdikten sonra kaydedin ve çıkın.
CoreDNS normal çalışıyorsa, değişiklik başarılı olmuştur. Bir CoreDNS pod'u anormal hale gelirse, olaylarını ve günlüklerini görüntüleyerek nedeni belirleyebilirsiniz.
kubectl -n kube-system edit configmap/coredns
.:53 {
errors
# The health plugin may have different settings in different CoreDNS versions.
# Scenario 1: The health plugin is not enabled by default.
# Scenario 2: The health plugin is enabled, but no lameduck duration is set.
# health
# Scenario 3: The health plugin is enabled, and the lameduck duration is set to 5s.
# health {
# lameduck 5s
# }
# For all three scenarios, modify the configuration as follows to set the lameduck parameter to 15s.
health {
lameduck 15s
}
# Other plugins do not need to be modified and are omitted here.
}
forward eklentisi için varsayılan protokolü yapılandırın
NodeLocal DNSCache, CoreDNS ile iletişim kurmak için TCP kullanır. CoreDNS daha sonra upstream DNS sunucularıyla gelen istekle aynı protokolü kullanarak iletişim kurar. Bu nedenle, varsayılan olarak iş konteynerlerinden küme dışı alan adlarını çözümlemek için gelen istekler NodeLocal DNSCache ve CoreDNS üzerinden geçer ve sonunda ECS örneklerinde varsayılan olarak 100.100.2.136 ve 100.100.2.138 olan VPC DNS sunucularına TCP üzerinden ulaşır.
VPC DNS sunucuları TCP'yi sınırlı düzeyde destekler. NodeLocal DNSCache kullanıyorsanız, çözümleme istisnalarından kaçınmak için upstream DNS sunucularıyla iletişim kurmak üzere UDP'yi önceliklendirmek amacıyla CoreDNS yapılandırmasını değiştirmeniz gerekir. kube-system ad alanındaki coredns adlı ConfigMap olan CoreDNS yapılandırma dosyasını değiştirmenizi öneririz. Daha fazla bilgi için bkz. ConfigMaps'i yönetme. forward eklentisinde, upstream istekler için protokolü prefer_udp olarak belirtin. Bu değişikliğin ardından CoreDNS, upstream sunucularla iletişim kurmak için UDP'yi önceliklendirir. Değişiklik şu şekildedir:
# Before modification
forward . /etc/resolv.conf
# After modification
forward . /etc/resolv.conf {
prefer_udp
}
ready eklentisini yapılandırın
1.5.0 sonrası CoreDNS sürümlerinde, hazır durum denetimlerini etkinleştirmek için ready eklentisinin yapılandırılması gerekir.
-
CoreDNS yapılandırma dosyasını açmak için aşağıdaki komutu çalıştırın.
kubectl -n kube-system edit configmap/coredns -
Dosyada
readysatırının olup olmadığını kontrol edin. Yoksa,readysatırını ekleyin, Esc tuşuna basın,:wq!girin ve ardından Enter tuşuna basarak değiştirilen yapılandırma dosyasını kaydedin ve düzenleme modundan çıkın.apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready # If this line does not exist, add it. Make sure that the indentation is consistent with Kubernetes. kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 prefer_udp } cache 30 loop log reload loadbalance } CoreDNS pod'larının çalışma durumunu ve günlüklerini kontrol edin. Günlüklerde
reloadkelimesi varsa, değişiklik başarılı olmuştur.
multisocket eklentisiyle performansı artırın
CoreDNS v1.12.1, multisocket eklentisini tanıttı. Bu eklentinin etkinleştirilmesi, CoreDNS'in aynı bağlantı noktasında dinlemek için birden çok soket kullanmasına olanak tanır ve yüksek CPU senaryolarında CoreDNS performansını artırır. Eklenti hakkında ayrıntılı açıklama için bkz. topluluk belgeleri.
multisocket'i coredns ConfigMap kullanarak etkinleştirmeniz gerekir:
.:53 {
...
prometheus :9153
multisocket [NUM_SOCKETS]
forward . /etc/resolv.conf
...
}
NUM_SOCKETS aynı bağlantı noktasında dinleyen soket sayısını belirtir.
Önerilen yapılandırma: NUM_SOCKETS değerini tahmini CPU kullanımı, CPU kaynak sınırları ve mevcut küme kaynaklarıyla hizalayın. Örneğin:
CoreDNS tepe noktada 4 çekirdek tüketiyor ve 8 çekirdek mevcutsa,
NUM_SOCKETSdeğerini 2 olarak ayarlayın.CoreDNS tepe noktada 8 çekirdek tüketiyor ve 64 çekirdek mevcutsa,
NUM_SOCKETSdeğerini 8 olarak ayarlayın.
En uygun yapılandırmayı belirlemek için farklı ayarlarla QPS ve yükü test etmenizi öneririz.
NUM_SOCKETS belirtmezseniz, varsayılan değer CoreDNS pod'unun CPU sınırına eşit olan GOMAXPROCS olur. Pod'un CPU sınırı ayarlanmamışsa, değer pod'un çalıştığı düğümdeki CPU çekirdek sayısına eşittir.