Installieren des Add-ons AWS Load Balancer Controller - Amazon EKS

Installieren des Add-ons AWS Load Balancer Controller

Der AWS-Lastenverteilungs-Controller verwaltet AWS-Elastic-Load-Balancer für einen Kubernetes-Cluster. Der Controller stellt die folgenden Ressourcen bereit.

  • Ein AWS Application Load Balancer (ALB) beim Erstellen eines Kubernetes-Ingress.

  • Ein AWS Network Load Balancer (NLB), wenn Sie einen Kubernetes-Service vom Typ LoadBalancer erstellen. In der Vergangenheit wurde der Network Load Balancer von Kubernetes für Instance-Ziele verwendet, während der AWS Load Balancer Controller für IP-Ziele genutzt wurde. Mit der Version 2.3.0 oder höher des AWS Load Balancer Controllers können Sie NLBs für beide Zieltypen erstellen. Weitere Informationen zu NLB-Zieltypen finden Sie unter Zieltyp im Benutzerhandbuch für Netzwerklastenverteilung.

Der AWS Load Balancer Controller wurde früher als AWS ALB Ingress Controller bezeichnet. Es ist ein Open-Source-Projekt, das auf GitHub verwaltet wird. In diesem Thema wird beschrieben, wie Sie den Controller mit Standardoptionen installieren. Sie können die vollständige Dokumentation für den Controller auf GitHub anzeigen. Bevor Sie den Controller bereitstellen, empfehlen wir Ihnen, die Voraussetzungen und Überlegungen in Anwendungslastenverteilung auf Amazon EKS und Netzwerklastenausgleich auf Amazon EKS zu überprüfen. Diese Themen enthalten auch Schritte zum Bereitstellen einer Beispielanwendung, bei der der AWS Load Balancer Controller AWS-ALBs und -NLBs bereitstellen muss.

Voraussetzungen

  • Ein vorhandener Amazon-EKS-Cluster. Informationen zum Bereitstellen finden Sie unter Erste Schritte mit Amazon EKS. Zur Verwendung der Version 2.4.0 des Controllers (der in diesem Thema genutzten Version) ist die Clusterversion 1.19 oder höher notwendig. Bei einer früheren Clusterversion als 1.19 empfehlen wir die Verwendung der Controller-Version 2.3.1.

  • Ein vorhandener Anbieter für AWS Identity and Access Management (IAM) OpenID Connect (OIDC) für Ihren Cluster. Informationen zum Feststellen, ob Sie bereits über einen verfügen oder einen erstellen müssen, finden Sie unter Erstellen Sie einen IAM-OIDC-Anbieter für Ihren Cluster.

So stellen Sie den AWS-Lastenverteilungs-Controller in einem Amazon-EKS-Cluster bereit

