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

Lesedauer: 4 Minute
0

Ich erhalte die folgende Fehlermeldung, wenn ich versuche, den AWS Load Balancer Controller in Amazon Elastic Kubernetes Service (Amazon EKS) zu verwenden: „vorhandener LoadBalancer konnte aufgrund von WebIdentityErr nicht gefunden werden: Anmeldeinformationen konnten nicht abgerufen werden\nverursacht durch: AccessDenied: Nicht berechtigt, sts:AssumeRoleWithWebIdentity auszuführen\n\tStatuscode: 403"

Kurzbeschreibung

Sie erhalten diesen Fehler, wenn Sie den AWS Load Balancer Controller in Amazon EKS verwenden, und zwar aus den folgenden Gründen:

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

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. Sie können die IAM-Berechtigungen mithilfe von IAM-Rollen für das Service-Konto einrichten. Oder Sie können die IAM-Berechtigungen auch direkt an die IAM-Rollen des Worker-Knotens anhängen. 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, 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 Annotation des Service-Kontos 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:

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. Stellen Sie sicher, dass Sie die Umgebungsvariablen für die Anmeldeinformationen anwenden:

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

Falsches Vertrauensverhältnis zwischen der verwendeten IAM-Rolle und dem Service-Konto

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

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

Überprüfen Sie, ob das Vertrauensverhältnis für die Aktion sts:AssumeRoleWithWebIdentity richtig definiert ist (und nicht für die Aktion sts:AssumeRole).

Im Folgenden ist ein Beispiel für ein Vertrauensverhältnis, das nicht richtig definiert ist:

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

Um das Vertrauensverhältnis zu korrigieren, definieren Sie unbedingt das Vertrauensverhältnis 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.

Um dieselbe IAM-Rolle für mehrere Cluster in einem Konto zu verwenden, definieren Sie das Vertrauensverhältnis ähnlich des folgenden:

{
 "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-1-OIDC-Provider-ID>"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-1-OIDC-Provider-ID>:sub": "system:serviceaccount: kube-system:<aws-load-balancer-controller-serviceaccount>",
            "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-1-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
                                }
   }
  },
  {
   "Effect": "Allow",
   "Principal": {
    "Federated": "arn:aws:iam::<AWS-ACCOUNT>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-2-OIDC-Provider-ID>"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-2-OIDC-Prob>:sub": "system:serviceaccount: kube-system:<aws-load-balancer-controller-serviceaccount>",
                                        "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-2-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
    }
   }
  }
 ]
}

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: Der Name des Service-Kontos oder sein Namespace wurden falsch eingegeben

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

Beispiel 4: Fehlende „sts.amazonaws.com“-Schritte aus dem Vertrauensverhältnis

Wenn die mit Ihrem EKS-Pod verknüpfte Servicerolle den STS-Vorgang für die Aktion AssumeRoleWithWebIdentity nicht ausführen kann, aktualisieren Sie das Vertrauensverhältnis. Das Vertrauensverhältnis 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.


AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr