So verwalten Sie DNS-Einträge von DigitalOcean Kubernetes mithilfe von ExternalDNS automatisch

Der Autor hat den Free and Open Source Fund ausgewählt, um eine Spende als Teil des Write for DOnations zu erhalten. Programm.

Einführung

Bei der Bereitstellung von Webanwendungen auf Kubernetes verwenden Sie normalerweise Services und Ingresses, um Anwendungen außerhalb des Clusters auf Ihrem bereitzustellen gewünschte Domain. Dazu müssen Sie nicht nur Ingress, sondern auch die DNS-Einträge bei Ihrem Provider manuell konfigurieren. Dies kann zeitaufwändig und fehleranfällig sein. Dies kann zu einem Hindernis werden, da Ihre Anwendung immer komplexer wird. Wenn sich die externe IP ändert, müssen die DNS-Einträge entsprechend aktualisiert werden.

Um dies zu überwinden, hat das Team von Kubernetes sig-network ExternalDNS erstellt. zum automatischen Verwalten externer DNS-Einträge innerhalb eines Kubernetes-Clusters. Einmal bereitgestellt, arbeitet ExternalDNS im Hintergrund und erfordert fast keine zusätzliche Konfiguration. Bei jeder Erstellung oder Änderung eines Dienstes oder Eingangs aktualisiert ExternalDNS die Datensätze sofort.

In diesem Lernprogramm installieren Sie ExternalDNS über Helm auf Ihrem DigitalOcean Kubernetes -Cluster und konfigurieren es für die Verwendung von DigitalOcean als DNS-Anbieter. Anschließend stellen Sie eine Beispiel-Web-App mit einem Ingress bereit und verweisen mithilfe von ExternalDNS auf Ihren Domain-Namen. Am Ende steht ein automatisiertes DNS-Datensatzverwaltungssystem für Services und Ingresses zur Verfügung.

