Comment gérer automatiquement les enregistrements DNS de DigitalOcean Kubernetes à l’aide de ExternalDNS

L’auteur a sélectionné le Free and Open Source pour recevoir un don dans le cadre du Write for DOnations programme.

introduction

Lorsque vous déployez des applications Web sur Kubernetes, vous utilisez généralement Services et Ingresses pour exposer les applications au-delà du cluster à votre domaine souhaité. Cela implique la configuration manuelle non seulement de l’Ingress, mais également des enregistrements DNS de votre fournisseur, ce qui peut être un processus long et sujet aux erreurs. Cela peut devenir un obstacle lorsque votre application devient de plus en plus complexe. lorsque l’adresse IP externe change, il est nécessaire de mettre à jour les enregistrements DNS en conséquence.

Pour remédier à cela, l’équipe sig-network a créé ExternalDNS. dans le but de gérer automatiquement les enregistrements DNS externes à partir d’un cluster Kubernetes. Une fois déployé, ExternalDNS fonctionne en arrière-plan et ne nécessite presque aucune configuration supplémentaire. Lorsqu’un service ou une entrée est créé ou modifié, ExternalDNS met immédiatement à jour les enregistrements.

Dans ce didacticiel, vous allez installer ExternalDNS sur votre cluster DigitalOcean Kubernetes via Helm et le configurer pour utiliser DigitalOcean en tant que fournisseur DNS. Ensuite, vous allez déployer un exemple d’application Web avec une entrée et utiliser ExternalDNS pour le diriger vers votre nom de domaine. À la fin, vous aurez un système automatisé de gestion des enregistrements DNS en place pour les services et les entrées.

Conditions préalables

  • Un cluster DigitalOcean Kubernetes avec votre connexion configurée avec la valeur par défaut + kubectl +. Les instructions sur la façon de configurer + kubectl + sont indiquées dans l’étape * Connexion à votre cluster * lorsque vous créez votre cluster. Pour créer un cluster Kubernetes sur DigitalOcean, voir Kubernetes Quickstart.

  • Le gestionnaire de paquets Helm installé sur votre ordinateur local et Tiller installé sur votre cluster. Pour ce faire, effectuez les étapes 1 et 2 de la How Pour installer le logiciel sur les clusters Kubernetes avec le gestionnaire de paquets Helm.

  • Nginx Ingress Controller installé sur votre cluster à l’aide de Helm afin d’utiliser ExternalDNS avec Ingress Resources. Pour ce faire, suivez Comment configurer une entrée de Nginx sur DigitalOcean Kubernetes à l’aide de Helm. Vous devez définir la propriété + publishService + sur + true + conformément aux instructions de l’étape 2.

  • Une clé d’API DigitalOcean (jeton d’accès personnel) avec des autorisations de lecture et d’écriture. Pour en créer un, visitez le site Comment créer un jeton d’accès personnel.

  • Un nom de domaine entièrement enregistré. Ce tutoriel utilisera ++ tout au long. Vous pouvez acheter un nom de domaine sur Namecheap, en obtenir un gratuitement sur Freenom, ou utilisez le registraire de domaine de votre choix.

Étape 1 - Installation de ExternalDNS à l’aide de Helm

Dans cette section, vous allez installer ExternalDNS sur votre cluster à l’aide de Helm et le configurer pour qu’il fonctionne avec le service DNS DigitalOcean.

Pour remplacer certains des paramètres par défaut du diagramme ExternalDNS Helm, vous devez créer un fichier + values.yaml + que vous transmettrez à Helm lors de l’installation. Sur la machine utilisée pour accéder à votre cluster dans les conditions préalables, créez le fichier en exécutant:

nano externaldns-values.yaml

Ajoutez les lignes suivantes:

externaldns-values.yaml

rbac:
 create: true

provider: digitalocean

digitalocean:
 apiToken:

interval: "1m"

policy: sync # or upsert-only

# domainFilters: [ '' ]

