Sdílet prostřednictvím


Přizpůsobení CoreDNS pomocí služby Azure Kubernetes Service

Azure Kubernetes Service (AKS) používá projekt CoreDNS pro správu a překlad DNS clusteru se všemi clustery 1.12.x a vyššími. Další informace o přizpůsobení CoreDNS a Kubernetes najdete v oficiální upstreamové dokumentaci.

AKS je spravovaná služba, takže nemůžete upravit hlavní konfiguraci coreDNS ( CoreFile). Místo toho použijete objekt ConfigMap Kubernetes k přepsání výchozího nastavení. Pokud chcete zobrazit výchozí objekty ConfigMap AKS CoreDNS, použijte kubectl get configmaps --namespace=kube-system coredns -o yaml tento příkaz.

V tomto článku se dozvíte, jak používat Objekty ConfigMap pro základní možnosti přizpůsobení CoreDNS v AKS. Tento přístup se liší od konfigurace CoreDNS v jiných kontextech, jako je CoreFile.

Poznámka:

Dříve se kube-dns používal ke správě a překladu DNS clusteru, ale už je zastaralý. kube-dns nabízí různé možnosti přizpůsobení prostřednictvím mapy konfigurace Kubernetes. CoreDNS není zpětně kompatibilní s kube-dns. Všechna vlastní nastavení, která jste použili dříve, se musí aktualizovat pro CoreDNS.

Než začnete

  • Tento článek předpokládá, že máte existující cluster AKS. Pokud potřebujete cluster AKS, můžete ho vytvořit pomocí Azure CLI, Azure PowerShellu nebo webu Azure Portal.
  • Ověřte verzi CoreDNS, kterou používáte. Hodnoty konfigurace se můžou mezi verzemi měnit.
  • Při vytváření konfigurací, jako jsou příklady níže, musí vaše názvy v datové části končit na .server nebo .override. Tato konvence vytváření názvů je definována ve výchozím objektu ConfigMap AKS CoreDNS, který můžete zobrazit pomocí kubectl get configmaps --namespace=kube-system coredns -o yaml příkazu.

Podpora modulů plug-in

Podporují se všechny integrované moduly plug-in CoreDNS. Nepodporují se žádné doplňky nebo moduly plug-in třetích stran.

Přepsání DNS

CoreDNS můžete přizpůsobit pomocí AKS, aby se přepsaly místní názvy DNS.

  1. Vytvořte soubor s názvem corednsms.yaml a vložte následující ukázkovou konfiguraci. Nezapomeňte nahradit <domain to be rewritten> vlastním plně kvalifikovaným názvem domény.

    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
        }
    

    Důležité

    Pokud přesměrujete na server DNS, například IP adresu služby CoreDNS, musí být tento server DNS schopný přeložit přepsaný název domény.

  2. Pomocí příkazu vytvořte objekt ConfigMap kubectl apply configmap a zadejte název manifestu YAML.

    kubectl apply -f corednsms.yaml
    
  3. Pomocí objektu kubectl get configmaps Coredns-custom ConfigMap ověřte, že se použila vlastní přizpůsobení.

    kubectl get configmaps --namespace=kube-system coredns-custom -o yaml
    
  4. Pokud chcete znovu načíst objekt ConfigMap a povolit Plánovač Kubernetes restartování CoreDNS bez výpadků, proveďte postupné restartování pomocí kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Vlastní předávaný server

Pokud potřebujete zadat předávaný server pro síťový provoz, můžete vytvořit objekt ConfigMap pro přizpůsobení DNS.

  1. Vytvořte soubor s názvem corednsms.yaml a vložte následující ukázkovou konfiguraci. Nezapomeňte nahradit forward název a adresu hodnotami pro vaše vlastní prostředí.

    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. Pomocí příkazu vytvořte objekt ConfigMap kubectl apply configmap a zadejte název manifestu YAML.

    kubectl apply -f corednsms.yaml
    
  3. Pokud chcete znovu načíst objekt ConfigMap a povolit Plánovač Kubernetes restartování CoreDNS bez výpadků, proveďte postupné restartování pomocí kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Použití vlastních domén

