Wie richte ich ExternalDNS mit Amazon EKS ein?
Ich möchte ExternalDNS mit meinem Amazon Elastic Kubernetes Service (Amazon EKS) einrichten.
Kurzbeschreibung
Um ExternalDNS zu installieren, verwenden Sie AWS Identity and Access Management (IAM)-Berechtigungen, um Amazon EKS den für die Interaktion mit Amazon Route 53 erforderlichen Zugriff zu gewähren.
Hinweis: Bevor Sie mit der folgenden Lösung beginnen, stellen Sie sicher, dass Sie über einen Domänennamen und eine von Route 53 gehostete Zone verfügen.
Behebung
IAM-Berechtigungen einrichten und ExternalDNS bereitstellen
Führen Sie die folgenden Schritte aus:
-
Erstellen Sie die folgende Richtlinie, um IAM-Berechtigungen einzurichten, die dem ExternalDNS-Pod Berechtigungen zum Erstellen, Aktualisieren und Löschen von Route-53-Datensätzen in Ihrem AWS-Konto gewähren:
{ "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": [ "*" ] } ] }
Hinweis: Sie können die vorherige Richtlinie ändern, um Aktualisierungen bestimmter gehosteter Zonen-IDs zuzulassen.
-
Verwenden Sie die Richtlinie, um eine IAM-Rolle für das Dienstkonto zu erstellen:
eksctl create iamserviceaccount --name SERVICE_ACCOUNT_NAME --namespace NAMESPACE --cluster CLUSTER_NAME --attach-policy-arn IAM_POLICY_ARN --approve
Hinweis: Ersetzen Sie SERVICE_ACCOUNT_NAME durch den Namen Ihres Dienstkontos, NAMESPACE durch Ihren Namensraum, CLUSTER_NAME durch den Namen Ihres Clusters und IAM_POLICY_ARN durch den ARN Ihrer IAM-Richtlinie.
Führen Sie den folgenden Befehl aus, um den Namen Ihres Dienstkontos zu überprüfen:kubectl get sa
In der folgenden Beispielausgabe ist external-dns der Name, der dem Dienstkonto bei seiner Erstellung gegeben wird:
NAME SECRETS AGE default 1 23h external-dns 1 23h
-
Führen Sie den folgenden Befehl aus, um festzustellen, ob RBAC in Ihrem Amazon-EKS-Cluster aktiviert ist:
kubectl api-versions | grep rbac.authorization.k8s.io
Hinweis: Überprüfen Sie für den vorherigen Befehl die neueste Version von ExternalDNS, die im GitHub-Projekt verfügbar ist.
-
Führen Sie den folgenden Befehl aus, um ExternalDNS bereitzustellen:
kubectl apply DEPLOYMENT_MANIFEST_FILE_NAME.yaml
Hinweis: Ersetzen Sie DEPLOYMENT_MANIFEST_FILE_NAME durch den Dateinamen Ihres Bereitstellungs-Manifests.
Wenn RBAC aktiviert ist, verwenden Sie das folgende Manifest, um ExternalDNS bereitzustellen:
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
Wenn RBAC nicht aktiviert ist, verwenden Sie das folgende Manifest, um ExternalDNS bereitzustellen:
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
-
Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die Bereitstellung erfolgreich ist:
kubectl get deployments
Beispielausgabe:
NAME READY UP-TO-DATE AVAILABLE AGE external-dns 1/1 1 1 85m
Oder überprüfen Sie die Protokolle, um sicherzustellen, dass die Datensätze aktualisiert wurden:
kubectl logs external-dns-9f85d8d5b-sx5f
Beispielausgabe:
.... 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" ....
Überprüfen von ExternalDNS
Gehen Sie wie folgt vor, um zu überprüfen, ob ExternalDNS korrekt eingerichtet ist:
-
Erstellen Sie einen Dienst, der als LoadBalancer verfügbar gemacht wird. Der Dienst muss extern über den Domainnamen weitergeleitet werden, der auf Route 53 gehostet wird:
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
Hinweis: ExternalDNS verwendet die Anmerkung external-dns.alpha.kubernetes.io/hostname für Dienste. Es verwendet auch die zugehörigen Werte. Um einem Dienst mehrere Namen zuzuweisen, konfigurieren Sie die Anmerkung external-dns.alpha.kubernetes.io/hostname mit einem Kommatrennzeichen.
-
Stellen Sie sicher, dass der NGINX-Dienst mit dem Typ LoadBalancer erstellt wird:
kubectl get svc
Beispielausgabe:
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
Hinweis: Der Dienst erstellt automatisch einen Route-53-Datensatz für die gehostete Zone.
-
Führen Sie den folgenden Befehl aus, um die Protokolle anzuzeigen, und bestätigen Sie, dass der Route-53-Datensatz erfolgreich erstellt wurde:
kubectl logs external-dns-9f85d8d5b-sx5fg
Beispielausgabe:
... 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" ...
Ähnliche Videos
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 10 Monaten
- AWS OFFICIALAktualisiert vor 10 Monaten
- AWS OFFICIALAktualisiert vor 9 Monaten