Tüm Ürünler
Search
Belge Merkezi

Container Service for Kubernetes:DNS best practices

Son Güncelleme:Oct 06, 2026

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:

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; burada service-name Service'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; burada namespace-name Service'in bulunduğu ad alanıdır.

    • Bir pod harici bir alan adına eriştiğinde, search listesinden 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.local

        Yukarı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.

        Önemli

        Yukarıdaki yapılandırmanın etkili olması için dnsPolicy değerini None olarak ayarlamanız gerekir.

        Tam iş yükü örneği

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          labels:
            app: nginx
          name: nginx
          namespace: default
        spec:
          progressDeadlineSeconds: 600
          replicas: 3
          revisionHistoryLimit: 10
          selector:
            matchLabels:
              app: nginx
          strategy:
            rollingUpdate:
              maxSurge: 25%
              maxUnavailable: 25%
            type: RollingUpdate
          template:
            metadata:
              labels:
                app: nginx
            spec:
              containers:
              - image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
                imagePullPolicy: Always
                name: nginx
                resources: {}
                terminationMessagePath: /dev/termination-log
                terminationMessagePolicy: File
              dnsPolicy: None
              dnsConfig:
                nameservers: ["192.168.0.10"]  ## Replace with the actual ClusterIP of your CoreDNS Service.
                searches:
                - .
                - default.svc.cluster.local
                - svc.cluster.local
                - cluster.local
              hostname: nginx
              restartPolicy: Always
              schedulerName: default-scheduler
              securityContext: {}
              subdomain: subdomain
              terminationGracePeriodSeconds: 30

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 ancak ping <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 libc kitaplığı, 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

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 conntrack tablosu 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.

Önemli

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.

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.


Küme sürümü


Minimum CoreDNS sürümü


1.14.8 öncesi


v1.6.2 (End of Life)


1.14.8 veya sonrası, ancak 1.20.4 öncesi


v1.7.0.0-f59c03d-aliyun


1.20.4 veya sonrası, ancak 1.21.0 öncesi


v1.8.4.1-3a376cc-aliyun


1.21.0 ve sonrası


v1.11.3.2-f57ea7ed6-aliyun

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.

  1. 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
  2. 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)
        }
  3. CoreDNS pod'larının çalışma durumunu ve günlüklerini kontrol edin. Günlüklerde reload kelimesi 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.

Önemli

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)) ve max ve min parametreleriyle sınırlıdır.

    dns-autoscaler

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dns-autoscaler
      namespace: kube-system
      labels:
        k8s-app: dns-autoscaler
    spec:
      selector:
        matchLabels:
          k8s-app: dns-autoscaler
      template:
        metadata:
          labels:
            k8s-app: dns-autoscaler
        spec:
          serviceAccountName: admin
          containers:
          - name: autoscaler
            image: registry.cn-hangzhou.aliyuncs.com/acs/cluster-proportional-autoscaler:1.8.4
            resources:
              requests:
                cpu: "200m"
                memory: "150Mi"
            command:
            - /cluster-proportional-autoscaler
            - --namespace=kube-system
            - --configmap=dns-autoscaler
            - --nodelabels=type!=virtual-kubelet
            - --target=Deployment/coredns
            - --default-params={"linear":{"coresPerReplica":64,"nodesPerReplica":8,"min":2,"max":100,"preventSinglePointFailure":true}}
            - --logtostderr=true
            - --v=9
  • 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.

Konsolda CoreDNS yapılandırmasını değiştirme

  1. ACK konsoluna giriş yapın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.

  2. Clusters sayfasında kümenizin adına tıklayın. Sol gezinme bölmesinde Add-ons seçeneğine tıklayın.

  3. Network sekmesine tıklayın ve CoreDNS'i bulun. Ardından Configuration seçeneğine tıklayın.

  4. CoreDNS yapılandırmasını değiştirin ve ardından OK seçeneğine tıklayın.

    İletişim kutusunda, parametreleri güncellememenin bileşenin YAML şablonunu yeniden oluşturduğu ve kubectl aracılığıyla yapılan değişikliklerin üzerine yazabileceği belirtilen bir mesaj gösterilir. Yapılandırılabilir parametreler arasında MemoryRequest, CpuRequest, MemoryLimit (çok düşük ayarlanması OOMKilled hatasını tetikleyebilir), CpuLimit (CpuRequest değerinin iki katı olması önerilir) ve NodeSelector (anahtar-değer çiftleri halinde) bulunur.

CoreDNS pod'larını zamanlayın