Ersetzen Sie in den folgenden Schritten das example values durch Ihre eigenen Werte. Bei einer früheren Clusterversion als 1.19 ändern Sie alle Instances von 2.4.0 in 2.3.1 und alle Instances von v2_4_0_full.yaml in v2_3_1_full.yaml.

  1. Erstellen Sie eine IAM-Richtlinie.

    1. Laden Sie eine IAM-Richtlinie für den AWS-Lastenverteilungs-Controller herunter, die es ihm ermöglicht, in Ihrem Namen Aufrufe an AWS-APIs zu tätigen. Sie können das Richtliniendokument auf GitHub anzeigen.

      curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.0/docs/install/iam_policy.json
    2. Erstellen Sie eine IAM-Richtlinie mit der im vorherigen Schritt heruntergeladenen Richtlinie.

      aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
      Anmerkung

      Wenn Sie die Richtlinie in der AWS Management Console anzeigen, werden möglicherweise Warnungen für ELB angezeigt. Diese können sicher ignoriert werden, da einige der Aktionen nur für ELB v2 existieren. Sie sehen keine Warnungen für ELB v2.

  2. Erstellen Sie eine IAM-Rolle und kommentieren Sie das Kubernetes-Dienstkonto mit dem Namen aws-load-balancer-controller im kube-system-Namespace für den AWS-Lastenverteilungs-Controller mit eksctl oder AWS CLI und kubectl.

    eksctl

    Ersetzen Sie my_cluster durch den Namen Ihres Clusters und 111122223333 durch Ihre Konto-ID und führen Sie dann den Befehl aus. Der Cluster-Name darf nur alphanumerische Zeichen (wobei die Groß- und Kleinschreibung beachtet werden muss) und Bindestriche enthalten. Er muss mit einem alphabetischen Zeichen beginnen und darf nicht mehr als 128 Zeichen umfassen.

    eksctl create iamserviceaccount \ --cluster=my-cluster \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --approve
    AWS CLI and kubectl

    Verwenden von AWS CLI und kubectl

    1. Zeigen Sie die OIDC-Anbieter-URL Ihres Clusters an.

      aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text

      Beispielausgabe:

      https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E

      Wenn keine Ausgabe erfolgt, müssen Sie einen IAM-OIDC-Anbieter für Ihr Cluster erstellen.

    2. Kopieren Sie den folgenden Inhalt in eine Datei namens load-balancer-role-trust-policy.json. Ersetzen Sie 111122223333 durch die ID Ihres Kontos, region-code durch die AWS-Region, in der sich der Cluster befindet, und EXAMPLED539D4633E53DE1B716D3041E durch die Ausgabe, die im vorherigen Schritt zurückgegeben wurde.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller" } } } ] }
    3. Erstellen Sie die Rolle.

      aws iam create-role \ --role-name AmazonEKSLoadBalancerControllerRole \ --assume-role-policy-document file://"load-balancer-role-trust-policy.json"
    4. Hängen Sie die erforderliche von Amazon EKS verwaltete IAM-Richtlinie an die Rolle an. Ersetzen Sie 111122223333 durch Ihre Konto-ID.

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --role-name AmazonEKSLoadBalancerControllerRole
    5. Speichern Sie den folgenden Inhalt in einer Datei mit dem Namen aws-load-balancer-controller-service-account.yaml und ersetzen Sie 111122223333 durch Ihre Konto-ID.

      apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller name: aws-load-balancer-controller namespace: kube-system annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole
    6. Erstellen Sie das Servicekonto in Ihrem Cluster.

      kubectl apply -f aws-load-balancer-controller-service-account.yaml
  3. Wenn Sie derzeit den AWS ALB Ingress Controller für Kubernetes installiert haben, deinstallieren Sie ihn. Der AWS Load Balancer Controller ersetzt die Funktionalität des AWS ALB Ingress Controllers für Kubernetes.

    1. Überprüfen Sie, ob der Controller derzeit installiert ist.

      kubectl get deployment -n kube-system alb-ingress-controller

      Dies ist die Ausgabe, falls der Controller nicht installiert ist. Wechseln Sie zum Schritt Controller installieren.

      Error from server (NotFound): deployments.apps "alb-ingress-controller" not found

      Dies ist die Ausgabe, falls der Controller installiert ist.

      NAME READY UP-TO-DATE AVAILABLE AGE alb-ingress-controller 1/1 1 1 122d
    2. Geben Sie die folgenden Befehle ein, um den Controller zu entfernen.

      kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/alb-ingress-controller.yaml kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/rbac-role.yaml
    3. Fügen Sie der in einem vorherigen Schritt erstellten IAM-Rolle die folgende IAM-Richtlinie hinzu. Die Richtlinie ermöglicht dem AWS-Lastenverteilungs-Controller den Zugriff auf die Ressourcen, die vom ALB Ingress Controller für Kubernetes erstellt wurden.

      1. Laden Sie die IAM-Richtlinie herunter. Sie können auch die Richtlinie anzeigen.

        curl -o iam_policy_v1_to_v2_additional.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.0/docs/install/iam_policy_v1_to_v2_additional.json
      2. Erstellen Sie die IAM-Richtlinie und notieren Sie den zurückgegebenen ARN.

        aws iam create-policy \ --policy-name AWSLoadBalancerControllerAdditionalIAMPolicy \ --policy-document file://iam_policy_v1_to_v2_additional.json
      3. Hängen Sie die IAM-Richtlinie an die IAM-Rolle an, die Sie in einem vorherigen Schritt erstellt haben. Ersetzen Sie your-role-name durch den Namen der Rolle. Wenn Sie die Rolle mit eksctl erstellt haben, öffnen Sie zur Suche nach dem erstellten Rollennamen die AWS CloudFormation-Konsole und wählen Sie den Stack eksctl-your-cluster-name-addon-iamserviceaccount-kube-system-aws-load-balancer-controller aus. Wählen Sie die Registerkarte für Resources (Ressourcen). Der Rollenname befindet sich in der Spalte Physische ID. Wenn Sie das AWS Management Console zum Erstellen der Rolle verwendet haben, ist der Rollenname ein beliebiger Name, z. B. AmazonEKSLoadBalancerControllerRole.

        aws iam attach-role-policy \ --role-name your-role name \ --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy
  4. Installieren Sie den AWS Load Balancer Controller mit Helm V3 oder höher oder durch Anwenden eines Kubernetes-Manifests. Wenn Sie den Controller in Fargate bereitstellen möchten, verwenden Sie das Helm-Verfahren, da er nicht von cert-manager abhängig ist.

    Helm V3 or later
    1. Fügen Sie das eks-charts-Repository hinzu.

      helm repo add eks https://aws.github.io/eks-charts
    2. Aktualisieren Sie Ihr lokales Repository, um sicherzustellen, dass Sie über die neuesten Charts verfügen.

      helm repo update
    3. Wenn Ihre Knoten keinen Zugriff auf Amazon-ECR-Image-Repositorys von Amazon EKS haben, müssen Sie sich bei der Registrierung in Ihrer AWS-Region authentifizieren und das folgende Image abrufen. Ersetzen Sie account und region-code durch die Werte für Ihre AWS-Region, die in Registrierungen für Amazon-Container-Images aufgeführt sind.

      account.dkr.ecr.region-code.amazonaws.com/amazon/aws-load-balancer-controller:2.4.0

      Nachdem Sie das Image abgerufen haben, verschieben Sie es in ein Repository, auf das die Knoten Zugriff haben. Weitere Informationen zum Abrufen, Markieren und Verschieben von Images in ein eigenes Repository finden Sie unter Kopieren eines Container-Images von einem Repository in ein anderes.

    4. Installieren Sie den AWS-Lastenverteilungs-Controller. Wenn Sie den Controller auf Amazon-EC2-Knoten bereitstellen, die eingeschränkten Zugriff auf den Instance-Metadatenservice (IMDS) von Amazon EC2 haben, oder wenn die Bereitstellung auf Fargate erfolgt, fügen Sie dem folgenden helm-Befehl die folgenden Flags hinzu:

      • --set region=region-code

      • --set vpcId=vpc-xxxxxxxx

      Wenn die Bereitstellung in einer anderen AWS-Region als us-west-2 erfolgt, fügen Sie dem folgenden helm-Befehl das folgende Flag hinzu. Ersetzen Sie außerdem account und region-code durch die Werte für Ihre AWS-Region, die in Registrierungen für Amazon-Container-Images aufgeführt sind. Wenn Sie das Image abgerufen und in ein eigenes Repository verschoben haben, ersetzen Sie die vollständige Registrierung und das Repository durch Ihre eigene Registrierung und Ihr eigenes Repository.

      --set image.repository=account.dkr.ecr.region-code.amazonaws.com/amazon/aws-load-balancer-controller

      Ersetzen Sie cluster_name durch den Namen Ihres eigenen Clusters.

      helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=cluster-name \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller
      Wichtig

      Das bereitgestellte Diagramm erhält keine automatischen Sicherheitsupdates. Sie müssen manuell auf ein neueres Diagramm aktualisieren, wenn es verfügbar wird. Ändern Sie beim Upgrade install im vorherigen Befehl in upgrade, führen Sie jedoch den folgenden Befehl aus, um die TargetGroupBinding-benutzerdefinierten Ressourcendefinitionen zu installieren, bevor Sie den vorherigen Befehl ausführen.

      kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
    Kubernetes manifest
    1. Installieren Sie cert-manager mit einer der beiden folgenden Methoden, um die Zertifikatskonfiguration in die Webhooks einzufügen.

      • Wenn die Knoten Zugriff auf die quay.io-Container-Registry haben, installieren Sie cert-manager, um die Zertifikatskonfiguration in die Webhooks einzufügen.

        kubectl apply \ --validate=false \ -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
      • Andernfalls führen Sie die folgenden Aufgaben durch:

        1. Laden Sie das Manifest herunter.

          curl -Lo cert-manager.yaml https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
        2. Rufen Sie die folgenden Images ab und verschieben Sie sie in ein Repository, auf das die Knoten Zugriff haben. Weitere Informationen zum Abrufen, Markieren und Verschieben der Images in ein eigenes Repository finden Sie unter Kopieren eines Container-Images von einem Repository in ein anderes.

          quay.io/jetstack/cert-manager-cainjector:v1.5.4 quay.io/jetstack/cert-manager-cainjector:v1.5.4 quay.io/jetstack/cert-manager-webhook:v1.5.4
        3. Ersetzen Sie quay.io im Manifest für die drei Images durch den Namen Ihrer eigenen Registrierung. Beim folgenden Befehl wird davon ausgegangen, dass der Name Ihres privaten Repositorys mit dem des Quell-Repositorys übereinstimmt. Ersetzen Sie 111122223333.dkr.ecr.region-code.amazonaws.com durch Ihre private Registrierung.

          sed -i.bak -e 's|quay.io|111122223333.dkr.ecr.region-code.amazonaws.com|' ./cert-manager.yaml
        4. Das Manifest anwenden

          kubectl apply \ --validate=false \ -f ./cert-manager.yaml
    2. Installieren Sie den Controller.

      1. Laden Sie die Controller-Spezifikation herunter. Weitere Informationen zum Controller finden Sie in der Dokumentation auf GitHub.

        curl -Lo v2_4_0_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.0/v2_4_0_full.yaml
      2. Nehmen Sie die folgenden Änderungen an der Datei vor.

        • Ersetzen Sie your-cluster-name im Abschnitt Deployment spec der Datei durch den Namen Ihres Clusters, indem Sie my-cluster durch dessen Namen ersetzen.

          sed -i.bak -e 's|your-cluster-name|my-cluster|' ./v2_4_0_full.yaml
        • Wenn Ihre Knoten keinen Zugriff auf die Amazon-ECR-Image-Repositorys von Amazon EKS haben, müssen Sie das folgende Image abrufen und in ein Repository verschieben, auf das die Knoten Zugriff haben. Weitere Informationen zum Abrufen, Markieren und Verschieben von Images in ein eigenes Repository finden Sie unter Kopieren eines Container-Images von einem Repository in ein anderes.

          amazon/aws-alb-ingress-controller:v2.4.0

          Fügen Sie dem Manifest den Namen Ihrer Registrierung hinzu. Beim folgenden Befehl wird davon ausgegangen, dass der Name Ihres privaten Repositorys mit dem des Quell-Repositorys übereinstimmt. Dessen Name wird der Datei hinzugefügt. In der Quelldatei ist keine Registrierung angegeben, da der Abruf durch Kubernetes standardmäßig aus docker.io erfolgt. Ersetzen Sie 111122223333.dkr.ecr.region-code.amazonaws.com durch Ihre Registrierung. In dieser Zeile wird davon ausgegangen, dass Sie Ihr privates Repository genauso benannt haben wie das Quell-Repository. Andernfalls ändern Sie den Text amazon/aws-alb-ingress-controller nach den Namen Ihrer privaten Registrierung in den Namen Ihres Repositorys.

          sed -i.bak -e 's|amazon/aws-alb-ingress-controller|111122223333.dkr.ecr.region-code.amazonaws.com/amazon/aws-alb-ingress-controller|' ./v2_4_0_full.yaml
        • Öffnen Sie die Datei in einem Editor und entfernen Sie die folgenden Zeilen. Durch das Entfernen dieses Abschnitts wird verhindert, dass die Anmerkung mit der IAM-Rolle, die in einem vorherigen Schritt hinzugefügt wurde, beim Bereitstellen des Controllers überschrieben wird. Außerdem wird das in einem vorherigen Schritt erstellte Servicekonto beibehalten, wenn Sie den Controller löschen.

          apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller name: aws-load-balancer-controller namespace: kube-system ---
        • Wenn Sie den Controller auf Amazon-EC2-Knoten bereitstellen, die eingeschränkten Zugriff auf den Amazon-EC2-Instance-Metadatenservice (IMDS) haben, oder wenn Sie Fargate bereitstellen, fügen Sie following parameters unter - args: hinzu.

          ... spec: containers: - args: - --cluster-name=your-cluster-name - --ingress-class=alb - --aws-vpc-id=vpc-xxxxxxxx - --aws-region=region-code ...
      3. Übernehmen Sie die Datei.

        kubectl apply -f v2_4_0_full.yaml
  5. Stellen Sie sicher, dass der Controller installiert ist.

    kubectl get deployment -n kube-system aws-load-balancer-controller

    Ausgabe

    NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s

    Sie erhalten die vorherige Ausgabe, wenn Sie mit Helm bereitgestellt haben. Wenn Sie mit dem Kubernetes-Manifest bereitgestellt haben, haben Sie nur ein Replikat.

  6. Bevor Sie den Controller zum Bereitstellen von AWS-Ressourcen verwenden, muss Ihr Cluster bestimmte Anforderungen erfüllen. Weitere Informationen erhalten Sie unter Anwendungslastenverteilung auf Amazon EKS und Netzwerklastenausgleich auf Amazon EKS.