Možná budete chtít nakonfigurovat vlastní domény, které se dají vyřešit jenom interně. Můžete například chtít přeložit vlastní doménu puglife.local, což není platná doména nejvyšší úrovně. Bez objektu ConfigMap vlastní domény nemůže cluster AKS tuto adresu přeložit.

  1. Vytvořte nový soubor s názvem corednsms.yaml a vložte následující ukázkovou konfiguraci. Nezapomeňte aktualizovat vlastní doménu a IP adresu hodnotami pro vaše vlastní prostředí.

    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. Pomocí příkazu vytvořte objekt ConfigMap kubectl apply configmap a zadejte název manifestu YAML.

    kubectl apply -f corednsms.yaml
    
  3. Pokud chcete znovu načíst objekt ConfigMap a povolit Plánovač Kubernetes restartování CoreDNS bez výpadků, proveďte postupné restartování pomocí kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns 
    

Domény zástupných procedur

CoreDNS lze také použít ke konfiguraci domén zástupných procedur.

  1. Vytvořte soubor s názvem corednsms.yaml a vložte následující ukázkovou konfiguraci. Nezapomeňte aktualizovat vlastní domény a IP adresy hodnotami pro vaše vlastní prostředí.

    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. Pomocí příkazu vytvořte objekt ConfigMap kubectl apply configmap a zadejte název manifestu YAML.

    kubectl apply -f corednsms.yaml
    
  3. Pokud chcete znovu načíst objekt ConfigMap a povolit Plánovač Kubernetes restartování CoreDNS bez výpadků, proveďte postupné restartování pomocí kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Modul plug-in Hostitelé

Podporují se všechny integrované moduly plug-in, takže modul plug-in hostitelů CoreDNS je k dispozici i pro přizpůsobení /etc/hosts.

  1. Vytvořte soubor s názvem corednsms.yaml a vložte následující ukázkovou konfiguraci. Nezapomeňte aktualizovat IP adresy a názvy hostitelů hodnotami pro vaše vlastní prostředí.

    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. Pomocí příkazu vytvořte objekt ConfigMap kubectl apply configmap a zadejte název manifestu YAML.

    kubectl apply -f corednsms.yaml
    
  3. Pokud chcete znovu načíst objekt ConfigMap a povolit Plánovač Kubernetes restartování CoreDNS bez výpadků, proveďte postupné restartování pomocí kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Neplatné dokončování domény vyhledávání pro internal.cloudapp.net a reddog.microsoft.com

Azure DNS nakonfiguruje výchozí doménu <vnetId>.<region>.internal.cloudapp.net vyhledávání ve virtuálních sítích pomocí Azure DNS a nefunkční zástupný proceduru reddog.microsoft.com ve virtuálních sítích pomocí vlastních serverů DNS (další podrobnosti najdete v dokumentaci k překladu názvů prostředků). Kubernetes nakonfiguruje nastavení DNS podů tak ndots: 5 , aby správně podporovalo překlad názvů hostitelů služby clusteru. Tyto dvě konfigurace se kombinují tak, aby výsledkem byly neplatné dotazy na dokončení domény vyhledávání, které nikdy neuspěly odesílání na nadřazené názvové servery, zatímco systémové procesy procházejí seznamem hledání domény. Tyto neplatné dotazy způsobují zpoždění překladu názvů a můžou na nadřazených serverech DNS zatížit další zatížení.

Od verze AKS v20241025 nakonfiguruje AKS CoreDNS tak, aby reagoval s NXDOMAIN v následujících dvou případech, aby zabránilo přeposílání těchto neplatných dotazů na dokončování domény vyhledávání do upstreamového DNS:

  • Jakýkoli dotaz na kořenovou doménu nebo subdoménu .reddog.microsoft.com
  • Jakýkoli dotaz na subdoménu internal.cloudapp.net , která má v názvu domény sedm nebo více popisků.
    • Tato konfigurace umožňuje, aby překlad virtuálních počítačů podle názvu hostitele stále proběhl úspěšně. CoreDNS například odesílá aks12345.myvnetid.myregion.internal.cloudapp.net (6 popisků) do Azure DNS, ale odmítne mcr.microsoft.com.myvnetid.myregion.internal.cloudapp.net (8 popisků).

