Publié le 5 juillet 2021, mis à jour le 21 décembre 2023.

EKS est un outil puissant pour lancer et gérer facilement un cluster Kubernetes sur AWS. Ce service vous permet d'exécuter un grand nombre d'applications dans votre cluster et s'intègre bien à d'autres services AWS tels que l’elastic load balancing. Cependant, créer et manager les enregistrements de la route 53 pour tous les endpoints dans votre cluster peut être fastidieux et prendre beaucoup de temps, c'est là que l'external DNS entre en jeu. 
Ce service va automatiquement gérer les enregistrements DNS de vos ingresses et services et va vous faire gagner de nombreuses heures sur vos projets.

Comment fonctionne External DNS ?

En bref, le ExternalDNS est un pod fonctionnant dans votre cluster EKS qui surveille tous vos ingresses. Lorsqu'il détecte un ingress avec un host spécifié, il récupère automatiquement le nom d'host ainsi que le endpoint et crée un enregistrement pour cette ressource dans Route53. Si l'host est modifié ou supprimé, ExternalDNS reflétera immédiatement le changement dans Route53.

Comment configurer External DNS dans votre Cluster ?

La configuration peut être divisée en deux parties, la configuration des permissions (pour donner à votre service l'accès à Route53) et le déploiement d’ExternalDNS.

Configurer les permissions Route53 pour votre ExternalDNS

Dans ce tutoriel, nous utiliserons un rôle IAM avec un ID provider, cette approche a été utilisée et documentée dans d'autres tutoriels tels que celui sur les applications AWS load balancers.

L'idée principale ici est de donner au pod ExternalDNS la permission de créer, mettre à jour et supprimer les enregistrements Route53 dans votre compte AWS. Pour ce faire, nous devons utiliser un identity provider dans le service AWS IAM. Un identity provider permet à un utilisateur externe d'assumer des rôles dans votre compte AWS en établissant une relation de confiance

Configurer l’Identity Provider

Pour créer un identity provider vous avez besoin de 3 choses : un type d’identity provider, une audience, et un provider url. Dans ce tutoriel, nous utiliserons OpenId Connect pour le type de provider et sts.amazonaws.com pour l'audience.

Le provider d'URL varie, pour obtenir votre provider d'url, vous pouvez utiliser la commande suivante :

aws eks describe-cluster --name <CLUSTER_NAME> --query 
 “cluster.identity.oidc.issuer” --output text

Le résultat devrait ressembler à ceci :

https://oidc.eks.
 <region>.amazonaws.com/id/EXAMPLE86F27C29EF05B482628D9790EA7066

Vous avez maintenant tout ce dont vous avez besoin pour créer votre propre identity provider !

Allez dans la section identity provider de l’IAM dans la console AWS et créez un nouveau provider.

configure_provider

Maintenant que vous avez un identity provider, il ne vous reste plus qu'à créer un rôle IAM avec des permissions Route53 et une relation de confiance avec votre tout nouveau provider.

Tout d'abord, créez un nouveau rôle dans IAM et autoriser votre provider en sélectionnant Web Identity et en entrant les informations de votre provider.

create_role

Une fois que cela a été fait, cliquez sur créer une nouvelle politique et entrez ce qui suit en JSON :

{
 "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "route53:ChangeResourceRecordSets"
         ],
         "Resource":[
            "arn:aws:route53:::hostedzone/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "route53:ListHostedZones",
            "route53:ListResourceRecordSets"
         ],
         "Resource":[
            "*"
         ]
      }
   ]
}

Attachez ensuite le AmazonEKSClusterPolicy au rôle également.

Une fois le rôle créé, gardez l'ARN, vous en aurez besoin plus tard.

Installation de External DNS

Nous allons installer ExternalDNS en utilisant helm, si helm n'est pas installé sur votre machine, vous pouvez trouver les instructions pour installer helm.

Une fois helm installé, connectez-vous à votre cluster et exécutez la commande suivante :

helm install <RELEASE_NAME> stable/external-dns \
 --set provider=aws \
 --set domainFilters[0]=<DOMAIN_FILTER>\
 --set policy=sync \
 --set registry=txt \
 --set txtOwnerId=<HOSTED_ZONE_ID> \
 --set interval=3m \
 --set rbac.create=true \
 --set rbac.serviceAccountName=external-dns \
 --set rbac.serviceAccountAnnotations.eks\.amazonaws\.com/role-arn=<ROLE_ARN>

<RELEASE_NAME> - nom de la release helm : peut être ce que vous voulez (external-dns par exemple)

<DOMAIN_FILTER> - nom de votre zone hébergée par Route53 : si vous avez *.example.com, ce serait example.com. Vous pouvez trouver cette information dans la console AWS (Route53)

<HOSTED_ZONE_ID> - id de votre zone hébergée dans AWS : vous pouvez trouver cette information dans la console AWS (Route53).

<ROLE_ARN> - ARN du rôle que vous avez créé plus tôt dans le tutoriel.

Une fois que vous avez exécuté la commande, vous pouvez vérifier que votre service nouvellement créé fonctionne dans votre cluster :

kubectl get po -n kube-system

(vous devriez voir un pod ExternalDNS)

Utiliser External DNS

Pour créer un nouvel enregistrement Route53 pour vos services, il vous suffit d'ajouter l'annotation :

external-dns.alpha.kubernetes.io/hostname

Exemple pour un service LoadBalancer :

apiVersion: v1
 kind: Service
 metadata:
 name: test
 annotations:
 external-dns.alpha.kubernetes.io/hostname: myservice.example.com 
 spec:
 type: LoadBalancer
 ports:
 - port: 80
 name: http
 targetPort: 80
 selector:
 app: test

Pour un services NodePort

apiVersion: v1
 kind: Service
 metadata:
 annotations:
 external-dns.alpha.kubernetes.io/hostname: myservice.example.com 
 name: test
 spec:
 externalIPs:
 - 1.2.3.4
 - 4.5.6.7
 externalTrafficPolicy: Cluster
 ports:
 - nodePort: 30001 #will give you a random 3XXXX port
 port: 5000
 protocol: TCP
 targetPort: 5000
 selector:
 app: test
 type: NodePort

Pour un ingress

apiVersion: extensions/v1beta1
 kind: Ingress
 metadata:
 annotations:
 alb.ingress.kubernetes.io/scheme: internet-facing
 external-dns.alpha.kubernetes.io/hostname: myservice.example.com 
 kubernetes.io/ingress.class: alb
 name: test
 spec:
 rules:
 - http:
 paths:
 - backend:
 serviceName: test
 servicePort: 80
 path: /

Débugger external DNS

Si les enregistrements Route53 n'ont pas été créés après 5 minutes, vous pouvez vérifier les logs de votre pod external DNS. Pour ce faire, exécutez ce qui suit :

k logs -n kube-system <EXTERNAL_DNS_POD_NAME>

Pour conclure, l'utilisation de ExternalDNS dans votre cluster EKS vous facilitera la vie en ce qui concerne la gestion des enregistrements Route53 et, comme décrit ci-dessus, il est très facile à configurer soi-même.


Des questions ou l'envie d’en savoir plus ? N’hésitez pas à nous contacter !