Voraussetzungen

  • Ein DigitalOcean Kubernetes-Cluster, in dem Ihre Verbindung als "+ kubectl " - Standard konfiguriert ist. Anweisungen zum Konfigurieren von " kubectl +" finden Sie beim Erstellen des Clusters unter dem Schritt "Mit dem Cluster verbinden". Informationen zum Erstellen eines Kubernetes-Clusters in DigitalOcean finden Sie unter Kubernetes Quickstart.

  • Der Helm-Paket-Manager ist auf Ihrem lokalen Computer installiert, und Tiller ist auf Ihrem Cluster installiert. Führen Sie dazu die Schritte 1 und 2 unter https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clusters-with-the-helm-package-manager[How aus So installieren Sie Software auf Kubernetes-Clustern mit dem Tutorial "Helm Package Manager".

  • Der Nginx Ingress Controller, der mithilfe von Helm auf Ihrem Cluster installiert wurde, um ExternalDNS mit Ingress Resources zu verwenden. Folgen Sie dazu How to Set up an Nginx Ingress auf DigitalOcean Kubernetes Using Helm. Sie müssen die Eigenschaft "+ publishService " gemäß den Anweisungen in Schritt 2 auf " true +" setzen.

  • Ein DigitalOcean-API-Schlüssel (Personal Access Token) mit Lese- und Schreibberechtigungen. Um einen zu erstellen, besuchen Sie So erstellen Sie einen persönlichen Zugriffstoken.

  • Ein vollständig registrierter Domainname. In diesem Tutorial wird durchgehend "++" verwendet. Sie können einen Domain-Namen unter Namecheap erwerben, einen kostenlosen unter Freenom oder Verwenden Sie den Domain-Registrar Ihrer Wahl.

Schritt 1 - Installieren von ExternalDNS mit Helm

In diesem Abschnitt installieren Sie ExternalDNS mithilfe von Helm auf Ihrem Cluster und konfigurieren es für die Zusammenarbeit mit dem DigitalOcean-DNS-Dienst.

Um einige der Standardeinstellungen des ExternalDNS-Helm-Diagramms zu überschreiben, müssen Sie eine + values.yaml + -Datei erstellen, die Sie während der Installation an Helm übergeben. Erstellen Sie auf dem Computer, auf dem Sie unter den Voraussetzungen auf Ihren Cluster zugreifen, die Datei, indem Sie Folgendes ausführen:

nano externaldns-values.yaml

Fügen Sie die folgenden Zeilen hinzu:

externaldns-values.yaml

rbac:
 create: true

provider: digitalocean

digitalocean:
 apiToken:

interval: "1m"

policy: sync # or upsert-only

# domainFilters: [ '' ]

Im ersten Block aktivieren Sie die Manifesterstellung RBAC (Role Based Access Control), die auf RBAC-fähigen Kubernetes-Clustern wie z. B. aktiviert sein muss DigitalOcean. In der nächsten Zeile legen Sie den DNS-Dienstanbieter auf DigitalOcean fest. Anschließend fügen Sie im nächsten Block Ihr DigitalOcean-API-Token hinzu, indem Sie "++" ersetzen.

In der nächsten Zeile wird das Intervall festgelegt, in dem ExternalDNS nach Änderungen an Ingresses und Services sucht. Sie können einen niedrigeren Wert festlegen, um Änderungen an Ihrem DNS schneller zu verbreiten.

Die Einstellung "+ Richtlinie" legt fest, ob der externe DNS nur DNS-Einträge einfügt ("+ nur umkehren" ) oder diese nach Bedarf erstellt und löscht (" synchronisieren" + "). Zum Glück unterstützt ExternalDNS seit Version 0.3 das Konzept der Inhaberschaft, indem es begleitende TXT -Datensätze erstellt, in denen Informationen zu den von ihm erstellten Domänen gespeichert werden diejenigen, die es geschaffen hat.

Der Parameter + domainFilters + wird verwendet, um die Domänen einzuschränken, die ExternalDNS verwalten kann. Sie können das Kommentarzeichen entfernen und Ihre Domains in Form eines String-Arrays eingeben. Dies ist jedoch nicht erforderlich.

Speichern und schließen Sie die Datei, wenn Sie mit der Bearbeitung fertig sind.

Installieren Sie nun ExternalDNS in Ihrem Cluster, indem Sie den folgenden Befehl ausführen:

helm install stable/external-dns --name external-dns -f externaldns-values.yaml

Die Ausgabe sieht ungefähr so ​​aus:

OutputNAME:   external-dns
LAST DEPLOYED: ...
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Pod(related)
NAME                           READY  STATUS             RESTARTS  AGE
external-dns-69c545655f-xqjjf  0/1    ContainerCreating  0         0s

==> v1/Secret
NAME          TYPE    DATA  AGE
external-dns  Opaque  1     0s

==> v1/Service
NAME          TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)   AGE
external-dns  ClusterIP    <none>       7979/TCP  0s

==> v1/ServiceAccount
NAME          SECRETS  AGE
external-dns  1        0s

==> v1beta1/ClusterRole
NAME          AGE
external-dns  0s

==> v1beta1/ClusterRoleBinding
NAME          AGE
external-dns  0s

==> v1beta1/Deployment
NAME          READY  UP-TO-DATE  AVAILABLE  AGE
external-dns  0/1    1           0          0s


NOTES:
...

Sie können die ExternalDNS-Erstellung überprüfen, indem Sie den folgenden Befehl ausführen:

kubectl --namespace=default get pods -l "app=external-dns,release=external-dns" -w
OutputNAME                            READY   STATUS              RESTARTS   AGE
external-dns-69bfcf8ccb-7j4hp   0/1        0          3s

Sie haben ExternalDNS auf Ihrem Kubernetes-Cluster installiert. Als Nächstes stellen Sie eine Beispiel-Web-App bereit, machen sie mit einem Nginx Ingress verfügbar und lassen ExternalDNS Ihren Domain-Namen automatisch auf den entsprechenden Load Balancer verweisen.

Schritt 2 - Bereitstellen und Bereitstellen einer Beispiel-Webanwendung

In diesem Abschnitt stellen Sie eine Dummy-Web-App für Ihren Cluster bereit, um sie mithilfe von Ingress verfügbar zu machen. Anschließend richten Sie ExternalDNS so ein, dass DNS-Einträge automatisch für Sie konfiguriert werden. Am Ende haben Sie DNS-Einträge für Ihre Domain, die auf den Load Balancer des Ingress verweisen.

Die Dummy-Webanwendung, die Sie bereitstellen, ist https://hub.docker.com/r/hashicorp/http-echo/ [+ http-echo +] von Hashicorp. Es handelt sich um einen In-Memory-Webserver, der die von Ihnen übermittelte Nachricht wiedergibt. Sie speichern die Kubernetes-Manifeste in einer Datei mit dem Namen "+ echo.yaml +". Erstelle es und öffne es zum Bearbeiten:

nano echo.yaml

Fügen Sie Ihrer Datei die folgenden Zeilen hinzu:

echo.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: echo-ingress
spec:
 rules:
 - host:
   http:
     paths:
     - backend:
         serviceName: echo
         servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
 name: echo
spec:
 ports:
 - port: 80
   targetPort: 5678
 selector:
   app: echo
---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: echo
spec:
 selector:
   matchLabels:
     app: echo
 replicas: 3
 template:
   metadata:
     labels:
       app: echo
   spec:
     containers:
     - name: echo
       image: hashicorp/http-echo
       args:
       - "-text=Echo!"
       ports:
       - containerPort: 5678

In dieser Konfiguration definieren Sie ein Deployment, ein Ingress und einen Service. Die Bereitstellung besteht aus drei Replikaten der App "+ http-echo ", an die eine benutzerdefinierte Nachricht (" Echo! ") Übergeben wurde. Der Service ist so definiert, dass der Zugriff auf die Pods im Deployment über den Port " 80 +" möglich ist. Ingress ist so konfiguriert, dass der Dienst in Ihrer Domain verfügbar gemacht wird.

Ersetzen Sie ++ durch Ihre Domain, speichern und schließen Sie die Datei.

Jetzt müssen Sie die DNS-Einträge für die Domäne nicht mehr manuell konfigurieren. ExternalDNS wird dies automatisch tun, sobald Sie die Konfiguration auf Kubernetes anwenden.

Führen Sie den folgenden Befehl aus, um die Konfiguration anzuwenden:

kubectl create -f echo.yaml

Sie sehen die folgende Ausgabe:

Outputingress.extensions/echo-ingress created
service/echo created
deployment.apps/echo created

Sie müssen eine kurze Zeit warten, bis ExternalDNS die Änderungen bemerkt und die entsprechenden DNS-Einträge erstellt hat. Die Einstellung "+ Intervall " im Helm-Diagramm bestimmt, wie lange Sie auf die Erstellung Ihres DNS-Eintrags warten müssen. In ` values.yaml +` ist die Intervalllänge standardmäßig auf 1 Minute eingestellt.

Sie können Ihr DigitalOcean Control Panel besuchen, um einen A- und TXT-Datensatz anzuzeigen.

image: https://assets.digitalocean.com/articles/kubernetes_externaldns/externaldns.png [Systemsteuerung - Generierte DNS-Einträge]

Wenn das angegebene Zeitintervall abgelaufen ist, greifen Sie mit + curl + auf Ihre Domain zu:

curl

Sie sehen die folgende Ausgabe:

OutputEcho!

Diese Meldung bestätigt, dass Sie ExternalDNS konfiguriert und die erforderlichen DNS-Einträge erstellt haben, um auf den Load Balancer des Nginx Ingress Controllers zu verweisen. Wenn Sie eine Fehlermeldung sehen, geben Sie ihr etwas Zeit. Sie können auch versuchen, über Ihren Browser auf Ihre Domain zuzugreifen. Dort wird "+ Echo! +" Angezeigt.

Sie haben ExternalDNS getestet, indem Sie eine Beispiel-App mit einem Ingress bereitgestellt haben. Sie können die neuen DNS-Einträge auch in Ihrer DigitalOcean-Systemsteuerung anzeigen. Im nächsten Schritt legen Sie den Service unter Ihrem Domain-Namen offen.

Schritt 3 - (Optional) Offenlegen der App mithilfe eines Dienstes

In diesem optionalen Abschnitt verwenden Sie Dienste mit ExternalDNS anstelle von Ingresses. Mit ExternalDNS können Sie DNS-Servern verschiedene Kubernetes-Ressourcen zur Verfügung stellen. Das Verwenden von Diensten ähnelt Ingresses, wobei die Konfiguration für diese alternative Ressource geändert wurde.

Da Sie den in "+ echo.yaml " enthaltenen Service anpassen, benötigen Sie den " echo-ingress +" nicht mehr. Löschen Sie es mit dem folgenden Befehl:

kubectl delete ing echo-ingress

Die Ausgabe wird sein:

Outputingress.extensions/echo-ingress deleted

ExternalDNS löscht die vorhandenen DNS-Einträge, die im vorherigen Schritt erstellt wurden. Im Rest des Schritts können Sie dieselbe Domain verwenden, die Sie zuvor verwendet haben.

Öffnen Sie als nächstes die Datei "+ echo.yaml +" zum Bearbeiten:

nano echo.yaml

Ersetzen Sie den Dateiinhalt durch die folgenden Zeilen:

echo.yaml

apiVersion: v1
kind: Service
metadata:
 name: echo


spec:

 ports:
 - port: 80
   targetPort: 5678
 selector:
   app: echo
---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: echo
spec:
 selector:
   matchLabels:
     app: echo
 replicas: 3
 template:
   metadata:
     labels:
       app: echo
   spec:
     containers:
     - name: echo
       image: hashicorp/http-echo
       args:
       - "-text=Echo!"
       ports:
       - containerPort: 5678

Sie haben Ingress aus der Datei für die vorherige Einrichtung entfernt und den Diensttyp in "+ LoadBalancer +" geändert. Darüber hinaus haben Sie eine Anmerkung hinzugefügt, in der der Domänenname für ExternalDNS angegeben ist.

Übernehmen Sie die Änderungen in Ihren Cluster, indem Sie den folgenden Befehl ausführen:

kubectl apply -f echo.yaml

Die Ausgabe wird sein:

Outputservice/echo configured
deployment.apps/echo configured

Sie können sehen, wie der Load Balancer des Dienstes verfügbar wird, indem Sie Folgendes ausführen:

kubectl get svc echo -w

Sie sehen eine Ausgabe ähnlich der folgenden:

OutputNAME   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
echo   LoadBalancer   10.245.81.235   <pending>     80:31814/TCP   8s
...

Wie im vorherigen Schritt müssen Sie einige Zeit warten, bis die DNS-Einträge erstellt und weitergegeben wurden. Sobald dies erledigt ist, "+ curl +" die Domain, die Sie angegeben haben:

curl

Die Ausgabe entspricht dem vorherigen Schritt:

OutputEcho!

Wenn Sie eine Fehlermeldung erhalten, warten Sie etwas länger oder versuchen Sie es mit einer anderen Domain. Da DNS-Einträge auf Client-Systemen zwischengespeichert werden, kann es lange dauern, bis die Änderungen tatsächlich übertragen werden.

In diesem Schritt haben Sie einen Dienst (vom Typ "+ LoadBalancer +") erstellt und ihn mithilfe von ExternalDNS auf Ihren Domainnamen verwiesen.

Fazit

ExternalDNS arbeitet geräuschlos im Hintergrund und bietet ein reibungsloses Erlebnis. Ihr Kubernetes-Cluster ist in Bezug auf die Domänen zur zentralen Informationsquelle geworden. Sie müssen DNS-Einträge nicht mehr manuell aktualisieren.

Die wahre Leistungsfähigkeit von ExternalDNS wird deutlich, wenn Sie Testumgebungen aus einem Continuous Delivery-System erstellen. Wenn Sie ein solches System in Ihrem Kubernetes-Cluster einrichten möchten, besuchen Sie https://www.digitalocean.com/community/tutorials/how-to-set-up-a-cd-pipeline-with-spinnaker-on-digitalocean -kubernetes [So richten Sie eine CD-Pipeline mit Spinnaker auf DigitalOcean-Kubernetes ein].

Related