Tento blok se implementuje ve výchozím bloku serveru v souboru Corefile pro cluster. V případě potřeby je možné tuto konfiguraci zamítnutí zakázat vytvořením vlastních bloků serveru pro příslušnou doménu s povoleným modulem plug-in pro předávání:

  1. Vytvořte soubor s názvem corednsms.yaml a vložte následující ukázkovou konfiguraci. Nezapomeňte aktualizovat IP adresy a názvy hostitelů hodnotami pro vaše vlastní prostředí.

    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. Pomocí příkazu vytvořte objekt ConfigMap kubectl apply configmap a zadejte název manifestu YAML.

    kubectl apply -f corednsms.yaml
    
  3. Pokud chcete znovu načíst objekt ConfigMap a povolit Plánovač Kubernetes restartování CoreDNS bez výpadků, proveďte postupné restartování pomocí kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Řešení problému

Obecné kroky řešení potíží se službou CoreDNS, jako je kontrola koncových bodů nebo překladu, najdete v tématu Ladění překladu DNS.

Konfigurace škálování podů CoreDNS

Náhlé špičky provozu DNS v clusterech AKS jsou běžným výskytem kvůli elasticitě, kterou AKS poskytuje pro úlohy. Tyto špičky můžou vést ke zvýšení spotřeby paměti pody CoreDNS. V některých případech může tato zvýšená spotřeba paměti způsobit Out of memory problémy. Aby se tento problém zkrátil, clustery AKS automaticky škálují pody CoreDNS, aby se snížilo využití paměti na pod. Výchozí nastavení této logiky automatického škálování jsou uložena v objektu coredns-autoscaler ConfigMap. Můžete ale pozorovat, že výchozí automatické škálování podů CoreDNS není vždy dostatečně agresivní, aby se zabránilo Out of memory problémům s pody CoreDNS. V tomto případě můžete přímo upravit coredns-autoscaler objekt ConfigMap. Upozorňujeme, že jednoduše zvýšení počtu podů CoreDNS bez vyřešení původní příčiny Out of memory problému může poskytnout pouze dočasnou opravu. Pokud v uzlech, na kterých běží pody CoreDNS, není k dispozici dostatek paměti, zvýšení počtu podů CoreDNS nepomůže. Možná budete muset prozkoumat další a implementovat vhodná řešení, jako je optimalizace využití prostředků, úprava požadavků na prostředky a omezení nebo přidání další paměti do uzlů.

CoreDNS používá pro automatické škálování podů horizontální proporcionální automatické škálování clusteru. Konfigurační coredns-autoscaler mapu je možné upravit tak, aby konfigurovala logiku škálování pro počet podů CoreDNS. Objekt coredns-autoscaler ConfigMap aktuálně podporuje dvě různé hodnoty klíče ConfigMap: linear a ladder které odpovídají dvěma podporovaným režimům řízení. Kontroler linear poskytuje řadu replik v rozsahu [min,max] ekvivalentního rozsahu max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) ). ladder Kontroler vypočítá počet replik konzultacem se dvěma různými krokovými funkcemi, jednou pro škálování jádra a druhou pro škálování uzlu, a tím maximální hodnotu dvou replik. Další informace o režimech ovládacích prvků a formátu ConfigMap najdete v upstreamové dokumentaci.

Důležité

Doporučuje se minimálně 2 repliky podů CoreDNS na cluster. Konfigurace minimálně 1 repliky podu CoreDNS může způsobit selhání během operací, které vyžadují vyprazdňování uzlů, jako jsou operace upgradu clusteru.

Chcete-li načíst coredns-autoscaler objekt ConfigMap, můžete spustit kubectl get configmap coredns-autoscaler -n kube-system -o yaml příkaz, který vrátí následující příkaz:

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

Povolení protokolování dotazů DNS

  1. Do objektu ConfigMap pro coredns-custom přidejte následující konfiguraci:

    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. Použijte změny konfigurace a vynuťte, aby coreDNS znovu načítá ConfigMap pomocí následujících příkazů:

    # Apply configuration changes
    kubectl apply -f corednsms.yaml
    
    # Force CoreDNS to reload the ConfigMap
    kubectl -n kube-system rollout restart deployment coredns
    
  3. Pomocí příkazu zobrazte protokolování kubectl logs ladění CoreDNS.

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

Další kroky

Tento článek ukázal několik ukázkových scénářů pro přizpůsobení CoreDNS. Informace o projektu CoreDNS najdete na stránce upstreamového projektu CoreDNS.

Další informace o základních konceptech sítě najdete v tématu Koncepty sítě pro aplikace v AKS.