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