Sommaire

    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 !