Warum erhalte ich den Fehler „webidentityerr“, wenn ich AWS Load Balancer Controller in Amazon EKS verwende?

Letzte Aktualisierung: 12.08.2021

Ich erhalte die folgende Fehlermeldung, wenn ich versuche, den AWS Load Balancer Controller in Amazon Elastic Kubernetes Service (Amazon EKS) zu verwenden:

"failed to find existing LoadBalancer due to WebIdentityErr: failed to retrieve credentials\ncaused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity\n\tstatus code: 403"

Wie kann ich diesen Fehler beheben?

Kurzbeschreibung

Bei Verwendung des AWS Load Balancer Controller in Amazon EKS kann der Fehler WebIdentityErr: failed to retrieve credentials caused by: AccessDenied aus den folgenden Gründen auftreten:

  • Falsche Konfigurationen des Service-Kontos
  • Falsches Vertrauensverhältnis der im Service-Konto verwendeten AWS Identity and Access Management (IAM)-Rolle

Mit AWS Load Balancer Controller führen Worker-Knoten die Aufgaben aus. Diese Worker-Knoten müssen mithilfe von IAM-Berechtigungen Zugriff auf die Ressourcen von AWS Application Load Balancer oder AWS Network Load Balancer gewährt werden. Die IAM-Berechtigungen können entweder mithilfe von IAM-Rollen für das Service-Konto eingerichtet werden, oder sie können direkt an die IAM-Rollen des Worker-Knotens angehängt werden. Weitere Informationen finden Sie unter Installation des Load Balancer Controller auf der Kubernetes-Website.

Lösung

Falsche Konfigurationen des Service-Kontos

Führen Sie die folgenden Schritte aus, um zu überprüfen, ob die Konfigurationen Ihres Service-Kontos ordnungsgemäß konfiguriert sind:

1.    Überprüfen Sie den Namen des Service-Kontos (SA), der in Ihrer Bereitstellung definiert ist:

kubectl describe deploy <aws-load-balancer-controller> -n kube-system | grep -i "Service Account"

2.    Beschreiben Sie das Service-Konto:

kubectl describe sa <aws-load-balancer-controller> -n kube-system

3.    Überprüfen Sie die SA-Anmerkung für die IAM-Rolle:

Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxx:role/<AmazonEKSLoadBalancerControllerRole>

4.    Wenn diese Anmerkung fehlt oder falsch ist, aktualisieren Sie die Anmerkung. Stellen Sie sicher, dass Sie die IAM-Rolle ordnungsgemäß einem Service-Konto zugeordnet haben, wie folgt:

kubectl annotate serviceaccount -n <SERVICE_ACCOUNT_NAMESPACE> <SERVICE_ACCOUNT_NAME> \ eks.amazonaws.com/role-arn=arn:aws:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>

5.    Löschen Sie alle vorhandenen Amazon-EKS-Pods, die mit dem Service-Konto verknüpft sind, und erstellen Sie sie neu. Wenden Sie unbedingt die Umgebungsvariablen für Anmeldeinformationen an:

kubectl delete pods <aws-loadbalancer-controller-pod> -n <kube-system>

Falsche Vertrauensstellung zwischen der verwendeten AWS Identity Access Management (IAM)-Rolle und dem Service-Konto

Die folgenden Beispiele zeigen einige häufige Fehler, die beim Herstellen der Vertrauensstellung zwischen Ihrer IAM-Rolle und Ihrem Service-Konto auftreten können.

Beispiel 1: Die IAM-Rolle oder Vertrauensstellung ist für die Aktion „sts:AssumeRoleWithWebIdentity“ nicht richtig definiert

Stellen Sie sicher, dass die Vertrauensstellung für die Aktion „sts:AssumeRoleWithWebIdentity“ richtig definiert ist (und nicht für die Aktion „sts:AssumeRole“).

Hier ist ein Beispiel für eine Vertrauensstellung, die nicht richtig definiert ist:

{
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "xxxxx.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
}

Um die Vertrauensstellung zu korrigieren, definieren Sie unbedingt die Vertrauensstellung für die Aktion „sts:AssumeRoleWithWebIdentity“:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<AWS-ACCOUNT>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:sub": "system:serviceaccount:kube-system:<aws-load-balancer-controller-serviceaccount>"        
        }
      }
    }
  ]
}

Hinweis: Stellen Sie sicher, dass Sie alle Variablen durch Ihre eigenen Werte ersetzen.

Beispiel 2: Falsche OIDC-Anbieter-ID beim Erstellen eines Amazon-EKS-Clusters

Stellen Sie sicher, dass Sie einen OIDC-Anbieter für Ihren Amazon-EKS-Cluster ordnungsgemäß erstellen und verifizieren. Stellen Sie sicher, dass die OIDC-Anbieter-ID und die zugehörige AWS-Region korrekt aufgeführt sind. Andernfalls erhalten Sie einen WebIdentityErr-Fehler.

Beispiel 3: Falscher Name des Service-Kontos (SA) und dessen Namespace bei der Konfiguration der AWS-Load-Balancer-Controller-Bereitstellung

Achten Sie darauf, den richtigen SA-Namen und dessen Namespace einzugeben, wenn Sie Ihre AWS-Load-Balancer-Controller-Bereitstellung aktualisieren.

Beispiel 4: Fehlende „sts.amazonaws.com“-Schritte aus der Vertrauensstellung

Wenn die mit Ihrem EKS-Pod verknüpfte Service-Rolle den STS-Vorgang für die Aktion „AssumeRoleWithWebIdentity“ nicht ausführen kann, aktualisieren Sie die Vertrauensstellung. Die Vertrauensstellung muss „sts.amazonaws.com“ enthalten, um eine STS-Operation durchzuführen.

Beispiel:

"Condition": {
        "StringEquals": {
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:sub": "system:serviceaccount:kube-system:<aws-load-balancer-controller-serviceaccount>",
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
        }
}

Weitere Informationen zu IAM-Bedingungen mit mehreren Schlüsseln oder Werten finden Sie unter Erstellen einer Bedingung mit mehreren Schlüsseln oder Werten.


War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?