Udostępnij za pośrednictwem


Dostosowywanie serwera CoreDNS w usłudze Azure Kubernetes Service

Usługa Azure Kubernetes Service (AKS) używa projektu CoreDNS do zarządzania klastrem DNS i rozpoznawania ich we wszystkich klastrach 1.12.x i wyższych. Aby uzyskać więcej informacji na temat dostosowywania coreDNS i platformy Kubernetes, zobacz oficjalną dokumentację nadrzędną.

Usługa AKS jest usługą zarządzaną, więc nie można modyfikować głównej konfiguracji coreDNS (a CoreFile). Zamiast tego należy użyć narzędzia Kubernetes ConfigMap , aby zastąpić ustawienia domyślne. Aby wyświetlić domyślne obiekty ConfigMaps usługi AKS CoreDNS, użyj kubectl get configmaps --namespace=kube-system coredns -o yaml polecenia .

W tym artykule pokazano, jak używać obiektów ConfigMap dla podstawowych opcji dostosowywania CoreDNS w usłudze AKS. Takie podejście różni się od konfigurowania sieci CoreDNS w innych kontekstach, takich jak CoreFile.

Uwaga

Wcześniej usługa kube-dns była używana do zarządzania i rozpoznawania nazw DNS klastra, ale jest teraz przestarzała. kube-dns oferowane różne opcje dostosowywania za pośrednictwem mapy konfiguracji platformy Kubernetes. CoreDNS nie jest do tyłu zgodny z kube-dns. Wszystkie użyte wcześniej dostosowania muszą zostać zaktualizowane dla usługi CoreDNS.

Zanim rozpoczniesz

  • W tym artykule założono, że masz istniejący klaster usługi AKS. Jeśli potrzebujesz klastra usługi AKS, możesz go utworzyć przy użyciu interfejsu wiersza polecenia platformy Azure, programu Azure PowerShell lub witryny Azure Portal.
  • Sprawdź używaną wersję serwera CoreDNS. Wartości konfiguracji mogą ulec zmianie między wersjami.
  • Podczas tworzenia konfiguracji, takich jak w poniższych przykładach, nazwy w sekcji danych muszą kończyć się wartością .server lub .override. Ta konwencja nazewnictwa jest definiowana w domyślnej konfiguracji AKS CoreDNS ConfigMap, którą można wyświetlić za pomocą kubectl get configmaps --namespace=kube-system coredns -o yaml polecenia .

Obsługa wtyczek

Obsługiwane są wszystkie wbudowane wtyczki CoreDNS. Nie są obsługiwane żadne dodatki/wtyczki innych firm.

Ponowne zapisywanie dns

Możesz dostosować nazwę CoreDNS za pomocą usługi AKS, aby wykonać ponowne zapisywanie nazw DNS na bieżąco.

  1. Utwórz plik o nazwie corednsms.yaml i wklej następującą przykładową konfigurację. Pamiętaj, aby zastąpić <domain to be rewritten> element własną w pełni kwalifikowaną nazwą domeny.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: |
        <domain to be rewritten>.com:53 {
        log
        errors
        rewrite stop {
          name regex (.*)\.<domain to be rewritten>\.com {1}.default.svc.cluster.local
          answer name (.*)\.default\.svc\.cluster\.local {1}.<domain to be rewritten>.com
        }
        forward . /etc/resolv.conf # you can redirect this to a specific DNS server such as 10.0.0.10, but that server must be able to resolve the rewritten domain name
        }
    

    Ważne

    Jeśli nastąpi przekierowanie do serwera DNS, takiego jak adres IP usługi CoreDNS, serwer DNS musi być w stanie rozpoznać przepisaną nazwę domeny.

  2. Utwórz ConfigMap przy użyciu kubectl apply configmap polecenia i określ nazwę manifestu YAML.

    kubectl apply -f corednsms.yaml
    
  3. Sprawdź, czy dostosowania zostały zastosowane przy użyciu elementu kubectl get configmaps i określ element coredns-custom ConfigMap.

    kubectl get configmaps --namespace=kube-system coredns-custom -o yaml
    
  4. Aby ponownie załadować narzędzie ConfigMap i włączyć harmonogram Kubernetes w celu ponownego uruchomienia usługi CoreDNS bez przestoju, wykonaj ponowne uruchomienie stopniowe przy użyciu polecenia kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Niestandardowy serwer przekazywania dalej

