Wie richte ich ExternalDNS mit Amazon EKS ein?

Lesedauer: 5 Minute
0

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).


AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr