Durch die Nutzung von AWS re:Post stimmt du den AWS re:Post Nutzungsbedingungen

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

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:

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

  2. 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
  3. 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.

  4. 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
  5. 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:

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

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

  3. 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"
    ...
AWS OFFICIAL
AWS OFFICIALAktualisiert vor 9 Monaten