Jeśli musisz określić serwer przekazywania dla ruchu sieciowego, możesz utworzyć ConfigMap, aby dostosować system DNS.

  1. Utwórz plik o nazwie corednsms.yaml i wklej następującą przykładową konfigurację. Pamiętaj, aby zastąpić forward nazwę i adres wartościami własnego środowiska.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: | # you may select any name here, but it must end with the .server file extension
        <domain to be rewritten>.com:53 {
            forward foo.com 1.1.1.1
        }
    
  2. Utwórz ConfigMap przy użyciu kubectl apply configmap polecenia i określ nazwę manifestu YAML.

    kubectl apply -f corednsms.yaml
    
  3. Aby ponownie załadować narzędzie ConfigMap i włączyć harmonogram Kubernetes w celu ponownego uruchomienia usługi CoreDNS bez przestoju, wykonaj ponowne uruchomienie stopniowe przy użyciu polecenia kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Używanie domen niestandardowych

Możesz skonfigurować domeny niestandardowe, które można rozpoznać tylko wewnętrznie. Na przykład możesz rozwiązać problem z domeną niestandardową puglife.local, która nie jest prawidłową domeną najwyższego poziomu. Bez niestandardowej domeny ConfigMap klaster usługi AKS nie może rozpoznać adresu.

  1. Utwórz nowy plik o nazwie corednsms.yaml i wklej następującą przykładową konfigurację. Pamiętaj, aby zaktualizować domenę niestandardową i adres IP przy użyciu wartości dla własnego środowiska.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      puglife.server: | # you may select any name here, but it must end with the .server file extension
        puglife.local:53 {
            errors
            cache 30
            forward . 192.11.0.1  # this is my test/dev DNS server
        }
    
  2. Utwórz ConfigMap przy użyciu kubectl apply configmap polecenia i określ nazwę manifestu YAML.

    kubectl apply -f corednsms.yaml
    
  3. Aby ponownie załadować narzędzie ConfigMap i włączyć harmonogram Kubernetes w celu ponownego uruchomienia usługi CoreDNS bez przestoju, wykonaj ponowne uruchomienie stopniowe przy użyciu polecenia kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns 
    

Domeny wycinków

CoreDNS można również użyć do konfigurowania domen wycinków.

  1. Utwórz plik o nazwie corednsms.yaml i wklej następującą przykładową konfigurację. Pamiętaj, aby zaktualizować domeny niestandardowe i adresy IP przy użyciu wartości dla własnego środowiska.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: | # you may select any name here, but it must end with the .server file extension
        abc.com:53 {
         errors
         cache 30
         forward . 1.2.3.4
        }
        my.cluster.local:53 {
            errors
            cache 30
            forward . 2.3.4.5
        }
    
    
  2. Utwórz ConfigMap przy użyciu kubectl apply configmap polecenia i określ nazwę manifestu YAML.

    kubectl apply -f corednsms.yaml
    
  3. Aby ponownie załadować narzędzie ConfigMap i włączyć harmonogram Kubernetes w celu ponownego uruchomienia usługi CoreDNS bez przestoju, wykonaj ponowne uruchomienie stopniowe przy użyciu polecenia kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Wtyczka hostów

Wszystkie wbudowane wtyczki są obsługiwane, więc wtyczka hostów CoreDNS jest dostępna do dostosowywania /etc/hosts, jak również.

  1. Utwórz plik o nazwie corednsms.yaml i wklej następującą przykładową konfigurację. Pamiętaj, aby zaktualizować adresy IP i nazwy hostów przy użyciu wartości dla własnego środowiska.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom # this is the name of the configmap you can overwrite with your changes
      namespace: kube-system
    data:
        test.override: | # you may select any name here, but it must end with the .override file extension
              hosts { 
                  10.0.0.1 example1.org
                  10.0.0.2 example2.org
                  10.0.0.3 example3.org
                  fallthrough
              }
    
  2. Utwórz ConfigMap przy użyciu kubectl apply configmap polecenia i określ nazwę manifestu YAML.

    kubectl apply -f corednsms.yaml
    
  3. Aby ponownie załadować narzędzie ConfigMap i włączyć harmonogram Kubernetes w celu ponownego uruchomienia usługi CoreDNS bez przestoju, wykonaj ponowne uruchomienie stopniowe przy użyciu polecenia kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Nieprawidłowe ukończenie domeny wyszukiwania dla internal.cloudapp.net i reddog.microsoft.com

