Anpassen von CoreDNS mit Azure Kubernetes Service

Azure Kubernetes Service (AKS) verwendet das CoreDNS-Projekt für die Cluster-DNS-Verwaltung und die Auflösung aller Cluster der Version 1.12.x und höher. Zuvor wurde das kube-dns-Projekt verwendet. Das kube-dns-Projekt ist inzwischen jedoch veraltet. Weitere Informationen zur CoreDNS-Anpassung und zu Kubernetes finden Sie in der offiziellen Upstream-Dokumentation.

Weil AKS ein verwalteter Dienst ist, können Sie die Hauptkonfiguration für CoreDNS (ein CoreFile) nicht ändern. Stattdessen verwenden Sie eine ConfigMap von Kubernetes, um die Standardeinstellungen zu überschreiben. Um die standardmäßigen AKS CoreDNS ConfigMaps anzuzeigen, verwenden Sie den Befehl kubectl get configmaps --namespace=kube-system coredns -o yaml.

In diesem Artikel wird erläutert, wie Sie ConfigMaps für grundlegende Anpassungsoptionen von CoreDNS in AKS verwenden. Diese Vorgehensweise unterscheidet sich von der Konfiguration von CoreDNS in anderen Kontexten wie der Verwendung von CoreFile. Überprüfen Sie die verwendete Version von CoreDNS, da sich die Konfigurationswerte zwischen den Versionen ändern können.

Hinweis

kube-dns bot verschiedene Anpassungsoptionen über eine Kubernetes-Konfigurationszuordnung. CoreDNS ist nicht abwärtskompatibel zu kube-dns. Alle Anpassungen, die Sie zuvor verwendet haben, müssen für die Verwendung mit CoreDNS aktualisiert werden.

Voraussetzungen

Es wird vorausgesetzt, dass Sie über ein AKS-Cluster verfügen. Wenn Sie einen AKS-Cluster benötigen, erhalten Sie weitere Informationen im AKS-Schnellstart für die Verwendung mit der Azure-Befehlszeilenschnittstelle, PowerShell oder dem Azure-Portal.

Wenn Sie eine Konfiguration wie die in den unten aufgeführten Beispielen erstellen, müssen die Namen im Abschnitt Daten entweder auf .server oder .override enden. Diese Namenskonvention wird in der Standard-ConfigMap von AKS CoreDNS definiert, die Sie mit dem Befehl kubectl get configmaps --namespace=kube-system coredns -o yaml anzeigen können.

Was wird unterstützt/nicht unterstützt?

Alle integrierten CoreDNS-Plug-Ins werden unterstützt. Es werden keine Add-On-/Drittparteien-Plug-Ins unterstützt.

Erneutes Schreiben des DNS

Ein Szenario, das Sie durchführen müssen, sind dynamische DNS-Namensneuschreibungen. Ersetzen Sie im folgenden Beispiel <domain to be written> durch Ihren eigenen vollqualifizierten Domänennamen. Erstellen Sie eine Datei namens corednsms.yaml, und fügen Sie die folgende Beispielkonfiguration ein:

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 {
    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
    }

Wichtig

Wenn Sie zu einem DNS-Server umleiten, z. B. die CoreDNS-Dienst-IP, muss dieser DNS-Server in der Lage sein, den umgeschriebenen Domänennamen aufzulösen.

Erstellen Sie die ConfigMap mit dem Befehl kubectl apply configmap, und geben Sie den Namen Ihres YAML-Manifests an:

kubectl apply -f corednsms.yaml

Um zu prüfen, ob die Anpassungen angewendet wurden, verwenden Sie kubectl get configmaps, und geben Sie Ihre ConfigMap coredns-custom an:

kubectl get configmaps --namespace=kube-system coredns-custom -o yaml

Erzwingen Sie nun das erneute Laden der ConfigMap durch CoreDNS. Der Befehl kubectl delete pod ist nicht destruktiv und verursacht keine Ausfallzeiten. Die kube-dns-Pods werden gelöscht, und der Kubernetes Scheduler erstellt sie dann erneut. Diese neuen Pods enthalten den geänderten TTL-Wert.

kubectl delete pod --namespace kube-system -l k8s-app=kube-dns

Hinweis

Der obige Befehl ist richtig. Während wir coredns ändern, befindet sich die Bereitstellung unter der Bezeichnung kube-dns.

