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?