Warum erhalte ich den Fehler „webidentityerr“, wenn ich AWS Load Balancer Controller in Amazon EKS verwende?
Letzte Aktualisierung: 04.01.2023
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.
War dieser Artikel hilfreich?
Benötigen Sie Hilfe zur Fakturierung oder technischen Support?