Comment configurer ExternalDNS avec Amazon EKS ?
Je souhaite configurer ExternalDNS avec Amazon Elastic Kubernetes Service (Amazon EKS).
Brève description
Pour installer ExternalDNS, utilisez les autorisations AWS Identity and Access Management (IAM) pour accorder à Amazon EKS l’accès nécessaire pour interagir avec Amazon Route 53.
Remarque : avant de commencer la résolution suivante, assurez-vous que vous disposez d'un nom de domaine et d'une zone hébergée Route 53.
Résolution
Configurer les autorisations IAM et déployer ExternalDNS
Procédez comme suit :
-
Créez la politique suivante pour configurer les autorisations IAM qui donnent au module ExternalDNS les autorisations nécessaires pour créer, mettre à jour et supprimer des enregistrements Route 53 dans votre compte AWS :
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "route53:ChangeResourceRecordSets" ], "Resource": [ "arn:aws:route53:::hostedzone/" ] }, { "Effect": "Allow", "Action": [ "route53:ListHostedZones", "route53:ListResourceRecordSets", "route53:ListTagsForResource" ], "Resource": [ "*" ] } ] }
Remarque : vous pouvez modifier la politique précédente pour autoriser la mise à jour d’identifiants de zone hébergée spécifiques.
-
Utilisez la politique pour créer un rôle IAM pour le compte de service :
eksctl create iamserviceaccount --name SERVICE_ACCOUNT_NAME --namespace NAMESPACE --cluster CLUSTER_NAME --attach-policy-arn IAM_POLICY_ARN --approve
Remarque : remplacez SERVICE_ACCOUNT_NAME par le nom de votre compte de service, NAMESPACE par votre espace de noms, CLUSTER_NAME par le nom de votre cluster et IAM_POLICY_ARN par l'ARN de votre politique IAM.
Pour vérifier le nom de votre compte de service, exécutez la commande suivante :kubectl get sa
Dans l’exemple de sortie suivant, external-dns est le nom donné au compte de service lors de sa création :
NAME SECRETS AGE default 1 23h external-dns 1 23h
-
Exécutez la commande suivante pour déterminer si le RBAC est activé dans votre cluster Amazon EKS :
kubectl api-versions | grep rbac.authorization.k8s.io
Remarque : pour la commande précédente, vérifiez la version la plus récente d’ExternalDNS disponible sur le projet GitHub.
-
Exécutez la commande suivante pour déployer ExternalDNS :
kubectl apply DEPLOYMENT_MANIFEST_FILE_NAME.yaml
Remarque : Remplacez DEPLOYMENT_MANIFEST_FILE_NAME par le nom de fichier de votre manifeste de déploiement.
Si le RBAC est activé, utilisez le manifeste suivant pour déployer ExternalDNS :
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: external-dns labels: app.kubernetes.io/name: external-dns rules: - apiGroups: [""] resources: ["services","endpoints","pods","nodes"] verbs: ["get","watch","list"] - apiGroups: ["extensions","networking.k8s.io"] resources: ["ingresses"] verbs: ["get","watch","list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: external-dns-viewer labels: app.kubernetes.io/name: external-dns roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: external-dns subjects: - kind: ServiceAccount name: external-dns namespace: default # change to desired namespace: externaldns, kube-addons --- apiVersion: apps/v1 kind: Deployment metadata: name: external-dns labels: app.kubernetes.io/name: external-dns spec: strategy: type: Recreate selector: matchLabels: app.kubernetes.io/name: external-dns template: metadata: labels: app.kubernetes.io/name: external-dns spec: serviceAccountName: external-dns containers: - name: external-dns image: registry.k8s.io/external-dns/external-dns:v0.14.0 args: - --source=service - --source=ingress - --domain-filter=example.com # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones - --provider=aws - --policy=upsert-only # would prevent ExternalDNS from deleting any records, omit to enable full synchronization - --aws-zone-type=public # only look at public hosted zones (valid values are public, private or no value for both) - --registry=txt - --txt-owner-id=external-dns env: - name: AWS_DEFAULT_REGION value: eu-west-1 # change to region where EKS is installed
Si le RBAC n’est pas activé, utilisez le manifeste suivant pour déployer ExternalDNS :
apiVersion: apps/v1 kind: Deployment metadata: name: external-dns labels: app.kubernetes.io/name: external-dns spec: strategy: type: Recreate selector: matchLabels: app.kubernetes.io/name: external-dns template: metadata: labels: app.kubernetes.io/name: external-dns spec: containers: - name: external-dns image: registry.k8s.io/external-dns/external-dns:v0.14.0 args: - --source=service - --source=ingress - --domain-filter=example.com # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones - --provider=aws - --policy=upsert-only # would prevent ExternalDNS from deleting any records, omit to enable full synchronization - --aws-zone-type=public # only look at public hosted zones (valid values are public, private or no value for both) - --registry=txt - --txt-owner-id=my-hostedzone-identifier env: - name: AWS_DEFAULT_REGION value: eu-west-1 # change to region where EKS is installed
-
Exécutez la commande suivante pour vérifier que le déploiement est réussi :
kubectl get deployments
Exemple de sortie :
NAME READY UP-TO-DATE AVAILABLE AGE external-dns 1/1 1 1 85m
Vous pouvez également consulter les journaux pour vérifier que les enregistrements sont mis à jour :
kubectl logs external-dns-9f85d8d5b-sx5f
Exemple de sortie :
.... time="2023-12-14T17:16:16Z" level=info msg="Instantiating new Kubernetes client" time="2023-12-14T17:16:16Z" level=info msg="Using inCluster-config based on serviceaccount-token" time="2023-12-14T17:16:16Z" level=info msg="Created Kubernetes client https://10.100.0.1:443" time="2023-12-14T17:16:18Z" level=info msg="Applying provider record filter for domains: [xxxxx.people.aws.dev. .xxxxx.people.aws.dev. xxxxx.people.aws.dev. .xxxxx.people.aws.dev.]" time="2023-12-14T17:16:18Z" level=info msg="All records are already up to date" ....
Vérifier le DNS externe
Pour vérifier que ExternalDNS est correctement configuré, procédez comme suit :
-
Créez un service exposé sous le nom de LoadBalancer. Le service doit être acheminé en externe via le nom de domaine hébergé sur Route 53 :
kubectl apply SERVICE_MANIFEST_FILE_NAME.yaml Note: Replace SERVICE_MANIFEST_FILE_NAME with your service manifest's file name. Manifest: apiVersion: v1 kind: Service metadata: name: nginx annotations: external-dns.alpha.kubernetes.io/hostname: nginx.xxxxx.people.aws.dev spec: ports: - port: 80 targetPort: 80 protocol: TCP type: LoadBalancer selector: app: nginx --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx ports: - containerPort: 80 name: http
Remarque : ExternalDNS utilise l'annotation external-dns.alpha.kubernetes.io/hostname sur les services. Il utilise également les valeurs associées. Pour attribuer plusieurs noms à un service, configurez l’annotation external-dns.alpha.kubernetes.io/hostname à l’aide d’un séparateur par des virgules.
-
Vérifiez que le service NGINX est créé avec le type LoadBalancer :
kubectl get svc
Exemple de sortie :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 05h nginx LoadBalancer 10.100.254.68 xxxxyyyyzzzz-123456789.eu-west-1.elb.amazonaws.com 80:30792/TCP 74m
Remarque : le service crée automatiquement un enregistrement Route 53 pour la zone hébergée.
-
Exécutez la commande suivante pour afficher les journaux et vérifier que l’enregistrement Route 53 a été créé correctement :
kubectl logs external-dns-9f85d8d5b-sx5fg
Exemple de sortie :
... time="2023-12-14T17:19:19Z" level=info msg="Desired change: CREATE cname-nginx.xxxxx.people.aws.dev TXT [Id: /hostedzone/Z0786329GDVAZMXYZ]" time="2023-12-14T17:19:19Z" level=info msg="Desired change: CREATE nginx.xxxxx.people.aws.dev A [Id: /hostedzone/Z0786329GDVAZMXYZ]" time="2023-12-14T17:19:19Z" level=info msg="Desired change: CREATE nginx.xxxxx.people.aws.dev TXT [Id: /hostedzone/Z0786329GDVAZMXYZ]" time="2023-12-14T17:19:20Z" level=info msg="3 record(s) in zone xxxxx.people.aws.dev. [Id: /hostedzone/Z0786329GDVAZMXYZ] were successfully updated" ...
Vidéos associées
Contenus pertinents
- demandé il y a un anlg...
- demandé il y a un moislg...
- demandé il y a 7 moislg...
- demandé il y a 7 moislg...
- demandé il y a 2 anslg...
- AWS OFFICIELA mis à jour il y a 9 mois
- AWS OFFICIELA mis à jour il y a 2 mois
- AWS OFFICIELA mis à jour il y a un an