Usługa Azure DNS konfiguruje domyślną domenę <vnetId>.<region>.internal.cloudapp.net wyszukiwania w sieciach wirtualnych przy użyciu usługi Azure DNS i niefunkcjonalne łączniki reddog.microsoft.com w sieciach wirtualnych przy użyciu niestandardowych serwerów DNS (zobacz dokumentację rozpoznawania nazw zasobów, aby uzyskać więcej informacji). Platforma Kubernetes konfiguruje ustawienia dns zasobnika, ndots: 5 aby prawidłowo obsługiwać rozpoznawanie nazw hostów usługi klastra. Te dwie konfiguracje łączą się, aby spowodować nieprawidłowe zapytania uzupełniania domeny wyszukiwania, które nigdy nie powiedzie się wysyłane do nadrzędnych serwerów nazw, podczas gdy system przetwarza za pośrednictwem listy wyszukiwania domen. Te nieprawidłowe zapytania powodują opóźnienia rozpoznawania nazw i mogą powodować dodatkowe obciążenie na nadrzędnych serwerach DNS.

Począwszy od wersji 20241025 AKS usługa AKS konfiguruje uwierzytelnianie CoreDNS do odpowiadania za pomocą serwera NXDOMAIN w następujących dwóch przypadkach, aby zapobiec przesłaniu tych nieprawidłowych zapytań uzupełniania domeny wyszukiwania do nadrzędnego systemu DNS:

  • Każde zapytanie dotyczące domeny głównej lub poddomeny .reddog.microsoft.com
  • Każde zapytanie dotyczące poddomeny, internal.cloudapp.net która ma siedem lub więcej etykiet w nazwie domeny.
    • Ta konfiguracja umożliwia rozpoznawanie maszyn wirtualnych według nazwy hosta w dalszym ciągu powodzenie. Na przykład usługa CoreDNS wysyła aks12345.myvnetid.myregion.internal.cloudapp.net (6 etykiet) do usługi Azure DNS, ale odrzuca mcr.microsoft.com.myvnetid.myregion.internal.cloudapp.net (8 etykiet)

Ten blok jest implementowany w domyślnym bloku serwera w pliku Corefile klastra. W razie potrzeby tę konfigurację odrzucenia można wyłączyć, tworząc niestandardowe bloki serwera dla odpowiedniej domeny z włączoną wtyczką przesyłania dalej:

  1. Utwórz plik o nazwie corednsms.yaml i wklej następującą przykładową konfigurację. Pamiętaj, aby zaktualizować adresy IP i nazwy hostów przy użyciu wartości dla własnego środowiska.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom # this is the name of the configmap you can overwrite with your changes
      namespace: kube-system
    data:
        override-block.server:
           internal.cloudapp.net:53 {
               errors
               cache 30
               forward . /etc/resolv.conf
           }
           reddog.microsoft.com:53 {
               errors
               cache 30
               forward . /etc/resolv.conf
           }
    
  2. Utwórz ConfigMap przy użyciu kubectl apply configmap polecenia i określ nazwę manifestu YAML.

    kubectl apply -f corednsms.yaml
    
  3. Aby ponownie załadować narzędzie ConfigMap i włączyć harmonogram Kubernetes w celu ponownego uruchomienia usługi CoreDNS bez przestoju, wykonaj ponowne uruchomienie stopniowe przy użyciu polecenia kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Rozwiązywanie problemów

Ogólne kroki rozwiązywania problemów z siecią CoreDNS, takie jak sprawdzanie punktów końcowych lub rozpoznawania, zobacz Debugowanie rozpoznawania nazw DNS.

Konfigurowanie skalowania zasobników CoreDNS

