Wie richte ich ExternalDNS mit Amazon EKS ein?
Ich möchte ExternalDNS mit meinem Amazon Elastic Kubernetes Service (Amazon EKS) einrichten.
Kurzbeschreibung
ExternalDNS ist ein Pod, der in Ihrem Amazon-EKS-Cluster läuft. Um ExternalDNS als Plugin mit Amazon EKS zu verwenden, richten Sie AWS-Identity-and-Access-Management-Berechtigungen (IAM) ein. Diese Berechtigungen müssen Amazon EKS den Zugriff auf Amazon Route 53 ermöglichen.
Hinweis: Bevor Sie mit der folgenden Lösung beginnen, stellen Sie sicher, dass ein Domänenname und eine Route-53-Hosting-Zone vorhanden sind.
Lösung
IAM-Berechtigungen einrichten und ExternalDNS bereitstellen
1. Richten Sie IAM-Berechtigungen ein, um dem ExternalDNS-Pod-Berechtigungen zum Erstellen, Aktualisieren und Löschen von Route 53-Datensätzen in Ihrem AWS-Konto zu erteilen.
IAM-Richtlinie:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "route53:ChangeResourceRecordSets" ], "Resource": [ "arn:aws:route53:::hostedzone/*" ] }, { "Effect": "Allow", "Action": [ "route53:ListHostedZones", "route53:ListResourceRecordSets" ], "Resource": [ "*" ] } ] }
Hinweis: Sie können die vorstehende Richtlinie auch so anpassen, dass Aktualisierungen für explizit gehostete Zonen-IDs zulässig sind.
2. Verwenden Sie die vorangegangene Richtlinie, um eine IAM-Rolle für das Servicekonto 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 Namespace, CLUSTER_NAME durch den Namen Ihres Clusters und IAM_POLICY_ARN durch den ARN Ihrer IAM-Richtlinie.
Um den Namen Ihres Dienstkontos zu überprüfen, führen Sie den folgenden Befehl aus:
kubectl get sa
Beispielausgabe:
NAME SECRETS AGE default 1 23h external-dns 1 23h
In der vorangehenden Beispielausgabe ist external-dns der Name, der dem Dienstkonto bei seiner Erstellung gegeben wurde.
3. Setzen Sie ExternalDNS ein.
Prüfen Sie, ob RBAC in Ihrem Amazon-EKS-Cluster aktiviert ist:
kubectl api-versions | grep rbac.authorization.k8s.io
Hinweis: Bevor Sie die folgenden Manifeste anwenden, prüfen Sie, ob die neueste Version von ExternalDNS (von der GitHub-Website) vorliegt.
Folgenden Befehl ausführen:
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 rules: - apiGroups: [""] resources: ["services","endpoints","pods"] verbs: ["get","watch","list"] - apiGroups: ["extensions","networking.k8s.io"] resources: ["ingresses"] verbs: ["get","watch","list"] - apiGroups: [""] resources: ["nodes"] verbs: ["list","watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: external-dns-viewer roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: external-dns subjects: - kind: ServiceAccount name: external-dns namespace: default --- apiVersion: apps/v1 kind: Deployment metadata: name: external-dns spec: strategy: type: Recreate selector: matchLabels: app: external-dns template: metadata: labels: app: external-dns spec: serviceAccountName: external-dns containers: - name: external-dns image: k8s.gcr.io/external-dns/external-dns:v0.10.2 args: - --source=service - --source=ingress - --domain-filter=external-dns-test.my-org.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 securityContext: fsGroup: 65534 # For ExternalDNS to be able to read Kubernetes and AWS token files
Wenn RBAC nicht aktiviert ist, verwenden Sie das folgende Manifest, um ExternalDNS bereitzustellen:
apiVersion: apps/v1 kind: Deployment metadata: name: external-dns spec: strategy: type: Recreate selector: matchLabels: app: external-dns template: metadata: labels: app: external-dns spec: containers: - name: external-dns image: k8s.gcr.io/external-dns/external-dns:v0.10.2 args: - --source=service - --source=ingress - --domain-filter= <Your_R53_Domain_Name> # 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=<Your_R53_HostedZone_Id>
4. Überprüfen Sie, ob die Bereitstellung erfolgreich war:
kubectl get deployments
Beispielausgabe:
NAME READY UP-TO-DATE AVAILABLE AGE external-dns 1/1 1 1 85m
Sie können auch die Protokolle überprüfen, um sicherzustellen, dass die Aufzeichnungen auf dem neuesten Stand sind:
kubectl logs external-dns-9f85d8d5b-sx5fg
Beispielausgabe:
.... .... time="2022-02-10T20:22:02Z" level=info msg="Instantiating new Kubernetes client" time="2022-02-10T20:22:02Z" level=info msg="Using inCluster-config based on serviceaccount-token" time="2022-02-10T20:22:02Z" level=info msg="Created Kubernetes client https://10.100.0.1:443" time="2022-02-10T20:22:09Z" level=info msg="Applying provider record filter for domains: [<yourdomainname>.com. .<yourdomainname>.com.]" time="2022-02-10T20:22:09Z" level=info msg="All records are already up to date" .... ....
Überprüfen Sie, ob ExternalDNS funktioniert
1. Erstellen Sie einen Dienst, der als LoadBalancerexponiert ist und extern über den Domänennamen geroutet werden kann, der auf Route 53 gehostet wird:
kubectl apply SERVICE_MANIFEST_FILE_NAME.yaml
Hinweis: Ersetzen Sie SERVICE_MANIFEST_FILE_NAME durch den Dateinamen Ihres Dienst-Manifests.
Manifest:
apiVersion: v1 kind: Service metadata: name: nginx annotations: external-dns.alpha.kubernetes.io/hostname: DOMAIN_NAME 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: Ersetzen Sie DOMAIN_NAME durch den Namen Ihrer Domain.
2. Überprüfen Sie, ob der NGINX-Dienst mit dem Typ LoadBalancer erstellt wurde:
kubectl get svc
Beispielausgabe:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 26h nginx LoadBalancer 10.100.234.77 a1ef09255d52049f487e05b4f74faea6-954147917.us-west-1.elb.amazonaws.com 80:30792/TCP 74m
Hinweis: Der Dienst erstellt automatisch einen Route 53-Eintrag für die gehostete Zone.
Überprüfen Sie die Protokolle, um sicherzustellen, dass der Route 53-Datensatz erstellt wurde:
kubectl logs external-dns-9f85d8d5b-sx5fg
Beispielausgabe:
... ... ... time="2022-02-10T21:22:43Z" level=info msg="Applying provider record filter for domains: [<domainname>.com. .<domainname>.com.]" time="2022-02-10T21:22:43Z" level=info msg="Desired change: CREATE <domainname>.com A [Id: /hostedzone/Z01155763Q6AN7CEI3AP6]" time="2022-02-10T21:22:43Z" level=info msg="Desired change: CREATE <domainname>.com TXT [Id: /hostedzone/Z01155763Q6AN7CEI3AP6]" time="2022-02-10T21:22:43Z" level=info msg="2 record(s) in zone xxx.com. [Id: /hostedzone/Z01155763Q6AN7CEI3AP6] were successfully updated" time="2022-02-10T21:23:43Z" level=info msg="Applying provider record filter for domains: [<domainname>.com. .<domainname>.com.]" time="2022-02-10T21:23:43Z" level=info msg="All records are already up to date" ... ... ...
Weitere Informationen und Beispiele für ExternalDNS finden Sie unter ExternalDNS für Services auf AWS einrichten (auf der GitHub-Website) und ExternalDNS einrichten (auf der Kubernetes-Website).
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor einem Jahr
- AWS OFFICIALAktualisiert vor einem Jahr
- AWS OFFICIALAktualisiert vor einem Jahr
- AWS OFFICIALAktualisiert vor 3 Monaten