Wie behebe ich Fehler bei einem OIDC-Anbieter und IRSA in Amazon EKS?
Meine Pods können die AWS-Identity-and-Access-Management-Rollenberechtigungen (IAM) mit dem Amazon-Elastic-Kubernetes-Service-Kontotoken (Amazon EKS) nicht verwenden.
Kurzbeschreibung
Um Probleme mit dem OpenID Connect (OIDC)-Anbieter und den IAM-Rollen für Dienstkonten (IRSA) in Amazon EKS zu beheben, führen Sie die Schritte in einem der folgenden Abschnitte aus:
- Prüfen Sie, ob Sie einen vorhandenen IAM-OIDC-Anbieter für Ihren Cluster haben
- Prüfen Sie, ob Ihre IAM-Rolle über eine angehängte erforderliche IAM-Richtlinie mit erforderlichen Berechtigungen verfügt
- Stellen Sie sicher, dass die Vertrauensbeziehungen der IAM-Rolle korrekt eingestellt sind
- Prüfen Sie, ob Sie ein Dienstkonto erstellt haben
- Stellen Sie sicher, dass das Servicekonto über die richtigen IAM-Rollenanmerkungen verfügt
- Stellen Sie sicher, dass Sie den serviceAccountName in Ihrem Pod korrekt angegeben haben
- Überprüfen Sie die Umgebungsvariablen und Berechtigungen
- Stellen Sie sicher, dass die Anwendung ein unterstütztes AWS-SDK verwendet
- Prüfen Sie den Pod-Benutzer und die Gruppe
- Bauen Sie Pods nach
- Stellen Sie sicher, dass das Publikum richtig ist
- Stellen Sie sicher, dass Sie den richtigen Fingerabdruck konfiguriert haben
- Überprüfen Sie für die AWS-Region China die Umgebungsvariable AWS_DEFAULT_REGION
Lösung
Prüfen Sie, ob Sie einen vorhandenen IAM-OIDC-Anbieter für Ihren Cluster haben
Wenn bereits ein Anbieter existiert, erhalten Sie eine Fehlermeldung, die der folgenden Meldung ähnelt:
„WebIdentityErr: Fehler beim Abrufen der Anmeldeinformationen\nverursacht durch: InvalidIdentityToken: In Ihrem Konto wurde kein OpenIDConnect-Anbieter für https://oidc.eks.eu-west-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E\n\tstatus Code: 400 gefunden“
1. Prüfen Sie die OIDC-Anbieter-URL Ihres Clusters:
$ aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text
Ein Beispiel für eine Ausgabe finden Sie im Folgenden:
https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
2. Listen Sie die IAM-OIDC-Anbieter in Ihrem Konto auf. Ersetzen Sie EXAMPLED539D4633E53DE1B716D3041E (schließen Sie **< >**ein) durch den vom vorherigen Befehl zurückgegebenen Wert:
aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E
Ein Beispiel für eine Ausgabe finden Sie im Folgenden:
"Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
Wenn der vorhergehende 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.
Prüfen Sie, ob Ihre IAM-Rolle über eine angehängte erforderliche IAM-Richtlinie mit erforderlichen Berechtigungen verfügt
1. Öffnen Sie die IAM-Konsole.
2. Wählen Sie im Navigationsbereich Rollen aus.
3. Wählen Sie die Rolle aus, die Sie überprüfen möchten.
4. Überprüfen Sie auf der Registerkarte Berechtigungen, ob dieser Rolle die erforderliche Richtlinie beigefügt ist.
Stellen Sie sicher, dass die Vertrauensbeziehungen der IAM-Rolle korrekt eingestellt sind
Mit der AWS-Managementkonsole:
1. Öffnen Sie die IAM-Konsole.
2. Wählen Sie im Navigationsbereich Rollen aus.
3. Wählen Sie die Rolle aus, die Sie prüfen möchten.
4. Wählen Sie die Registerkarte Vertrauensbeziehungen, um zu überprüfen, ob 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 die Vertrauensbeziehungen zu überprüfen, führen Sie den folgenden Befehl mit Ihrem Rollennamen 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 im Ausgabe-JSON nach dem Abschnitt AssumeRolePolicyDocument.
Ein Beispiel für eine Ausgabe finden Sie im Folgenden:
{ "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: Stellen Sie sicher, dass Sie die richtige AWS-Region, den Namen des Kubernetes-Servicekontos und den richtigen Kubernetes-Namespace angegeben haben.
Prüfen Sie, ob Sie ein Dienstkonto erstellt haben
Verwenden Sie den folgenden Befehl:
$ kubectl get sa -n YOUR_NAMESPACE
Hinweis: Ersetzen Sie YOUR_NAMESPACE durch Ihren Kubernetes-Namespace.
Ein Beispiel für eine Ausgabe finden Sie im Folgenden:
NAME SECRETS AGE default 1 28d irsa 1 66m
Wenn Sie kein Servicekonto haben, lesen Sie Konfigurieren von Servicekonten für Pods (von der Kubernetes-Website).
Stellen Sie sicher, dass das Servicekonto über die richtigen IAM-Rollenanmerkungen verfügt
Verwenden Sie den folgenden Befehl:
$ kubectl describe sa irsa -n YOUR_NAMESPACE
Hinweis: Ersetzen Sie irsa durch Ihren Kubernetes-Dienstkontonamen. Ersetzen Sie YOUR_NAMESPACE durch Ihren Kubernetes-Namespace.
Ein Beispiel für eine Ausgabe finden Sie im Folgenden:
Name: irsa Namespace: 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
Verwenden Sie den folgenden Befehl:
$ 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.
Ein Beispiel für eine Ausgabe finden Sie im Folgenden:
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
Ein Beispiel für eine Ausgabe finden Sie im Folgenden:
AWS_REGION=ap-southeast-2 AWS_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.11 Java — 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 sehen Sie unter Verwenden eines unterstützten AWS-SDK.
Prüfen Sie den Pod-Benutzer und die Gruppe
Verwenden Sie den folgenden Befehl:
$ kubectl exec -it POD_NAME -- id uid=0(root) gid=0(root) groups=0(root)
Hinweis: Standardmäßig verfügen nur Container, die als root ausgeführt werden, über die richtigen Dateisystemberechtigungen zum Lesen der Webidentitätstokendatei.
Wenn Ihre Container nicht als root ausgeführt werden, können Sie die folgenden Fehler erhalten:
Error: PermissionError: [Errno 13] Permission denied: '/var/run/secrets/eks.amazonaws.com/serviceaccount/token
-oder-
WebIdentityErr: failed fetching WebIdentity token: \ncaused by: WebIdentityErr: unable to read file at /var/run/secrets/eks.amazonaws.com/serviceaccount/token\ncaused by: open /var/run/secrets/eks.amazonaws.com/serviceaccount/token: permission denied
Um die richtigen Dateisystemberechtigungen bereitzustellen, stellen Sie sicher, dass Ihre Container als root ausgeführt werden. Stellen Sie für Cluster 1.18 oder niedriger den folgenden Sicherheitskontext für die Container in Ihrem Manifest bereit:
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: template: metadata: labels: app: my-app spec: serviceAccountName: my-app containers: - name: my-app image: my-app:latest securityContext: fsGroup: 1337 ...
Hinweis: Die fsGroup-ID ist frei wählbar. Sie können eine beliebige gültige Gruppen-ID auswählen. Die vorhergehende Sicherheitskontext-Einstellung ist für Cluster 1.19 oder höher nicht erforderlich.
Bauen Sie Pods nach
Wenn Sie Pods erstellt haben, bevor Sie IRSA angewendet haben, erstellen Sie die Pods neu.
Ein Beispiel für einen Befehl finden Sie im Folgenden:
$ kubectl rollout restart deploy nginx
Ein Beispiel für eine Ausgabe finden Sie im Folgenden:
deployment.apps/nginx restarted
Für daemonsets- oder statefulsets-Bereitstellungen können Sie den folgenden Befehl verwenden:
$ kubectl rollout restart deploy DEPLOYMENT_NAME
Wenn Sie nur einen Pod erstellt haben, müssen Sie den Pod löschen und neu erstellen.
Sehen Sie sich den folgenden Beispielbefehl zum Löschen des Pods an:
$ kubectl delete pod POD_NAME
Sehen Sie sich den folgenden Beispielbefehl an, um den Pod neu zu erstellen:
$ kubectl apply -f SPEC_FILE
Hinweis: Ersetzen Sie SPEC_FILE durch den Pfad und den Namen Ihrer Kubernetes-Manifestdatei.
Stellen Sie sicher, dass das Publikum richtig ist
Wenn Sie den OIDC-Anbieter mit der falschen Zielgruppe erstellt haben, wird der folgende Fehler angezeigt:
Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience
Prüfen Sie den IAM-Identitä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
Ein Beispiel für eine Ausgabe finden Sie im Folgenden:
{ "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, kann der folgende Fehler angezeigt werden:
failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint
Um den richtigen Fingerabdruck automatisch 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
Wenn Sie IRSA für einen Pod oder Daemonset verwenden, der in einem Cluster in der AWS-Region China bereitgestellt wird, legen Sie die Umgebungsvariable AWS_DEFAULT_REGION in der Pod-Spezifikation fest. Wenn Sie dies nicht tun, kann der Pod oder Daemonset den folgenden Fehler erhalten:
An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid
Verwenden Sie das folgende Beispiel, um die Umgebungsvariable AWS_DEFAULT_REGION zu Ihrer Pod- oder Daemonset-Spezifikation hinzuzufügen:
apiVersion: apps/v1 kind: 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 einem Jahr
- AWS OFFICIALAktualisiert vor 3 Monaten
- AWS OFFICIALAktualisiert vor einem Jahr
- AWS OFFICIALAktualisiert vor einem Jahr