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