Dans le premier bloc, vous activez la création de manifeste RBAC (contrôle basé sur le rôle), qui doit être activé sur les clusters Kubernetes activés par RBAC comme DigitalOcean. Sur la ligne suivante, vous définissez le fournisseur de service DNS sur DigitalOcean. Ensuite, dans le bloc suivant, vous ajouterez votre jeton d’API DigitalOcean en remplaçant «++».

La ligne suivante définit l’intervalle auquel ExternalDNS interrogera les modifications apportées aux entrées et aux services. Vous pouvez définir une valeur inférieure pour propager plus rapidement les modifications apportées à votre DNS.

Le paramètre + policy détermine si le DNS externe insérera uniquement les enregistrements DNS (` + upsert-only + ) ou les créera et les supprimera au besoin ( + sync + `). Heureusement, depuis la version 0.3, ExternalDNS soutient le concept de propriété en créant des enregistrements d’accompagnement TXT dans lesquels il stocke des informations sur les domaines qu’il crée, limitant ainsi son champ d’action ceux qu’il a créés.

Le paramètre + domainFilters + est utilisé pour limiter les domaines que ExternalDNS peut gérer. Vous pouvez supprimer le commentaire et entrer vos domaines sous la forme d’un tableau de chaînes, mais ce n’est pas nécessaire.

Lorsque vous avez terminé, enregistrez et fermez le fichier.

Maintenant, installez ExternalDNS sur votre cluster en exécutant la commande suivante:

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

La sortie ressemblera à ce qui suit:

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

Vous pouvez vérifier la création de ExternalDNS en exécutant la commande suivante:

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

Vous avez installé ExternalDNS sur votre cluster Kubernetes. Ensuite, vous allez déployer un exemple d’application Web, l’exposer à l’aide de Nginx Ingress et laisser ExternalDNS diriger automatiquement votre nom de domaine vers l’équilibreur de charge approprié.

Étape 2 - Déploiement et exposition d’un exemple d’application Web

Dans cette section, vous allez déployer une application Web fictive sur votre cluster afin de l’exposer à l’aide de votre entrée. Ensuite, vous configurerez ExternalDNS pour configurer automatiquement les enregistrements DNS pour vous. À la fin, les enregistrements DNS de votre domaine seront dirigés vers l’équilibreur de charge de l’entrée.

L’application factice que vous allez déployer est https://hub.docker.com/r/hashicorp/http-echo/ [+ http-echo +] de Hashicorp. C’est un serveur Web en mémoire qui renvoie le message que vous lui transmettez. Vous allez stocker ses manifestes Kubernetes dans un fichier nommé + echo.yaml +. Créez-le et ouvrez-le pour édition:

nano echo.yaml

Ajoutez les lignes suivantes à votre fichier:

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

Dans cette configuration, vous définissez un déploiement, une entrée et un service. Le déploiement consiste en trois répliques de l’application + http-echo +, avec un message personnalisé (+ Echo! +) Transmis. Le service est défini pour permettre l’accès aux pods dans le déploiement via le port + 80 +. Ingress est configuré pour exposer le service sur votre domaine.

Remplacez ++ par votre domaine, puis enregistrez et fermez le fichier.

Désormais, vous n’avez plus besoin de configurer manuellement les enregistrements DNS du domaine. ExternalDNS le fera automatiquement dès que vous appliquez la configuration à Kubernetes.

Pour appliquer la configuration, exécutez la commande suivante:

kubectl create -f echo.yaml

Vous verrez le résultat suivant:

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

Vous devrez attendre un court instant pour qu’ExternalDNS remarque les modifications et crée les enregistrements DNS appropriés. Le paramètre + intervalle + dans le tableau Helm détermine la durée de l’attente de la création de votre enregistrement DNS. Dans + values.yaml +, la durée de l’intervalle est définie à 1 minute par défaut.

Vous pouvez visiter votre panneau de configuration DigitalOcean pour voir un enregistrement A et TXT.