Nagłe skoki ruchu DNS w klastrach usługi AKS są typowym wystąpieniem ze względu na elastyczność zapewnianą przez usługę AKS dla obciążeń. Te skoki mogą prowadzić do wzrostu zużycia pamięci przez zasobniki CoreDNS. W niektórych przypadkach zwiększone zużycie pamięci może powodować Out of memory problemy. Aby wyprzedać ten problem, klastry usługi AKS automatycznie skalują zasobniki CoreDNS w celu zmniejszenia użycia pamięci na zasobnik. Domyślne ustawienia tej logiki automatycznego skalowania są przechowywane w coredns-autoscaler ConfigMap. Można jednak zauważyć, że domyślne automatyczne skalowanie zasobników CoreDNS nie zawsze jest wystarczająco agresywne, aby zapobiec Out of memory problemom z zasobnikami CoreDNS. W takim przypadku można bezpośrednio zmodyfikować coredns-autoscaler ConfigMap. Należy pamiętać, że po prostu zwiększenie liczby zasobników CoreDNS bez rozwiązywania głównej przyczyny problemu Out of memory może zapewnić tylko tymczasową poprawkę. Jeśli w węzłach, w których są uruchomione zasobniki CoreDNS, za mało pamięci, zwiększenie liczby zasobników CoreDNS nie pomoże. Może być konieczne zbadanie dalszych i zaimplementowanie odpowiednich rozwiązań, takich jak optymalizacja użycia zasobów, dostosowanie żądań zasobów i limitów lub dodanie większej ilości pamięci do węzłów.

W przypadku automatycznego skalowania zasobników coreDNS używana jest funkcja automatycznego skalowania w klastrze poziomym. coredns-autoscaler ConfigMap można edytować, aby skonfigurować logikę skalowania dla liczby zasobników CoreDNS. Narzędzie coredns-autoscaler ConfigMap obsługuje obecnie dwie różne wartości klucza ConfigMap: linear i ladder odpowiadające dwóm obsługiwanym trybom sterowania. Kontroler linear zwraca liczbę replik w zakresie [min,max] odpowiadającym max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) ). Kontroler ladder oblicza liczbę replik, konsultując dwie różne funkcje kroków, jedną dla skalowania rdzeni, a drugą dla skalowania węzłów, co daje maksymalną wartość dwóch replik. Aby uzyskać więcej informacji na temat trybów sterowania i formatu ConfigMap, zapoznaj się z dokumentacją nadrzędną.

Ważne

Zalecane jest co najmniej 2 repliki zasobników CoreDNS na klaster. Skonfigurowanie co najmniej 1 repliki zasobnika CoreDNS może spowodować awarie podczas operacji wymagających opróżniania węzłów, takich jak operacje uaktualniania klastra.

Aby pobrać coredns-autoscaler ConfigMap, możesz uruchomić kubectl get configmap coredns-autoscaler -n kube-system -o yaml polecenie, które zwróci następujące polecenie:

apiVersion: v1
data:
  ladder: '{"coresToReplicas":[[1,2],[512,3],[1024,4],[2048,5]],"nodesToReplicas":[[1,2],[8,3],[16,4],[32,5]]}'
kind: ConfigMap
metadata:
  name: coredns-autoscaler
  namespace: kube-system
  resourceVersion: "..."
  creationTimestamp: "..."

Włączanie rejestrowania zapytań DNS

  1. Dodaj następującą konfigurację do niestandardowej konfiguracji coredns-custom ConfigMap:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      log.override: | # you may select any name here, but it must end with the .override file extension
            log
    
  2. Zastosuj zmiany konfiguracji i wymuś ponowne załadowanie narzędzia ConfigMap za pomocą następujących poleceń:

    # Apply configuration changes
    kubectl apply -f corednsms.yaml
    
    # Force CoreDNS to reload the ConfigMap
    kubectl -n kube-system rollout restart deployment coredns
    
  3. Wyświetl rejestrowanie debugowania CoreDNS przy użyciu kubectl logs polecenia .

    kubectl logs --namespace kube-system -l k8s-app=kube-dns
    

Następne kroki

W tym artykule przedstawiono przykładowe scenariusze dostosowywania coreDNS. Aby uzyskać informacje na temat projektu CoreDNS, zobacz stronę projektu nadrzędnego CoreDNS.

Aby dowiedzieć się więcej na temat podstawowych pojęć dotyczących sieci, zobacz Pojęcia dotyczące sieci dla aplikacji w usłudze AKS.