Önemli

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'i özel düğümlere dağıtmak için özel parametreler kullanma

  1. ACK konsoluna giriş yapın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.

  2. Clusters sayfasında kümenizin adına tıklayın. Sol gezinme bölmesinde Nodes > Nodes seçeneğine tıklayın.

  3. Nodes sayfasında Manage Labels and Taints seçeneğine tıklayın.

  4. Manage Labels and Taints sayfasında hedef düğümleri seçin ve Add Label seçeneğine tıklayın.

    Not

    Tek bir düğümde birden çok CoreDNS çoğaltması çalıştırmaktan kaçınmak için düğüm sayısı CoreDNS çoğaltma sayısından büyük olmalıdır.

  5. Add iletişim kutusunda aşağıdaki parametreleri ayarlayın ve OK seçeneğine tıklayın.

    • Name: node-role-type

    • Value: coredns

  6. Küme yönetim sayfasının sol gezinme bölmesinde Operations > Add-ons seçeneğine gidin ve ardından CoreDNS'i arayın.

  7. Configuration seçeneğine tıklayın. Configuration iletişim kutusunda NodeSelector öğesinin sağındaki + Add seçeneğine tıklayın, aşağıdaki parametreleri ayarlayın ve ardından OK seçeneğine tıklayın.

    • Key:node-role-type

    • Value:coredns

    CoreDNS, belirtilen etikete sahip düğümlere yeniden zamanlanır.

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.

Not

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

  1. ACK konsoluna giriş yapın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.

  2. Clusters sayfasında kümenizin adına tıklayın. Sol gezinme bölmesinde Network > Services seçeneğine tıklayın.

  3. kube-system ad alanında, kube-dns Hizmetinin sağındaki Edit YAML seçeneğine tıklayın.

    • sessionAffinity alanı None olarak ayarlanmışsa, başka bir işlem yapmanız gerekmez.

    • sessionAffinity alanı ClientIP olarak ayarlanmışsa, aşağıdaki adımlarla devam edin.

  4. 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
  5. kube-dns hizmetinin sağındaki Edit YAML seçeneğine tekrar tıklayın ve sessionAffinity alanının None olarak ayarlandığını doğrulayın. None değeri, Kube-DNS hizmetinin başarıyla değiştirildiğini gösterir.

CLI

  1. 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 yaml
    • sessionAffinity alanı None olarak ayarlanmışsa, başka bir işlem yapmanız gerekmez.

    • sessionAffinity alanı ClientIP olarak ayarlanmışsa, aşağıdaki adımlarla devam edin.

  2. 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
  3. 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
  4. Değişiklik tamamlandıktan sonra, sessionAffinity alanının None olarak ayarlanıp ayarlanmadığını kontrol etmek için aşağıdaki komutu tekrar çalıştırın. Değer None ise, 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.

Not

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.

  1. CoreDNS yapılandırma dosyasını açmak için kubectl -n kube-system edit configmap coredns komutunu çalıştırın.

  2. autopath @kubernetes satırını silin ve dosyayı kaydedin.

  3. CoreDNS pod'larının çalışma durumunu ve günlüklerini kontrol edin. Günlüklerde reload kelimesi 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.

  • lameduck modunda, CoreDNS yeni istekleri kabul etmeyi durdurur ancak mevcut isteklerin tümü tamamlanana veya lameduck zaman aşımı süresi dolana kadar işlemeye devam eder.

Console

  1. ACK konsoluna giriş yapın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.

  2. Clusters sayfasında kümenizin adına tıklayın. Sol gezinme bölmesinde Configurations > ConfigMaps seçeneğine tıklayın.

  3. kube-system ad alanında, coredns ConfigMap'inin sağındaki Edit YAML seçeneğine tıklayın.

  4. CoreDNS yapılandırma dosyasında, health eklentisinin etkin olduğundan emin olun ve lameduck zaman aşımını 15s olarak ayarlayın. Ardından OK seçeneğine tıklayın.

  5. .: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

  1. CoreDNS yapılandırma dosyasını açmak için aşağıdaki komutu çalıştırın.

  2. kubectl -n kube-system edit configmap/coredns
  3. Corefile'da, health eklentisinin etkin olduğundan emin olun ve lameduck parametresini 15s olarak ayarlayın.

  4. .: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.
        }
  5. CoreDNS yapılandırma dosyasını değiştirdikten sonra kaydedin ve çıkın.

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

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.

  1. 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
  2. Dosyada ready satırının olup olmadığını kontrol edin. Yoksa, ready satı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
      }
  3. CoreDNS pod'larının çalışma durumunu ve günlüklerini kontrol edin. Günlüklerde reload kelimesi 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_SOCKETS değerini 2 olarak ayarlayın.

  • CoreDNS tepe noktada 8 çekirdek tüketiyor ve 64 çekirdek mevcutsa, NUM_SOCKETS değ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.