image: https: //assets.digitalocean.com/articles/kubernetes_externaldns/externaldns.png [Panneau de configuration - Enregistrements DNS générés]

Une fois l’intervalle de temps spécifié écoulé, accédez à votre domaine en utilisant + curl +:

curl

Vous verrez le résultat suivant:

OutputEcho!

Ce message confirme que vous avez configuré ExternalDNS et créé les enregistrements DNS nécessaires pour pointer vers l’équilibreur de charge du contrôleur Nginx Ingress Controller. Si vous voyez un message d’erreur, donnez-lui un peu de temps. Vous pouvez également essayer d’accéder à votre domaine à partir de votre navigateur, où vous verrez «+ Echo! +».

Vous avez testé ExternalDNS en déployant un exemple d’application avec Ingress. Vous pouvez également observer les nouveaux enregistrements DNS dans votre panneau de configuration DigitalOcean. Dans l’étape suivante, vous exposerez le service sous votre nom de domaine.

Étape 3 - (Facultatif) Exposer l’application à l’aide d’un service

Dans cette section facultative, vous utiliserez des services avec ExternalDNS au lieu de Ingresses. ExternalDNS vous permet de mettre différentes ressources Kubernetes à la disposition des serveurs DNS. L’utilisation des services est un processus similaire à Ingresses avec la configuration modifiée pour cette ressource alternative.

Puisque vous allez personnaliser le service contenu dans + echo.yaml +, vous n’avez plus besoin du + echo-ingress +. Supprimez-le à l’aide de la commande suivante:

kubectl delete ing echo-ingress

La sortie sera:

Outputingress.extensions/echo-ingress deleted

ExternalDNS supprimera les enregistrements DNS existants créés à l’étape précédente. Dans la suite de l’étape, vous pouvez utiliser le même domaine que vous avez utilisé auparavant.

Ensuite, ouvrez le fichier + echo.yaml + pour le modifier:

nano echo.yaml

Remplacez le contenu du fichier par les lignes suivantes:

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

Vous avez supprimé Ingress du fichier de la configuration précédente et modifié le type de service en + LoadBalancer +. De plus, vous avez ajouté une annotation spécifiant le nom de domaine pour ExternalDNS.

Appliquez les modifications à votre cluster en exécutant la commande suivante:

kubectl apply -f echo.yaml

La sortie sera:

Outputservice/echo configured
deployment.apps/echo configured

Vous pouvez voir l’équilibrage de la charge du service devenir disponible en exécutant:

kubectl get svc echo -w

Vous verrez une sortie semblable à celle-ci:

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

Comme à l’étape précédente, vous devrez attendre un certain temps pour que les enregistrements DNS soient créés et propagés. Une fois cela fait, + curl + le domaine que vous avez spécifié:

curl

La sortie sera la même qu’à l’étape précédente:

OutputEcho!

Si vous obtenez une erreur, attendez un peu plus longtemps ou essayez un autre domaine. Les enregistrements DNS étant mis en cache sur les systèmes clients, la propagation des modifications peut prendre longtemps.

Dans cette étape, vous avez créé un service (de type + LoadBalancer +) et l’avez pointé vers votre nom de domaine à l’aide de ExternalDNS.

Conclusion

ExternalDNS fonctionne en arrière-plan en silence et offre une expérience sans friction. Votre cluster Kubernetes vient de devenir la source centrale de vérité sur les domaines. Vous n’êtes plus obligé de mettre à jour manuellement les enregistrements DNS.

La puissance réelle de ExternalDNS deviendra apparente lors de la création d’environnements de test à partir d’un système à distribution continue. Si vous souhaitez configurer l’un de ces systèmes sur votre cluster Kubernetes, visitez la page https://www.digitalocean.com/community/tutorials/how-to-set-up-a-cd-pipeline-with-spinnaker-on-digitalocean. -kubernetes [Comment configurer un pipeline de CD avec Spinnaker sur Kubernetes DigitalOcean].

Related