Benutzerdefinierter Weiterleitungsserver

Wenn Sie einen Weiterleitungsserver für den Netzwerkdatenverkehr angeben müssen, können Sie eine ConfigMap für das Anpassen von DNS erstellen. Im folgenden Beispiel aktualisieren Sie den Namen und die Adresse für den forward mit den Werten Ihrer eigenen Umgebung. Erstellen Sie eine Datei namens corednsms.yaml, und fügen Sie die folgende Beispielkonfiguration ein:

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
    }

Erstellen Sie wie im vorherigen Beispiel die ConfigMap mit dem Befehl kubectl apply configmap, und geben Sie den Namen Ihres YAML-Manifests an. Erzwingen Sie für die Neuerstellung dann mit kubectl delete pod das erneute Laden der ConfigMap durch CoreDNS für den Kubernetes Scheduler:

kubectl apply -f corednsms.yaml
kubectl delete pod --namespace kube-system --selector k8s-app=kube-dns

Verwenden benutzerdefinierter Domänen

Sie sollten benutzerdefinierte Domänen konfigurieren, die nur intern aufgelöst werden können. Sie sollten z. B. die benutzerdefinierte Domäne puglife.local auflösen, die keine gültige Domäne der obersten Ebene ist. Ohne eine ConfigMap für benutzerdefinierte Domänen kann der AKS-Cluster die Adresse nicht auflösen.

Aktualisieren Sie im folgenden Beispiel die benutzerdefinierte Domäne und IP-Adresse, um Datenverkehr mit den Werten für Ihre eigene Umgebung dorthin zu leiten. Erstellen Sie eine Datei namens corednsms.yaml, und fügen Sie die folgende Beispielkonfiguration ein:

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
    }

Erstellen Sie wie im vorherigen Beispiel die ConfigMap mit dem Befehl kubectl apply configmap, und geben Sie den Namen Ihres YAML-Manifests an. Erzwingen Sie für die Neuerstellung dann mit kubectl delete pod das erneute Laden der ConfigMap durch CoreDNS für den Kubernetes Scheduler:

kubectl apply -f corednsms.yaml
kubectl delete pod --namespace kube-system --selector k8s-app=kube-dns

Stubdomänen

CoreDNS kann auch für das Konfigurieren von Stubdomänen verwendet werden. Aktualisieren Sie im folgenden Beispiel die benutzerdefinierten Domänen und IP-Adressen mit den Werten Ihrer eigenen Umgebung. Erstellen Sie eine Datei namens corednsms.yaml, und fügen Sie die folgende Beispielkonfiguration ein:

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
    }

Erstellen Sie wie im vorherigen Beispiel die ConfigMap mit dem Befehl kubectl apply configmap, und geben Sie den Namen Ihres YAML-Manifests an. Erzwingen Sie für die Neuerstellung dann mit kubectl delete pod das erneute Laden der ConfigMap durch CoreDNS für den Kubernetes Scheduler:

kubectl apply -f corednsms.yaml
kubectl delete pod --namespace kube-system --selector k8s-app=kube-dns

Hosts-Plug-In

Da alle integrierten Plug-Ins unterstützt werden, ist das CoreDNS Hosts-Plug-In ebenfalls für die Anpassung verfügbar:

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
          }

Problembehandlung

Allgemeine Schritte zur Problembehandlung für CoreDNS, z. B. das Überprüfen der Endpunkte oder die Auflösung, finden Sie unter Debuggen der DNS-Auflösung.

Um die DNS-Abfrageprotokollierung zu aktivieren, wenden Sie die folgende Konfiguration in Ihrer coredns-custom-ConfigMap an:

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

Nachdem Sie die Konfigurationsänderungen angewandt haben, verwenden Sie den Befehl kubectl logs, um die CoreDNS-Debugprotokollierung anzuzeigen. Beispiel:

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

Nächste Schritte

In diesem Artikel wurden einige Beispielszenarios für die CoreDNS-Anpassung gezeigt. Informationen zum CoreDNS-Projekt finden Sie auf der Seite des CoreDNS-Upstream-Projekts.

Weitere Informationen zu den Kernnetzwerkkonzepten finden Sie unter Netzwerkkonzepte für Anwendungen in Azure Kubernetes Service (AKS).