Wie behebe ich Probleme mit einem OIDC-Anbieter und IRSA in Amazon EKS?
Meine Pods können die AWS Identity and Access Management (IAM)-Rollenberechtigungen mit dem Amazon Elastic Kubernetes Service (Amazon EKS)-Kontotoken nicht verwenden.
Behebung
Überprüfen Sie, ob Sie bereits einen IAM-OIDC-Anbieter für Ihren Cluster haben
Wenn bereits ein Anbieter existiert, erhalten Sie eine Fehlermeldung ähnlich der folgenden: „WebIdentityErr: failed to retrieve credentials\ncaused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for https://oidc.eks.eu-west-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E\n\tstatus code: 400“;
Gehen Sie wie folgt vor, um zu überprüfen, ob Sie bereits einen IAM-OIDC-Anbieter haben:
-
Überprüfen Sie die OIDC-Provider-URL Ihres Clusters:
$ aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text
Beispielausgabe:
https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
-
Führen Sie die IAM-OIDC-Anbieter in Ihrem Konto auf. Ersetzen Sie EXAMPLED539D4633E53DE1B716D3041E durch den Wert, den der vorherige Befehl zurückgegeben hat:
aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E
Beispielausgabe:
"Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
Wenn der Befehl eine Ausgabe zurückgibt, haben Sie bereits einen Anbieter für Ihren Cluster. Wenn der Befehl keine Ausgabe zurückgibt, müssen Sie einen IAM-OIDC-Anbieter erstellen.
Überprüfen Sie, ob Ihre IAM-Rolle über die erforderlichen Berechtigungen und eine angehängte IAM-Richtlinie verfügt
**Hinweis:**Wenn bei der Ausführung von AWS Command Line Interface (AWS CLI)-Befehlen Fehler auftreten, finden Sie weitere Informationen unter Troubleshoot AWS CLI errors. Stellen Sie außerdem sicher, dass Sie die neueste Version von AWS CLI verwenden.
Gehen Sie wie folgt vor, um zu überprüfen, ob Ihre IAM-Rolle über die erforderlichen Berechtigungen verfügt:
- Öffnen Sie die IAM-Konsole.
- Wählen Sie im Navigationsbereich Rollen aus.
- Wählen Sie die Rolle aus, die Sie verifizieren möchten.
- Vergewissern Sie sich auf der Registerkarte Berechtigungen, dass die erforderliche Richtlinie an die Rolle angehängt ist.
- Stellen Sie sicher, dass die IAM-Rollenvertrauensbeziehungen korrekt eingerichtet sind.
Gehen Sie wie folgt vor, um zu überprüfen, ob Ihrer IAM-Rolle eine Richtlinie angehängt ist:
-
Öffnen Sie die IAM-Konsole.
-
Wählen Sie im Navigationsbereich Rollen aus.
-
Wählen Sie die Rolle aus, die Sie überprüfen möchten.
-
Wählen Sie das Register Vertrauensbeziehungen aus. Stellen Sie sicher, dass das Format Ihrer Richtlinie dem Format der folgenden JSON-Richtlinie entspricht:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME", "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com" } } } ] }
Um Vertrauensbeziehungen zu überprüfen, führen Sie den Befehl get-role in der AWS Command Line Interface (AWS CLI) aus:
$ aws iam get-role --role-name EKS-IRSA
**Hinweis:**Ersetzen Sie EKS-IRSA durch Ihren IAM-Rollennamen.
Suchen Sie in der JSON-Ausgabe nach dem Abschnitt AssumeRolePolicyDocument.
Beispielausgabe:{ "Role": { "Path": "/", "RoleName": "EKS-IRSA", "RoleId": "AROAQ55NEXAMPLELOEISVX", "Arn": "arn:aws:iam::ACCOUNT_ID:role/EKS-IRSA", "CreateDate": "2021-04-22T06:39:21+00:00", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com", "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME" } } } ] }, "MaxSessionDuration": 3600, "RoleLastUsed": { "LastUsedDate": "2021-04-22T07:01:15+00:00", "Region": "AWS_REGION" } } }
Hinweis: Aktualisieren Sie je nach Anwendungsfall die AWS-Region, den Namen des Kubernetes-Dienstkontos und den Kubernetes-Namespace.
Prüfen Sie, ob Sie ein Dienstkonto erstellt haben
Führen Sie folgenden Befehl aus:
$ kubectl get sa -n YOUR_NAMESPACE
Hinweis: Ersetzen Sie YOUR_NAMESPACE druch Ihren Kubernetes-Namespace.
Beispielausgabe:
NAME SECRETS AGEdefault 1 28d irsa 1 66m
Wenn Sie kein Dienstkonto haben, finden Sie weitere Informationen unter Dienstkonten für Pods konfigurieren auf der Kubernetes-Website.
Stellen Sie sicher, dass das Dienstkonto die richtigen IAM-Rollenanmerkungen enthält
Führen Sie den folgenden Befehl aus, um zu überprüfen, ob Ihr Dienstkonto über die richtigen IAM-Rollenanmerkungen verfügt:
$ kubectl describe sa irsa -n YOUR_NAMESPACE
Hinweis: Ersetzen Sie irsa durch Ihren Kubernetes-Dienstkontonamen und YOUR\ _NAMESPACE durch Ihren Kubernetes-Namespace.
Beispielausgabe:
Name: irsaNamespace: default Labels: none Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME Image pull secrets: none Mountable secrets: irsa-token-v5rtc Tokens: irsa-token-v5rtc Events: none
Stellen Sie sicher, dass Sie den ServiceAccountName in Ihrem Pod korrekt angegeben haben
Führen Sie den folgenden Befehl aus, um den serviceAccountName zu überprüfen:
$ kubectl get pod POD_NAME -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:
**Hinweis:**Ersetzen Sie POD\ _NAME und YOUR_NAMESPACE durch Ihren Kubernetes-Pod und Namespace.
Beispielausgabe:
serviceAccountName: irsa
Überprüfen Sie die Umgebungsvariablen und Berechtigungen
Suchen Sie in den Umgebungsvariablen des Pods nach AWS_ROLE_ARN und AWS_WEB_IDENTITY_TOKEN_FILE:
$ kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS
Beispielausgabe:
AWS_REGION=ap-southeast-2AWS_ROLE_ARN=arn:aws:iam::111122223333:role/EKS-IRSA AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token AWS_DEFAULT_REGION=ap-southeast-2
Stellen Sie sicher, dass die Anwendung ein unterstütztes AWS-SDK verwendet
Die SDK-Version muss größer oder gleich den folgenden Werten sein:
Java (Version 2) — 2.10.11Java — 1.11.704 Go — 1.23.13 Python (Boto3) — 1.9.220 Python (botocore) — 1.12.200 AWS CLI — 1.16.232 Node — 3.15.0 Ruby — 2.11.345 C++ — 1.7.174 .NET — 3.3.659.1 PHP — 3.110.7
Informationen zur neuesten unterstützten SDK-Version finden Sie unter Verwenden eines unterstützten AWS-SDK.
Pods neu erstellen
Wenn Sie Pods erstellt haben, bevor Sie IRSA angewendet haben, führen Sie den folgenden Befehl aus, um die Pods neu zu erstellen:
$ kubectl rollout restart deploy nginx
Beispielausgabe:
deployment.apps/nginx restarted
Führen Sie für Daemonsets- oder Statefulsets-Bereitstellungen den folgenden Befehl aus:
$ kubectl rollout restart deploy DEPLOYMENT_NAME
Wenn Sie nur einen Pod erstellt haben, müssen Sie den Pod löschen und neu erstellen:
- Führen Sie den folgenden Befehl aus, um den Pod zu löschen:
Hinweis: Ersetzen Sie POD\ _NAME durch den Namen Ihres Pods.$ kubectl delete pod POD_NAME
- Führen Sie den folgenden Befehl aus, um den Pod neu zu erstellen:
**Hinweis:**Ersetzen Sie SPEC\ _FILE durch den Dateipfad und den Dateinamen Ihres Kubernetes-Manifests.$ kubectl apply -f SPEC_FILE
Stellen Sie sicher, dass die Zielgruppe korrekt ist
Wenn Sie den OIDC-Anbieter mit der falschen Zielgruppe erstellt haben, erhalten Sie die folgende Fehlermeldung: „Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience“.
Überprüfen Sie den IAM-dentitätsanbieter für Ihren Cluster. Ihre ClientIDList ist sts.amazonaws.com:
$ aws iam get-open-id-connect-provider --open-id-connect-provider-arn arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
Beispielausgabe:
{ "Url": "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E", "ClientIDList": [ "sts.amazonaws.com" ], "ThumbprintList": [ "9e99a48a9960b14926bb7f3b02e22da2b0ab7280" ], "CreateDate": "2021-01-21T04:29:09.788000+00:00", "Tags": [] }
Stellen Sie sicher, dass Sie den richtigen Fingerabdruck konfiguriert haben
Wenn der im IAM-OIDC konfigurierte Fingerabdruck nicht korrekt ist, erhalten Sie die folgende Fehlermeldung: „failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint“.
Um automatisch den richtigen Fingerabdruck zu konfigurieren, verwenden Sie eksctl oder die AWS-Managementkonsole, um den IAM-Identitätsanbieter zu erstellen. Weitere Möglichkeiten, einen Fingerabdruck zu erhalten, finden Sie unter Abrufen des Fingerabdrucks für einen OpenID Connect-Identitätsanbieter.
Überprüfen Sie für die AWS-Region China die Umgebungsvariable AWS\ _DEFAULT\ _REGION
Für einen IRSA-angewendeten Pod oder Daemonset, das in einem Cluster in der AWS-Region China bereitgestellt wird, legen Sie die Umgebungsvariable AWS_DEFAULT_REGION in der Pod-Spezifikation fest. Wenn Sie diese Variable nicht festlegen, wird für den Pod oder Daemonset möglicherweise die folgende Fehlermeldung angezeigt: “An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid.“
Um die Umgebungsvariable AWS_DEFAULT_REGION zu Ihrer Pod- oder Daemonset-Spezifikation hinzuzufügen, führen Sie einen Befehl aus, der dem folgenden Beispiel ähnelt:
apiVersion: apps/v1kind: Deployment metadata: name: my-app spec: template: metadata: labels: app: my-app spec: serviceAccountName: my-app containers: - name: my-app image: my-app:latest env: - name: AWS_DEFAULT_REGION value: "AWS_REGION" ...
Ähnliche Videos
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 7 Monaten
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 7 Monaten
- AWS OFFICIALAktualisiert vor 2 Jahren