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.
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.
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
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.
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.
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.
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)
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: /
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 !