Warum erhalte ich den Fehler „webidentityerr“, wenn ich AWS Load Balancer Controller in Amazon EKS verwende?
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.
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor einem Jahr
- AWS OFFICIALAktualisiert vor 2 Monaten
- AWS OFFICIALAktualisiert vor 6 Monaten