Wie behebe ich Fehler bei einem OIDC-Anbieter und IRSA in Amazon EKS?
Letzte Aktualisierung: 15.11.2021
Meine Pods können die IAM-Rollenberechtigungen mit dem Amazon Elastic Kubernetes Service (Amazon EKS)-Kontotoken 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 Dienstkonto ü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
Auflösung
Prüfen Sie, ob Sie einen vorhandenen IAM-OIDC-Anbieter für Ihren Cluster haben
Wenn bereits ein Anbieter existiert, erhalten Sie einen Fehler.
Beispiel:
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
1. Prüfen Sie die OIDC-Anbieter-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
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
Beispielausgabe:
"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. Sehen Sie,Erstellen Sie einen IAM-OIDC-Anbieter für Ihren Cluster
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"
}
}
}
]
}
Mit der AWS CLI:
Um Vertrauensbeziehungen zu überprüfen, führen Sie den folgenden Befehl mit Ihrem Rollennamen 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.
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: 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.
Beispielausgabe:
NAME SECRETS AGE
default 1 28d
irsa 1 66m
Wenn Sie kein Dienstkonto haben, lesen Sie Konfigurieren von Dienstkonten für Pods (von der Kubernetes-Website).
Stellen Sie sicher, dass das Dienstkonto ü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.
Beispielausgabe:
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.
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-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.
Beispielbefehl:
$ kubectl rollout restart deploy nginx
Beispielausgabe:
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.
Beispielbefehl zum Löschen:
$ kubectl delete pod POD_NAME
Beispielbefehl zum Neuerstellen:
$ 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
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, 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, sehen Sie unter Abrufen des Fingerabdrucks für einen OpenID Connect Identity Provider.
Ü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"
...
War dieser Artikel hilfreich?
Benötigen Sie Hilfe zur Fakturierung oder technischen Support?